/*BOXES*/
html body.tc-body .bluebox {display:block;background-color:#eef;padding:5px;padding-left:20px;padding-top:10px;margin-top:5px;margin-bottom:5px;width:95%;color:#000;}
html body.tc-body .graybox {display:block;background-color:#eee;padding:5px;padding-left:20px;padding-top:10px;margin-top:5px;margin-bottom:5px;width:95%;color:#000;}
body p {<<colour foreground>>;}
code {color: #b0a;background-color:#eee;}
/*TIGHT NOTES*/
html body.tc-body h1, html body.tc-body h2, html body.tc-body h3, html body.tc-body h4 { margin-top: 0.3em; margin-bottom: 0.3em; }
/*FONT SUBTITLES*/
.serif {font-family: 'Arial', sans-serif; color: <<colour tiddler-editor-border>>font-size:10pt;}
html body.tc-body .serif a.tc-tiddlylink-external {font-family: 'Arial', sans-serif;font-size:12pt; line-height:normal;font-weight:normal;color:#666;}
/*FONT STUFF (colors)*/
html body.tc-body .lightgraybk {background:#eee;padding:1px 4px px 4px;margin-bottom:2px;font-family:'Arial', sans-serif;}
.red {color:red;}
html body.tc-body .blue a {color:blue;}
/*FONT STUFF SOURCES*/
html body.tc-body .source {color:#777;font-size:10pt;}
/*ICON COLORS*/
html body.tc-body .tc-image-edit-button {stroke: white;fill:#555;}
html body.tc-body .tc-image-chevron-up {stroke: white;fill:#ccc;}
html body.tc-body .tc-image-chevron-down {stroke: white;fill:#ccc;}
html body.tc-body .tc-image-fold-button {stroke: white;fill:#ccc;}
html body.tc-body .tc-image-close-button {stroke: white;fill:#555;}
html body.tc-body .tc-image-unfold-button {stroke: white;fill:#ccc;}
html body.tc-body .tc-image-preview-open {stroke: white;fill:#f29;font-size:150%;}
html body.tc-body .tc-image-delete-button {stroke: white;fill:#ff2222;}
html body.tc-body .tc-image-cancel-button {stroke: white;fill:#ffdd55;}
html body.tc-body .tc-image-done-button {stroke: white;fill:#094;}
/*INDENTING*/
html body.tc-body .indent1 {margin-left:1.5em;display:block;}
/*LINKS*/
html body.tc-body a.tc-tiddlylink {text-decoration: none;font-style: normal;font-weight: normal;}
html body.tc-body a.tc-tiddlylink-external {text-decoration: none;font-weight: normal;}
html body.tc-body a.tc-tiddlylink-visited {text-decoration: none;font-weight: normal;}
html body.tc-body .source a.tc-tiddlylink-external {font-weight: normal;font-size:10pt;}
/*LISTS BASIC*/
html body.tc-body ul li {color: <<colour foreground>>;}
html body.tc-body ol li {color:<<colour foreground>>;}
/*TIDDLER TITLES*/
.tc-tiddler-missing .tc-title { font-style: normal; font-weight: bold; }
/*VIEWTEMPLATE FONT SIZE*/
html body.tc-body .viewtemplatebigtext {font-size:110%;}
/*HIDE SECTIONS FOR PRINTING*/
@media print {#tc-page-background {display: none ! important;}}
@media print {.tc-tags-wrapper {display: none ! important;}}
@media print { body.tc-body {background-color: transparent;}}
@media print {.tc-image-chevron-up {display: none ! important;}}
@media print {.tc-image-chevron-down {display: none ! important;}}
@media print {button.sidebar-toggle {display: none ! important;}}
@media print {.hideprint {display: none ! important;}}
@media print {.tc-btn-invisible {display: none ! important;}}
@media print {
.story-river {
margin: 0;
padding: 0;
}
html body.tc-body .tc-tiddler-frame {
margin: 0;
border-bottom: 1px solid #fff;
padding: 5px;}
html body.tc-body a.tc-tiddlylink-external:hover {
border: 1px solid <<colour tiddler-border>>;
}
html body.tc-body .tc-tiddler-info {
padding: 14px 42px 14px 42px;
background-color: <<colour tiddler-info-background>>;}
}
}
<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText="">
<$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>""">
<$reveal type="nomatch" state=<<journalTitle>> text="">
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags="" text={{{ [<journalTitle>get[]] }}}/>
</$reveal>
<$reveal type="match" state=<<journalTitle>> text="">
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags="" text=<<journalText>>/>
</$reveal>
</$wikify>
</$vars>
<$button class="tc-btn-invisible" popup="$:/SamplePopupState">{{$:/core/images/chevron-down}}</$button>
<$reveal type="popup" state="$:/SamplePopupState" class="tc-tiddler-body tc-drop-down tc-popup-keep">
<$checkbox tiddler="$:/core/ui/EditTemplate/title" tag="$:/tags/EditTemplate"> title</$checkbox><br>
<$checkbox tiddler="$:/core/ui/EditTemplate/tags" tag="$:/tags/EditTemplate"> tags</$checkbox><br>
<$checkbox tiddler="$:/core/ui/EditTemplate/type" tag="$:/tags/EditTemplate"> type</$checkbox><br>
<$checkbox tiddler="$:/core/ui/EditTemplate/fields" tag="$:/tags/EditTemplate"> fields</$checkbox><br>
<$checkbox tiddler="$:/config/TextEditor/EnableToolbar" field="text" checked="yes" unchecked="no" default="no"> toolbar</$checkbox><br>
<$checkbox tiddler="$:/.giffmex/EditTemplate/custom" tag="$:/tags/EditTemplate"> custom</$checkbox>
''Open / close the sidebar:'' <$list filter="[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]" variable="ignore"><$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-right}}</$button>
</$list><$list filter="[[$:/state/sidebar]get[text]] +[else[yes]match[no]]" variable="ignore">
<$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-left}}</$button>
</$list>
''Click the link below to edit the''<br> [[Custom area|$:/.giffmex/EditTemplate/custom]]
{{$:/core/ui/EditorToolbar/editor-height-dropdown}}
</$reveal>
"""
This is where you can add your own items you want visible in the edit template. For example:
Grab symbol code: e.g., ♦ `♦` ★ `★`
Grab snippets: e.g., `tiddlywiki --rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html static text/plain --rendertiddler $:/core/templates/static.template.css static/static.css text/plain`
"""
<br>
\define tagreset2()
<$list filter="[tag[titleview]sort[created]] -[[$(currentTiddler)$]]" variable="removeme">
<$action-listops $tiddler=<<removeme>> $tags="+[remove[$:/tags/ViewTemplate]]"/>
</$list>
<$action-deletefield dummy/>
\end
\define switchStoryView(storyview,default)
<$select tiddler='$storyview$' default='$default$'>
<option value="zoomin"><$text text='one tiddler only'/></option>
<option value="classic"><$text text='multiple tiddlers'/></option>
</$select>
\end
''Choose how to view titles:''
<$list filter="[tag[titleview]sort[caption]]">
<$list filter="[all[current]tag[$:/tags/ViewTemplate]]">
<$checkbox field=dummy checked="yes" unchecked="yes" default="yes"></$checkbox>
<$view field="caption"/><br/>
</$list>
<$list filter="[all[current]!tag[$:/tags/ViewTemplate]]">
<$checkbox tag="$:/tags/ViewTemplate" xinvertTag="yes" checkactions=<<tagreset2>>/> <$view field="caption"/><br/>
</$list>
</$list>
<br>
''Choose how to view tiddlers in each column''
Left column: <<switchStoryView $:/view zoomin>>
Right column: <<switchStoryView $:/_sq/Stories/config/Story2-storyview classic>>
\define tagreset()
<$list filter="[tag[refs]sort[created]] -[[$(currentTiddler)$]]" variable="removeme">
<$action-listops $tiddler=<<removeme>> $tags="+[remove[$:/tags/ViewTemplate]]"/>
</$list>
<$action-deletefield dummy/>
\end
''Choose how to view references:''
<$list filter="[tag[refs]sort[caption]]">
<$list filter="[all[current]tag[$:/tags/ViewTemplate]]">
<$checkbox field=dummy checked="yes" unchecked="yes" default="yes"></$checkbox>
<$view field="caption"/><br/>
</$list>
<$list filter="[all[current]!tag[$:/tags/ViewTemplate]]">
<$checkbox tag="$:/tags/ViewTemplate" xinvertTag="yes" checkactions=<<tagreset>>/> <$view field="caption"/><br/>
</$list>
</$list>
{{Hint for Muffin tutorial}}
<br>Note that the gray boxes in the context and transclude options are links to their respective tiddlers.
{
"Hint for Muffin tutorial": "hide",
"Muffin 1": "hide",
"Muffin 2": "hide",
"Graphical Integrity": "show",
"Graphical Sophistication": "show",
"Week 1 - Sequences, Time Series and Prediction": "show",
"Creative Confidence - 01 - The heart of Innovation": "hide",
"Creative Confidence - 02 - Flip": "hide",
"Creative Confidence - 03 - Dare": "hide",
"EfficientNet": "hide",
"Three scaling Dimensions of a CNN": "hide",
"VGG16": "hide",
"First known bar chart": "hide",
"MapReduce": "show",
"Presentation Design": "hide",
"2020-11-03 Stock Entry": "show",
"Saurabh Mukherjea's top picks for next decade (as of Aug'20)": "hide",
"Essentialism - Chapter 1": "hide",
"Essentialism - Chapter 2": "hide",
"Blogs on Machine Learning": "hide",
"Conferences for AI/ML/DL": "hide",
"Courses for AI/ML/DL": "hide",
"Books for AI/ML/DL": "show",
"Detecting and Interpreting Variable Interactions in Observational Ornithology Data": "hide",
"Visualizing Interaction Effects": "hide",
"Tell me about yourself": "hide",
"00 Introduction": "hide",
"01 My Call to Adventure: 1949–1967": "hide",
"02 Crossing the Threshold: 1967–1979": "hide",
"04 Structural Pivots Method (SPM) - Small Pivots": "show",
"C3W204: Applications of RNNs": "hide",
"Giving Feedback to Someone Who Hasn’t Had It in Years": "show",
"authors.ai": "show",
"ChatGPT": "show",
"cleanup.pictures": "show",
"Clipdrop": "show",
"copy.ai": "show",
"cutout.pro": "show",
"DeepStory": "show",
"donotpay.com": "show",
"durable.co": "show",
"Jasper.ai/art": "show",
"kartiv.com": "show",
"Lovo.ai": "show",
"MagicStudio": "show",
"otter.ai": "show",
"repurpose.io": "show",
"rytr.me": "show",
"synthesia.io": "show",
"texttohandwriting.com": "show",
"VoiceMod": "show",
"WEEK103: Generative Models": "show",
"WEEK104: Real Life GANs": "show",
"WEEK105: Intuition Behind GANs": "show",
"WEEK106: Discriminator": "show",
"WEEK107: Generator": "show",
"WEEK108: Binary Cross Entropy Loss Function": "show",
"WEEK109: Putting it all together": "show"
}
\define save-tiddler-actions()
<$action-sendmessage $message="tm-add-tag" $param={{{ [<newTagNameTiddler>get[text]] }}}/>
<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>
<$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>
<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>
<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>
<$action-sendmessage $message="tm-save-tiddler"/>
<$list filter="[all[current]links[]is[missing]]"><$action-createtiddler $basetitle=<<currentTiddler>>/></$list>
\end
<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>
<$fieldmangler>
<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify "$:/temp/NewTagName">> newFieldNameTiddler=<<qualify "$:/temp/NewFieldName">> newFieldValueTiddler=<<qualify "$:/temp/NewFieldValue">>>
<$keyboard key="((cancel-edit-tiddler))" message="tm-cancel-tiddler">
<$keyboard key="((save-tiddler))" actions=<<save-tiddler-actions>>>
<$list filter="[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]" variable="listItem">
<$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]">
<$transclude tiddler=<<listItem>>/>
</$set>
</$list>
</$keyboard>
</$keyboard>
</$vars>
</$fieldmangler>
</div>
<span class="viewtemplatebigtext">
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<hr>
<$vars searchme=<<currentTiddler>> searchspx={{{ [<currentTiddler>escaperegexp[]]}}} >
<$list filter="[!is[system]all[current]backlinks[]!tag[outlines]!tag[hide]sort[title]] -[is[current]]"><$link><$view field="title"/></$link><span class="indent1"><$link><span class="graybox"><$context term=<<searchme>> /></span></$link></span></$list>
</$vars>
</$reveal>
</span>
<span class="viewtemplatebigtext">
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<hr>
<$vars searchme=<<currentTiddler>> searchspx={{{ [<currentTiddler>escaperegexp[]]}}} >
<$list filter="[!is[system]all[current]backlinks[]!tag[hide]sort[title]] -[is[current]]"><$link><$view field="title" /></$link><br></$list>
</$vars>
</$reveal>
</span>
<span class="viewtemplatebigtext">
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<hr>
<$list filter="[!is[system]all[current]backlinks[]!tag[hide]!tag[outlines]sort[title]] -[is[current]]"><$link><$view field="title"/></$link><span class="indent1"><$link><span class="graybox"><$transclude field="text" mode="block" /></span></$link></span></$list>
</$reveal>
</span>
<span class="viewtemplatebigtext">
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<hr>
<$list filter="[!is[system]all[current]backlinks[]!tag[hide]!tag[outlines]sort[title]] -[is[current]]"><$link><$view field="title"/></$link>
<$reveal type="nomatch" stateTitle="$:/.giffmex/TiddlyBlinkFoldData" stateIndex=<<currentTiddler>> text="show">
<$button class=<<tv-config-toolbar-class>> setTitle="$:/.giffmex/TiddlyBlinkFoldData" setIndex=<<currentTiddler>> setTo="show">{{$:/core/images/unfold-button}}</$button><br/>
</$reveal>
<$reveal type="match" stateTitle="$:/.giffmex/TiddlyBlinkFoldData" stateIndex=<<currentTiddler>> text="show">
<$button class=<<tv-config-toolbar-class>> setTitle="$:/.giffmex/TiddlyBlinkFoldData" setIndex=<<currentTiddler>> setTo="hide">{{$:/core/images/fold-button}}</$button>
<span class="indent1">
<$link><span class="graybox">
<$transclude field="text" mode="block" /></span></$link></span>
</$reveal>
</$list>
</$reveal>
</span>
\define title-styles()
fill:$(foregroundColor)$;
\end
\define config-title()
$:/config/ViewToolbarButtons/Visibility/$(listItem)$
\end
<div class="tc-tiddler-title">
<div class="tc-titlebar">
<span class="tc-tiddler-controls">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]" variable="listItem"><$reveal type="nomatch" state=<<config-title>> text="hide"><$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>
</span>
<$set name="tv-wikilinks" value={{$:/config/Tiddlers/TitleLinks}}>
<$link>
<$set name="foregroundColor" value={{!!color}}>
<span class="tc-tiddler-title-icon" style=<<title-styles>>>
<$transclude tiddler={{!!icon}}/>
</span>
</$set>
<$list filter="[all[current]removeprefix[$:/]]">
<h2 class="tc-title" title={{$:/language/SystemTiddler/Tooltip}}>
<span class="tc-system-title-prefix">$:/</span><$text text=<<currentTiddler>>/>
</h2>
</$list>
<br><$list filter="[all[current]!prefix[$:/]]">
<h2 class="tc-title">
<$view field="title"/>
</h2>
</$list>
</$link>
</$set>
</div>
<$reveal type="nomatch" text="" default="" state=<<tiddlerInfoState>> class="tc-tiddler-info tc-popup-handle" animate="yes" retain="yes">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]" variable="listItem"><$transclude tiddler=<<listItem>> mode="block"/></$list>
</$reveal>
</div>
\define button()
<$button tooltip={{$:/language/Buttons/NewHere/Hint}} class=<<tv-config-toolbar-class>> actions=<<actions>>>
{{$:/core/images/new-button}}
</$button>
\end
\define actions()
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> text="""[[$(tid)$]]"""/>
\end
<$wikify name=tid text=<<currentTiddler>>>
<<button>>
</$wikify>
\whitespace trim
\define journalButtonActions()
<$action-sendmessage $message="tm-new-tiddler" title=<<now """$(journalTitleTemplate)$""">> text="""[[$(tid)$]]""" />
\end
\define journalButtonTags()
[[$(currentTiddlerTag)$]] $(journalTags)$
\end
\define journalButton()
<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}}
aria-label={{$:/language/Buttons/NewJournalHere/Caption}}
class=<<tv-config-toolbar-class>>
actions=<<journalButtonActions>>>
<$list filter="[<tv-config-toolbar-icons>match[yes]]">
{{$:/core/images/new-journal-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>match[yes]]">
<span class="tc-btn-text">
<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>
</span>
</$list>
</$button>
\end
<$set name="journalTitleTemplate" value={{$:/config/NewJournal/Title}}>
<$set name="tid" value=<<currentTiddler>>>
<<journalButton>>
</$set>
</$set>
Built from branch 'tiddlywiki-com' at commit 1a6be5ae09de1289727e9a981560d295cf8f361a of https://github.com/Jermolene/TiddlyWiki5.git at 2020-04-15 15:19:44 UTC
$:/.giffmex/ui/EditTemplate
{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/add-comment": {
"title": "$:/core/images/add-comment",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
},
"$:/core/images/auto-height": {
"title": "$:/core/images/auto-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
},
"$:/core/images/bold": {
"title": "$:/core/images/bold",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
},
"$:/core/images/copy-clipboard": {
"title": "$:/core/images/copy-clipboard",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
},
"$:/core/images/erase": {
"title": "$:/core/images/erase",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
},
"$:/core/images/excise": {
"title": "$:/core/images/excise",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
},
"$:/core/images/file": {
"title": "$:/core/images/file",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
},
"$:/core/images/fixed-height": {
"title": "$:/core/images/fixed-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/fold-all-button": {
"title": "$:/core/images/fold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
},
"$:/core/images/fold-button": {
"title": "$:/core/images/fold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
},
"$:/core/images/fold-others-button": {
"title": "$:/core/images/fold-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/folder": {
"title": "$:/core/images/folder",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
},
"$:/core/images/github": {
"title": "$:/core/images/github",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
},
"$:/core/images/gitter": {
"title": "$:/core/images/gitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
},
"$:/core/images/heading-1": {
"title": "$:/core/images/heading-1",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
},
"$:/core/images/heading-2": {
"title": "$:/core/images/heading-2",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
},
"$:/core/images/heading-3": {
"title": "$:/core/images/heading-3",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
},
"$:/core/images/heading-4": {
"title": "$:/core/images/heading-4",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
},
"$:/core/images/heading-5": {
"title": "$:/core/images/heading-5",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
},
"$:/core/images/heading-6": {
"title": "$:/core/images/heading-6",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
},
"$:/core/images/help": {
"title": "$:/core/images/help",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
},
"$:/core/images/italic": {
"title": "$:/core/images/italic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
},
"$:/core/images/left-arrow": {
"title": "$:/core/images/left-arrow",
"created": "20150315234410875",
"modified": "20150315235324760",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
},
"$:/core/images/line-width": {
"title": "$:/core/images/line-width",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
},
"$:/core/images/link": {
"title": "$:/core/images/link",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
},
"$:/core/images/linkify": {
"title": "$:/core/images/linkify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
},
"$:/core/images/list-bullet": {
"title": "$:/core/images/list-bullet",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
},
"$:/core/images/list-number": {
"title": "$:/core/images/list-number",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
},
"$:/core/images/list": {
"title": "$:/core/images/list",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/mail": {
"title": "$:/core/images/mail",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
},
"$:/core/images/mono-block": {
"title": "$:/core/images/mono-block",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
},
"$:/core/images/mono-line": {
"title": "$:/core/images/mono-line",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
},
"$:/core/images/new-image-button": {
"title": "$:/core/images/new-image-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
},
"$:/core/images/opacity": {
"title": "$:/core/images/opacity",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
},
"$:/core/images/open-window": {
"title": "$:/core/images/open-window",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
},
"$:/core/images/paint": {
"title": "$:/core/images/paint",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
},
"$:/core/images/palette": {
"title": "$:/core/images/palette",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
},
"$:/core/images/picture": {
"title": "$:/core/images/picture",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
},
"$:/core/images/preview-closed": {
"title": "$:/core/images/preview-closed",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
},
"$:/core/images/preview-open": {
"title": "$:/core/images/preview-open",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
},
"$:/core/images/print-button": {
"title": "$:/core/images/print-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
},
"$:/core/images/quote": {
"title": "$:/core/images/quote",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
},
"$:/core/images/rotate-left": {
"title": "$:/core/images/rotate-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
},
"$:/core/images/size": {
"title": "$:/core/images/size",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
},
"$:/core/images/spiral": {
"title": "$:/core/images/spiral",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
},
"$:/core/images/stamp": {
"title": "$:/core/images/stamp",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
},
"$:/core/images/strikethrough": {
"title": "$:/core/images/strikethrough",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
},
"$:/core/images/subscript": {
"title": "$:/core/images/subscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/superscript": {
"title": "$:/core/images/superscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
},
"$:/core/images/timestamp-off": {
"title": "$:/core/images/timestamp-off",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
},
"$:/core/images/timestamp-on": {
"title": "$:/core/images/timestamp-on",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
},
"$:/core/images/tip": {
"title": "$:/core/images/tip",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
},
"$:/core/images/transcludify": {
"title": "$:/core/images/transcludify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
},
"$:/core/images/twitter": {
"title": "$:/core/images/twitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
},
"$:/core/images/underline": {
"title": "$:/core/images/underline",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
},
"$:/core/images/unfold-all-button": {
"title": "$:/core/images/unfold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unfold-button": {
"title": "$:/core/images/unfold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/up-arrow": {
"title": "$:/core/images/up-arrow",
"created": "20150316000544368",
"modified": "20150316000831867",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
},
"$:/core/images/warning": {
"title": "$:/core/images/warning",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/CopyToClipboard/Caption": {
"title": "$:/language/Buttons/CopyToClipboard/Caption",
"text": "copy to clipboard"
},
"$:/language/Buttons/CopyToClipboard/Hint": {
"title": "$:/language/Buttons/CopyToClipboard/Hint",
"text": "Copy this text to the clipboard"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/SidebarSearch/Hint": {
"title": "$:/language/Buttons/SidebarSearch/Hint",
"text": "Select the sidebar search field"
},
"$:/language/Buttons/Fold/Caption": {
"title": "$:/language/Buttons/Fold/Caption",
"text": "fold tiddler"
},
"$:/language/Buttons/Fold/Hint": {
"title": "$:/language/Buttons/Fold/Hint",
"text": "Fold the body of this tiddler"
},
"$:/language/Buttons/Fold/FoldBar/Caption": {
"title": "$:/language/Buttons/Fold/FoldBar/Caption",
"text": "fold-bar"
},
"$:/language/Buttons/Fold/FoldBar/Hint": {
"title": "$:/language/Buttons/Fold/FoldBar/Hint",
"text": "Optional bars to fold and unfold tiddlers"
},
"$:/language/Buttons/Unfold/Caption": {
"title": "$:/language/Buttons/Unfold/Caption",
"text": "unfold tiddler"
},
"$:/language/Buttons/Unfold/Hint": {
"title": "$:/language/Buttons/Unfold/Hint",
"text": "Unfold the body of this tiddler"
},
"$:/language/Buttons/FoldOthers/Caption": {
"title": "$:/language/Buttons/FoldOthers/Caption",
"text": "fold other tiddlers"
},
"$:/language/Buttons/FoldOthers/Hint": {
"title": "$:/language/Buttons/FoldOthers/Hint",
"text": "Fold the bodies of other opened tiddlers"
},
"$:/language/Buttons/FoldAll/Caption": {
"title": "$:/language/Buttons/FoldAll/Caption",
"text": "fold all tiddlers"
},
"$:/language/Buttons/FoldAll/Hint": {
"title": "$:/language/Buttons/FoldAll/Hint",
"text": "Fold the bodies of all opened tiddlers"
},
"$:/language/Buttons/UnfoldAll/Caption": {
"title": "$:/language/Buttons/UnfoldAll/Caption",
"text": "unfold all tiddlers"
},
"$:/language/Buttons/UnfoldAll/Hint": {
"title": "$:/language/Buttons/UnfoldAll/Hint",
"text": "Unfold the bodies of all opened tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Help/Caption": {
"title": "$:/language/Buttons/Help/Caption",
"text": "help"
},
"$:/language/Buttons/Help/Hint": {
"title": "$:/language/Buttons/Help/Hint",
"text": "Show help panel"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import many types of file including text, image, TiddlyWiki or JSON"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/Manager/Caption": {
"title": "$:/language/Buttons/Manager/Caption",
"text": "tiddler manager"
},
"$:/language/Buttons/Manager/Hint": {
"title": "$:/language/Buttons/Manager/Hint",
"text": "Open tiddler manager"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewImage/Caption": {
"title": "$:/language/Buttons/NewImage/Caption",
"text": "new image"
},
"$:/language/Buttons/NewImage/Hint": {
"title": "$:/language/Buttons/NewImage/Hint",
"text": "Create a new image tiddler"
},
"$:/language/Buttons/NewMarkdown/Caption": {
"title": "$:/language/Buttons/NewMarkdown/Caption",
"text": "new Markdown tiddler"
},
"$:/language/Buttons/NewMarkdown/Hint": {
"title": "$:/language/Buttons/NewMarkdown/Hint",
"text": "Create a new Markdown tiddler"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/OpenWindow/Caption": {
"title": "$:/language/Buttons/OpenWindow/Caption",
"text": "open in new window"
},
"$:/language/Buttons/OpenWindow/Hint": {
"title": "$:/language/Buttons/OpenWindow/Hint",
"text": "Open tiddler in new window"
},
"$:/language/Buttons/Palette/Caption": {
"title": "$:/language/Buttons/Palette/Caption",
"text": "palette"
},
"$:/language/Buttons/Palette/Hint": {
"title": "$:/language/Buttons/Palette/Hint",
"text": "Choose the colour palette"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Print/Caption": {
"title": "$:/language/Buttons/Print/Caption",
"text": "print page"
},
"$:/language/Buttons/Print/Hint": {
"title": "$:/language/Buttons/Print/Hint",
"text": "Print the current page"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Confirm changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Timestamp/Caption": {
"title": "$:/language/Buttons/Timestamp/Caption",
"text": "timestamps"
},
"$:/language/Buttons/Timestamp/Hint": {
"title": "$:/language/Buttons/Timestamp/Hint",
"text": "Choose whether modifications update timestamps"
},
"$:/language/Buttons/Timestamp/On/Caption": {
"title": "$:/language/Buttons/Timestamp/On/Caption",
"text": "timestamps are on"
},
"$:/language/Buttons/Timestamp/On/Hint": {
"title": "$:/language/Buttons/Timestamp/On/Hint",
"text": "Update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Timestamp/Off/Caption": {
"title": "$:/language/Buttons/Timestamp/Off/Caption",
"text": "timestamps are off"
},
"$:/language/Buttons/Timestamp/Off/Hint": {
"title": "$:/language/Buttons/Timestamp/Off/Hint",
"text": "Don't update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/Buttons/Bold/Caption": {
"title": "$:/language/Buttons/Bold/Caption",
"text": "bold"
},
"$:/language/Buttons/Bold/Hint": {
"title": "$:/language/Buttons/Bold/Hint",
"text": "Apply bold formatting to selection"
},
"$:/language/Buttons/Clear/Caption": {
"title": "$:/language/Buttons/Clear/Caption",
"text": "clear"
},
"$:/language/Buttons/Clear/Hint": {
"title": "$:/language/Buttons/Clear/Hint",
"text": "Clear image to solid colour"
},
"$:/language/Buttons/EditorHeight/Caption": {
"title": "$:/language/Buttons/EditorHeight/Caption",
"text": "editor height"
},
"$:/language/Buttons/EditorHeight/Caption/Auto": {
"title": "$:/language/Buttons/EditorHeight/Caption/Auto",
"text": "Automatically adjust height to fit content"
},
"$:/language/Buttons/EditorHeight/Caption/Fixed": {
"title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
"text": "Fixed height:"
},
"$:/language/Buttons/EditorHeight/Hint": {
"title": "$:/language/Buttons/EditorHeight/Hint",
"text": "Choose the height of the text editor"
},
"$:/language/Buttons/Excise/Caption": {
"title": "$:/language/Buttons/Excise/Caption",
"text": "excise"
},
"$:/language/Buttons/Excise/Caption/Excise": {
"title": "$:/language/Buttons/Excise/Caption/Excise",
"text": "Perform excision"
},
"$:/language/Buttons/Excise/Caption/MacroName": {
"title": "$:/language/Buttons/Excise/Caption/MacroName",
"text": "Macro name:"
},
"$:/language/Buttons/Excise/Caption/NewTitle": {
"title": "$:/language/Buttons/Excise/Caption/NewTitle",
"text": "Title of new tiddler:"
},
"$:/language/Buttons/Excise/Caption/Replace": {
"title": "$:/language/Buttons/Excise/Caption/Replace",
"text": "Replace excised text with:"
},
"$:/language/Buttons/Excise/Caption/Replace/Macro": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
"text": "macro"
},
"$:/language/Buttons/Excise/Caption/Replace/Link": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Link",
"text": "link"
},
"$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
"text": "transclusion"
},
"$:/language/Buttons/Excise/Caption/Tag": {
"title": "$:/language/Buttons/Excise/Caption/Tag",
"text": "Tag new tiddler with the title of this tiddler"
},
"$:/language/Buttons/Excise/Caption/TiddlerExists": {
"title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
"text": "Warning: tiddler already exists"
},
"$:/language/Buttons/Excise/Hint": {
"title": "$:/language/Buttons/Excise/Hint",
"text": "Excise the selected text into a new tiddler"
},
"$:/language/Buttons/Heading1/Caption": {
"title": "$:/language/Buttons/Heading1/Caption",
"text": "heading 1"
},
"$:/language/Buttons/Heading1/Hint": {
"title": "$:/language/Buttons/Heading1/Hint",
"text": "Apply heading level 1 formatting to lines containing selection"
},
"$:/language/Buttons/Heading2/Caption": {
"title": "$:/language/Buttons/Heading2/Caption",
"text": "heading 2"
},
"$:/language/Buttons/Heading2/Hint": {
"title": "$:/language/Buttons/Heading2/Hint",
"text": "Apply heading level 2 formatting to lines containing selection"
},
"$:/language/Buttons/Heading3/Caption": {
"title": "$:/language/Buttons/Heading3/Caption",
"text": "heading 3"
},
"$:/language/Buttons/Heading3/Hint": {
"title": "$:/language/Buttons/Heading3/Hint",
"text": "Apply heading level 3 formatting to lines containing selection"
},
"$:/language/Buttons/Heading4/Caption": {
"title": "$:/language/Buttons/Heading4/Caption",
"text": "heading 4"
},
"$:/language/Buttons/Heading4/Hint": {
"title": "$:/language/Buttons/Heading4/Hint",
"text": "Apply heading level 4 formatting to lines containing selection"
},
"$:/language/Buttons/Heading5/Caption": {
"title": "$:/language/Buttons/Heading5/Caption",
"text": "heading 5"
},
"$:/language/Buttons/Heading5/Hint": {
"title": "$:/language/Buttons/Heading5/Hint",
"text": "Apply heading level 5 formatting to lines containing selection"
},
"$:/language/Buttons/Heading6/Caption": {
"title": "$:/language/Buttons/Heading6/Caption",
"text": "heading 6"
},
"$:/language/Buttons/Heading6/Hint": {
"title": "$:/language/Buttons/Heading6/Hint",
"text": "Apply heading level 6 formatting to lines containing selection"
},
"$:/language/Buttons/Italic/Caption": {
"title": "$:/language/Buttons/Italic/Caption",
"text": "italic"
},
"$:/language/Buttons/Italic/Hint": {
"title": "$:/language/Buttons/Italic/Hint",
"text": "Apply italic formatting to selection"
},
"$:/language/Buttons/LineWidth/Caption": {
"title": "$:/language/Buttons/LineWidth/Caption",
"text": "line width"
},
"$:/language/Buttons/LineWidth/Hint": {
"title": "$:/language/Buttons/LineWidth/Hint",
"text": "Set line width for painting"
},
"$:/language/Buttons/Link/Caption": {
"title": "$:/language/Buttons/Link/Caption",
"text": "link"
},
"$:/language/Buttons/Link/Hint": {
"title": "$:/language/Buttons/Link/Hint",
"text": "Create wikitext link"
},
"$:/language/Buttons/Linkify/Caption": {
"title": "$:/language/Buttons/Linkify/Caption",
"text": "wikilink"
},
"$:/language/Buttons/Linkify/Hint": {
"title": "$:/language/Buttons/Linkify/Hint",
"text": "Wrap selection in square brackets"
},
"$:/language/Buttons/ListBullet/Caption": {
"title": "$:/language/Buttons/ListBullet/Caption",
"text": "bulleted list"
},
"$:/language/Buttons/ListBullet/Hint": {
"title": "$:/language/Buttons/ListBullet/Hint",
"text": "Apply bulleted list formatting to lines containing selection"
},
"$:/language/Buttons/ListNumber/Caption": {
"title": "$:/language/Buttons/ListNumber/Caption",
"text": "numbered list"
},
"$:/language/Buttons/ListNumber/Hint": {
"title": "$:/language/Buttons/ListNumber/Hint",
"text": "Apply numbered list formatting to lines containing selection"
},
"$:/language/Buttons/MonoBlock/Caption": {
"title": "$:/language/Buttons/MonoBlock/Caption",
"text": "monospaced block"
},
"$:/language/Buttons/MonoBlock/Hint": {
"title": "$:/language/Buttons/MonoBlock/Hint",
"text": "Apply monospaced block formatting to lines containing selection"
},
"$:/language/Buttons/MonoLine/Caption": {
"title": "$:/language/Buttons/MonoLine/Caption",
"text": "monospaced"
},
"$:/language/Buttons/MonoLine/Hint": {
"title": "$:/language/Buttons/MonoLine/Hint",
"text": "Apply monospaced character formatting to selection"
},
"$:/language/Buttons/Opacity/Caption": {
"title": "$:/language/Buttons/Opacity/Caption",
"text": "opacity"
},
"$:/language/Buttons/Opacity/Hint": {
"title": "$:/language/Buttons/Opacity/Hint",
"text": "Set painting opacity"
},
"$:/language/Buttons/Paint/Caption": {
"title": "$:/language/Buttons/Paint/Caption",
"text": "paint colour"
},
"$:/language/Buttons/Paint/Hint": {
"title": "$:/language/Buttons/Paint/Hint",
"text": "Set painting colour"
},
"$:/language/Buttons/Picture/Caption": {
"title": "$:/language/Buttons/Picture/Caption",
"text": "picture"
},
"$:/language/Buttons/Picture/Hint": {
"title": "$:/language/Buttons/Picture/Hint",
"text": "Insert picture"
},
"$:/language/Buttons/Preview/Caption": {
"title": "$:/language/Buttons/Preview/Caption",
"text": "preview"
},
"$:/language/Buttons/Preview/Hint": {
"title": "$:/language/Buttons/Preview/Hint",
"text": "Show preview pane"
},
"$:/language/Buttons/PreviewType/Caption": {
"title": "$:/language/Buttons/PreviewType/Caption",
"text": "preview type"
},
"$:/language/Buttons/PreviewType/Hint": {
"title": "$:/language/Buttons/PreviewType/Hint",
"text": "Choose preview type"
},
"$:/language/Buttons/Quote/Caption": {
"title": "$:/language/Buttons/Quote/Caption",
"text": "quote"
},
"$:/language/Buttons/Quote/Hint": {
"title": "$:/language/Buttons/Quote/Hint",
"text": "Apply quoted text formatting to lines containing selection"
},
"$:/language/Buttons/RotateLeft/Caption": {
"title": "$:/language/Buttons/RotateLeft/Caption",
"text": "rotate left"
},
"$:/language/Buttons/RotateLeft/Hint": {
"title": "$:/language/Buttons/RotateLeft/Hint",
"text": "Rotate image left by 90 degrees"
},
"$:/language/Buttons/Size/Caption": {
"title": "$:/language/Buttons/Size/Caption",
"text": "image size"
},
"$:/language/Buttons/Size/Caption/Height": {
"title": "$:/language/Buttons/Size/Caption/Height",
"text": "Height:"
},
"$:/language/Buttons/Size/Caption/Resize": {
"title": "$:/language/Buttons/Size/Caption/Resize",
"text": "Resize image"
},
"$:/language/Buttons/Size/Caption/Width": {
"title": "$:/language/Buttons/Size/Caption/Width",
"text": "Width:"
},
"$:/language/Buttons/Size/Hint": {
"title": "$:/language/Buttons/Size/Hint",
"text": "Set image size"
},
"$:/language/Buttons/Stamp/Caption": {
"title": "$:/language/Buttons/Stamp/Caption",
"text": "stamp"
},
"$:/language/Buttons/Stamp/Caption/New": {
"title": "$:/language/Buttons/Stamp/Caption/New",
"text": "Add your own"
},
"$:/language/Buttons/Stamp/Hint": {
"title": "$:/language/Buttons/Stamp/Hint",
"text": "Insert a preconfigured snippet of text"
},
"$:/language/Buttons/Stamp/New/Title": {
"title": "$:/language/Buttons/Stamp/New/Title",
"text": "Name as shown in menu"
},
"$:/language/Buttons/Stamp/New/Text": {
"title": "$:/language/Buttons/Stamp/New/Text",
"text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
},
"$:/language/Buttons/Strikethrough/Caption": {
"title": "$:/language/Buttons/Strikethrough/Caption",
"text": "strikethrough"
},
"$:/language/Buttons/Strikethrough/Hint": {
"title": "$:/language/Buttons/Strikethrough/Hint",
"text": "Apply strikethrough formatting to selection"
},
"$:/language/Buttons/Subscript/Caption": {
"title": "$:/language/Buttons/Subscript/Caption",
"text": "subscript"
},
"$:/language/Buttons/Subscript/Hint": {
"title": "$:/language/Buttons/Subscript/Hint",
"text": "Apply subscript formatting to selection"
},
"$:/language/Buttons/Superscript/Caption": {
"title": "$:/language/Buttons/Superscript/Caption",
"text": "superscript"
},
"$:/language/Buttons/Superscript/Hint": {
"title": "$:/language/Buttons/Superscript/Hint",
"text": "Apply superscript formatting to selection"
},
"$:/language/Buttons/ToggleSidebar/Hint": {
"title": "$:/language/Buttons/ToggleSidebar/Hint",
"text": "Toggle the sidebar visibility"
},
"$:/language/Buttons/Transcludify/Caption": {
"title": "$:/language/Buttons/Transcludify/Caption",
"text": "transclusion"
},
"$:/language/Buttons/Transcludify/Hint": {
"title": "$:/language/Buttons/Transcludify/Hint",
"text": "Wrap selection in curly brackets"
},
"$:/language/Buttons/Underline/Caption": {
"title": "$:/language/Buttons/Underline/Caption",
"text": "underline"
},
"$:/language/Buttons/Underline/Hint": {
"title": "$:/language/Buttons/Underline/Hint",
"text": "Apply underline formatting to selection"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration"
},
"$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
"title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
"text": "Default focus field for new tiddlers"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
"text": "Text for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
"text": "Title of new tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
"text": "Tags for new tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
"text": "Type shortcut here"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
"text": "add shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
"text": "Keyboard Shortcuts"
},
"$:/language/ControlPanel/KeyboardShortcuts/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
"text": "Manage keyboard shortcut assignments"
},
"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
"text": "No keyboard shortcuts assigned"
},
"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
"text": "remove keyboard shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
"text": "All platforms"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
"text": "Macintosh platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
"text": "Non-Macintosh platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
"text": "Linux platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
"text": "Non-Linux platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
"text": "Windows platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
"text": "Non-Windows platforms only"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
"title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
"text": "delete this entry from the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
"title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
"text": "Show color names that are not part of the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Parsing/Caption": {
"title": "$:/language/ControlPanel/Parsing/Caption",
"text": "Parsing"
},
"$:/language/ControlPanel/Parsing/Hint": {
"title": "$:/language/ControlPanel/Parsing/Hint",
"text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
},
"$:/language/ControlPanel/Parsing/Block/Caption": {
"title": "$:/language/ControlPanel/Parsing/Block/Caption",
"text": "Block Parse Rules"
},
"$:/language/ControlPanel/Parsing/Inline/Caption": {
"title": "$:/language/ControlPanel/Parsing/Inline/Caption",
"text": "Inline Parse Rules"
},
"$:/language/ControlPanel/Parsing/Pragma/Caption": {
"title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
"text": "Pragma Parse Rules"
},
"$:/language/ControlPanel/Plugins/Add/Caption": {
"title": "$:/language/ControlPanel/Plugins/Add/Caption",
"text": "Get more plugins"
},
"$:/language/ControlPanel/Plugins/Add/Hint": {
"title": "$:/language/ControlPanel/Plugins/Add/Hint",
"text": "Install plugins from the official library"
},
"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
"text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
},
"$:/language/ControlPanel/Plugins/AlsoRequires": {
"title": "$:/language/ControlPanel/Plugins/AlsoRequires",
"text": "Also requires:"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Downgrade/Caption": {
"title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
"text": "downgrade"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Install/Caption": {
"title": "$:/language/ControlPanel/Plugins/Install/Caption",
"text": "install"
},
"$:/language/ControlPanel/Plugins/Installed/Hint": {
"title": "$:/language/ControlPanel/Plugins/Installed/Hint",
"text": "Currently installed plugins:"
},
"$:/language/ControlPanel/Plugins/Languages/Caption": {
"title": "$:/language/ControlPanel/Plugins/Languages/Caption",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Languages/Hint": {
"title": "$:/language/ControlPanel/Plugins/Languages/Hint",
"text": "Language pack plugins"
},
"$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
"title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
"text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
},
"$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
"text": "This plugin is not currently installed"
},
"$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
"text": "open plugin library"
},
"$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
"text": "close plugin library"
},
"$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
"title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
"text": "(requires reload)"
},
"$:/language/ControlPanel/Plugins/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Plugins/Hint": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Reinstall/Caption": {
"title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
"text": "reinstall"
},
"$:/language/ControlPanel/Plugins/Themes/Caption": {
"title": "$:/language/ControlPanel/Plugins/Themes/Caption",
"text": "Themes"
},
"$:/language/ControlPanel/Plugins/Themes/Hint": {
"title": "$:/language/ControlPanel/Plugins/Themes/Hint",
"text": "Theme plugins"
},
"$:/language/ControlPanel/Plugins/Update/Caption": {
"title": "$:/language/ControlPanel/Plugins/Update/Caption",
"text": "update"
},
"$:/language/ControlPanel/Plugins/Updates/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/Caption",
"text": "Updates"
},
"$:/language/ControlPanel/Plugins/Updates/Hint": {
"title": "$:/language/ControlPanel/Plugins/Updates/Hint",
"text": "Available updates to installed plugins"
},
"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
"text": "Update <<update-count>> plugins"
},
"$:/language/ControlPanel/Plugins/SubPluginPrompt": {
"title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
"text": "With <<count>> sub-plugins available"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
"text": "Permit automatic saving for the download saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
"text": "Enable Autosave for Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
"text": "Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
"text": "These settings apply to the HTML5-compatible download saver"
},
"$:/language/ControlPanel/Saving/General/Caption": {
"title": "$:/language/ControlPanel/Saving/General/Caption",
"text": "General"
},
"$:/language/ControlPanel/Saving/General/Hint": {
"title": "$:/language/ControlPanel/Saving/General/Hint",
"text": "These settings apply to all the loaded savers"
},
"$:/language/ControlPanel/Saving/Hint": {
"title": "$:/language/ControlPanel/Saving/Hint",
"text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
},
"$:/language/ControlPanel/Saving/GitService/Branch": {
"title": "$:/language/ControlPanel/Saving/GitService/Branch",
"text": "Target branch for saving"
},
"$:/language/ControlPanel/Saving/GitService/CommitMessage": {
"title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
"text": "Saved by TiddlyWiki"
},
"$:/language/ControlPanel/Saving/GitService/Description": {
"title": "$:/language/ControlPanel/Saving/GitService/Description",
"text": "These settings are only used when saving to <<service-name>>"
},
"$:/language/ControlPanel/Saving/GitService/Filename": {
"title": "$:/language/ControlPanel/Saving/GitService/Filename",
"text": "Filename of target file (e.g. `index.html`)"
},
"$:/language/ControlPanel/Saving/GitService/Path": {
"title": "$:/language/ControlPanel/Saving/GitService/Path",
"text": "Path to target file (e.g. `/wiki/`)"
},
"$:/language/ControlPanel/Saving/GitService/Repo": {
"title": "$:/language/ControlPanel/Saving/GitService/Repo",
"text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
},
"$:/language/ControlPanel/Saving/GitService/ServerURL": {
"title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
"text": "Server API URL"
},
"$:/language/ControlPanel/Saving/GitService/UserName": {
"title": "$:/language/ControlPanel/Saving/GitService/UserName",
"text": "Username"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
"text": "~GitHub Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
"text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
"text": "~GitLab Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
"text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
"text": "Gitea Saver"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
"text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
"text": "~TiddlySpot Saver"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Attempt to automatically save changes during editing when using a supporting saver"
},
"$:/language/ControlPanel/Settings/CamelCase/Caption": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
"text": "Camel Case Wiki Links"
},
"$:/language/ControlPanel/Settings/CamelCase/Hint": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
"text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/CamelCase/Description": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Description",
"text": "Enable automatic ~CamelCase linking"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
"text": "Enable or disable the editor toolbar:"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Description": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
"text": "Show editor toolbar"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
"text": "Tiddler Info Panel Mode"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
"text": "Control when the tiddler info panel closes:"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
"text": "Tiddler info panel closes automatically"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
"text": "Tiddler info panel stays open until explicitly closed"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
"text": "Permalink/permaview Mode"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
"text": "Choose how permalink/permaview is handled:"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
"text": "Copy permalink/permaview URL to clipboard"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
"text": "Update address bar with permalink/permaview URL"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
"text": "Performance Instrumentation"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
"text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
"text": "Enable performance instrumentation"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
"text": "Toolbar Button Style"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
"text": "Choose the style for toolbar buttons:"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
"text": "Borderless"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
"text": "Boxed"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
"text": "Rounded"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
"text": "Default Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
"text": "Specify which sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
"text": "Default More Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
"text": "Specify which More sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
"text": "Tiddler Opening Behaviour"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
"text": "Navigation from //within// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
"text": "Navigation from //outside// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
"text": "Open above the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
"text": "Open below the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
"text": "Open at the top of the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
"text": "Open at the bottom of the story river"
},
"$:/language/ControlPanel/Settings/TitleLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
"text": "Tiddler Titles"
},
"$:/language/ControlPanel/Settings/TitleLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
"text": "Optionally display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
"text": "Do not display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
"text": "Display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
"text": "Wiki Links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
"text": "Choose whether to link to tiddlers that do not exist yet"
},
"$:/language/ControlPanel/Settings/MissingLinks/Description": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
"text": "Enable links to missing tiddlers"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Stylesheets/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Caption",
"text": "Stylesheets"
},
"$:/language/ControlPanel/Stylesheets/Expand/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
"text": "Expand All"
},
"$:/language/ControlPanel/Stylesheets/Hint": {
"title": "$:/language/ControlPanel/Stylesheets/Hint",
"text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
},
"$:/language/ControlPanel/Stylesheets/Restore/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
"text": "Restore"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
"text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/allfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/allfilteroperator",
"text": "A sub-operator for the ''all'' filter operator."
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/authenticator": {
"title": "$:/language/Docs/ModuleTypes/authenticator",
"text": "Defines how requests are authenticated by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
"title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
"text": "A bitmap editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/info": {
"title": "$:/language/Docs/ModuleTypes/info",
"text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/library": {
"title": "$:/language/Docs/ModuleTypes/library",
"text": "Generic module type for general purpose JavaScript modules."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/route": {
"title": "$:/language/Docs/ModuleTypes/route",
"text": "Defines how individual URL patterns are handled by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/texteditoroperation": {
"title": "$:/language/Docs/ModuleTypes/texteditoroperation",
"text": "A text editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/button-background": {
"title": "$:/language/Docs/PaletteColours/button-background",
"text": "Default button background"
},
"$:/language/Docs/PaletteColours/button-border": {
"title": "$:/language/Docs/PaletteColours/button-border",
"text": "Default button border"
},
"$:/language/Docs/PaletteColours/button-foreground": {
"title": "$:/language/Docs/PaletteColours/button-foreground",
"text": "Default button foreground"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/menubar-background": {
"title": "$:/language/Docs/PaletteColours/menubar-background",
"text": "Menu bar background"
},
"$:/language/Docs/PaletteColours/menubar-foreground": {
"title": "$:/language/Docs/PaletteColours/menubar-foreground",
"text": "Menu bar foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/select-tag-background": {
"title": "$:/language/Docs/PaletteColours/select-tag-background",
"text": "`<select>` element background"
},
"$:/language/Docs/PaletteColours/select-tag-foreground": {
"title": "$:/language/Docs/PaletteColours/select-tag-foreground",
"text": "`<select>` element text"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/site-title-foreground": {
"title": "$:/language/Docs/PaletteColours/site-title-foreground",
"text": "Site title foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Type/Output": {
"title": "$:/language/EditTemplate/Body/Preview/Type/Output",
"text": "output"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Field/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Field/Dropdown/Caption",
"text": "field list"
},
"$:/language/EditTemplate/Field/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Field/Dropdown/Hint",
"text": "Show field list"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
"text": "Add the new field to the tiddler"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/System": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
"text": "System fields"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/User": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
"text": "User fields"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
"text": "add tag"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Title/BadCharacterWarning": {
"title": "$:/language/EditTemplate/Title/BadCharacterWarning",
"text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
},
"$:/language/EditTemplate/Title/Exists/Prompt": {
"title": "$:/language/EditTemplate/Title/Exists/Prompt",
"text": "Target tiddler already exists"
},
"$:/language/EditTemplate/Title/Relink/Prompt": {
"title": "$:/language/EditTemplate/Title/Relink/Prompt",
"text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
},
"$:/language/EditTemplate/Title/References/Prompt": {
"title": "$:/language/EditTemplate/Title/References/Prompt",
"text": "The following references to this tiddler will not be automatically updated:"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "Static HTML"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "\".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hide-body": {
"title": "$:/language/Docs/Fields/hide-body",
"text": "The view template will hide bodies of tiddlers if set to: ''yes''"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/throttle.refresh": {
"title": "$:/language/Docs/Fields/throttle.refresh",
"text": "If present, throttles refreshes of this tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/toc-link": {
"title": "$:/language/Docs/Fields/toc-link",
"text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Docs/Fields/_is_skinny": {
"title": "$:/language/Docs/Fields/_is_skinny",
"text": "If present, indicates that the tiddler text field must be loaded from the server"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SessionTiddlers": {
"title": "$:/language/Filters/SessionTiddlers",
"text": "Tiddlers modified since the wiki was loaded"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"$:/language/Filters/StoryList": {
"title": "$:/language/Filters/StoryList",
"text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
},
"$:/language/Filters/TypedTiddlers": {
"title": "$:/language/Filters/TypedTiddlers",
"text": "Non wiki-text tiddlers"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/deletetiddlers": {
"title": "$:/language/Help/deletetiddlers",
"description": "Deletes a group of tiddlers",
"text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/fetch": {
"title": "$:/language/Help/fetch",
"description": "Fetch tiddlers from wiki by URL",
"text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/import": {
"title": "$:/language/Help/import",
"description": "Import tiddlers from a file",
"text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/listen": {
"title": "$:/language/Help/listen",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
},
"$:/language/Help/render": {
"title": "$:/language/Help/render",
"description": "Renders individual tiddlers to files",
"text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/save": {
"title": "$:/language/Help/save",
"description": "Saves individual raw tiddlers to files",
"text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/savewikifolder": {
"title": "$:/language/Help/savewikifolder",
"description": "Saves a wiki to a new wiki folder",
"text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
"text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Imported/Hint": {
"title": "$:/language/Import/Imported/Hint",
"text": "The following tiddlers were imported:"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Listing/Preview": {
"title": "$:/language/Import/Listing/Preview",
"text": "Preview:"
},
"$:/language/Import/Listing/Preview/Text": {
"title": "$:/language/Import/Listing/Preview/Text",
"text": "Text"
},
"$:/language/Import/Listing/Preview/TextRaw": {
"title": "$:/language/Import/Listing/Preview/TextRaw",
"text": "Text (Raw)"
},
"$:/language/Import/Listing/Preview/Fields": {
"title": "$:/language/Import/Listing/Preview/Fields",
"text": "Fields"
},
"$:/language/Import/Listing/Preview/Diff": {
"title": "$:/language/Import/Listing/Preview/Diff",
"text": "Diff"
},
"$:/language/Import/Listing/Preview/DiffFields": {
"title": "$:/language/Import/Listing/Preview/DiffFields",
"text": "Diff (Fields)"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/System/Warning": {
"title": "$:/language/Import/Upgrader/System/Warning",
"text": "Core module tiddler"
},
"$:/language/Import/Upgrader/System/Alert": {
"title": "$:/language/Import/Upgrader/System/Alert",
"text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/AboveStory/ClassicPlugin/Warning": {
"title": "$:/language/AboveStory/ClassicPlugin/Warning",
"text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ColourPicker/Recent": {
"title": "$:/language/ColourPicker/Recent",
"text": "Recent:"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/Count": {
"title": "$:/language/Count",
"text": "count"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/Diffs/CountMessage": {
"title": "$:/language/Diffs/CountMessage",
"text": "<<diff-count>> differences"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or use the 'Escape' key to cancel)"
},
"$:/language/Encryption/Cancel": {
"title": "$:/language/Encryption/Cancel",
"text": "Cancel"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/Encryption/Username": {
"title": "$:/language/Encryption/Username",
"text": "Username"
},
"$:/language/Encryption/Password": {
"title": "$:/language/Encryption/Password",
"text": "Password"
},
"$:/language/Encryption/RepeatPassword": {
"title": "$:/language/Encryption/RepeatPassword",
"text": "Repeat password"
},
"$:/language/Encryption/PasswordNoMatch": {
"title": "$:/language/Encryption/PasswordNoMatch",
"text": "Passwords do not match"
},
"$:/language/Encryption/SetPassword": {
"title": "$:/language/Encryption/SetPassword",
"text": "Set password"
},
"$:/language/Error/Caption": {
"title": "$:/language/Error/Caption",
"text": "Error"
},
"$:/language/Error/EditConflict": {
"title": "$:/language/Error/EditConflict",
"text": "File changed on server"
},
"$:/language/Error/Filter": {
"title": "$:/language/Error/Filter",
"text": "Filter error"
},
"$:/language/Error/FilterSyntax": {
"title": "$:/language/Error/FilterSyntax",
"text": "Syntax error in filter expression"
},
"$:/language/Error/IsFilterOperator": {
"title": "$:/language/Error/IsFilterOperator",
"text": "Filter Error: Unknown operand for the 'is' filter operator"
},
"$:/language/Error/LoadingPluginLibrary": {
"title": "$:/language/Error/LoadingPluginLibrary",
"text": "Error loading plugin library"
},
"$:/language/Error/NetworkErrorAlert": {
"title": "$:/language/Error/NetworkErrorAlert",
"text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
},
"$:/language/Error/RecursiveTransclusion": {
"title": "$:/language/Error/RecursiveTransclusion",
"text": "Recursive transclusion error in transclude widget"
},
"$:/language/Error/RetrievingSkinny": {
"title": "$:/language/Error/RetrievingSkinny",
"text": "Error retrieving skinny tiddler list"
},
"$:/language/Error/SavingToTWEdit": {
"title": "$:/language/Error/SavingToTWEdit",
"text": "Error saving to TWEdit"
},
"$:/language/Error/WhileSaving": {
"title": "$:/language/Error/WhileSaving",
"text": "Error while saving"
},
"$:/language/Error/XMLHttpRequest": {
"title": "$:/language/Error/XMLHttpRequest",
"text": "XMLHttpRequest error code"
},
"$:/language/InternalJavaScriptError/Title": {
"title": "$:/language/InternalJavaScriptError/Title",
"text": "Internal JavaScript Error"
},
"$:/language/InternalJavaScriptError/Hint": {
"title": "$:/language/InternalJavaScriptError/Hint",
"text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/LazyLoadingWarning": {
"title": "$:/language/LazyLoadingWarning",
"text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
},
"$:/language/LoginToTiddlySpace": {
"title": "$:/language/LoginToTiddlySpace",
"text": "Login to TiddlySpace"
},
"$:/language/Manager/Controls/FilterByTag/None": {
"title": "$:/language/Manager/Controls/FilterByTag/None",
"text": "(none)"
},
"$:/language/Manager/Controls/FilterByTag/Prompt": {
"title": "$:/language/Manager/Controls/FilterByTag/Prompt",
"text": "Filter by tag:"
},
"$:/language/Manager/Controls/Order/Prompt": {
"title": "$:/language/Manager/Controls/Order/Prompt",
"text": "Reverse order"
},
"$:/language/Manager/Controls/Search/Placeholder": {
"title": "$:/language/Manager/Controls/Search/Placeholder",
"text": "Search"
},
"$:/language/Manager/Controls/Search/Prompt": {
"title": "$:/language/Manager/Controls/Search/Prompt",
"text": "Search:"
},
"$:/language/Manager/Controls/Show/Option/Tags": {
"title": "$:/language/Manager/Controls/Show/Option/Tags",
"text": "tags"
},
"$:/language/Manager/Controls/Show/Option/Tiddlers": {
"title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
"text": "tiddlers"
},
"$:/language/Manager/Controls/Show/Prompt": {
"title": "$:/language/Manager/Controls/Show/Prompt",
"text": "Show:"
},
"$:/language/Manager/Controls/Sort/Prompt": {
"title": "$:/language/Manager/Controls/Sort/Prompt",
"text": "Sort by:"
},
"$:/language/Manager/Item/Colour": {
"title": "$:/language/Manager/Item/Colour",
"text": "Colour"
},
"$:/language/Manager/Item/Fields": {
"title": "$:/language/Manager/Item/Fields",
"text": "Fields"
},
"$:/language/Manager/Item/Icon/None": {
"title": "$:/language/Manager/Item/Icon/None",
"text": "(none)"
},
"$:/language/Manager/Item/Icon": {
"title": "$:/language/Manager/Item/Icon",
"text": "Icon"
},
"$:/language/Manager/Item/RawText": {
"title": "$:/language/Manager/Item/RawText",
"text": "Raw text"
},
"$:/language/Manager/Item/Tags": {
"title": "$:/language/Manager/Item/Tags",
"text": "Tags"
},
"$:/language/Manager/Item/Tools": {
"title": "$:/language/Manager/Item/Tools",
"text": "Tools"
},
"$:/language/Manager/Item/WikifiedText": {
"title": "$:/language/Manager/Item/WikifiedText",
"text": "Wikified text"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
},
"$:/language/No": {
"title": "$:/language/No",
"text": "No"
},
"$:/language/OfficialPluginLibrary": {
"title": "$:/language/OfficialPluginLibrary",
"text": "Official ~TiddlyWiki Plugin Library"
},
"$:/language/OfficialPluginLibrary/Hint": {
"title": "$:/language/OfficialPluginLibrary/Hint",
"text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
},
"$:/language/PluginReloadWarning": {
"title": "$:/language/PluginReloadWarning",
"text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/SystemTiddlers/Include/Prompt": {
"title": "$:/language/SystemTiddlers/Include/Prompt",
"text": "Include system tiddlers"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Count/Heading": {
"title": "$:/language/TagManager/Count/Heading",
"text": "Count"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Icons/None": {
"title": "$:/language/TagManager/Icons/None",
"text": "None"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/Tiddler/DateFormat": {
"title": "$:/language/Tiddler/DateFormat",
"text": "DDth MMM YYYY at hh12:0mmam"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Yes": {
"title": "$:/language/Yes",
"text": "Yes"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Text": {
"title": "$:/config/NewJournal/Text",
"text": ""
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"tags": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Notifications/CopiedToClipboard/Succeeded": {
"title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
"text": "Copied to clipboard!"
},
"$:/language/Notifications/CopiedToClipboard/Failed": {
"title": "$:/language/Notifications/CopiedToClipboard/Failed",
"text": "Failed to copy to clipboard!"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches/All": {
"title": "$:/language/Search/Matches/All",
"text": "All matches:"
},
"$:/language/Search/Matches/Title": {
"title": "$:/language/Search/Matches/Title",
"text": "Title matches:"
},
"$:/language/Search/Search": {
"title": "$:/language/Search/Search",
"text": "Search"
},
"$:/language/Search/Search/TooShort": {
"title": "$:/language/Search/Search/TooShort",
"text": "Search text too short"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Explorer/Caption": {
"title": "$:/language/SideBar/Explorer/Caption",
"text": "Explorer"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/Snippets/ListByTag": {
"title": "$:/language/Snippets/ListByTag",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "List of tiddlers by tag",
"text": "<<list-links \"[tag[task]sort[title]]\">>\n"
},
"$:/language/Snippets/MacroDefinition": {
"title": "$:/language/Snippets/MacroDefinition",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Macro definition",
"text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
},
"$:/language/Snippets/Table4x3": {
"title": "$:/language/Snippets/Table4x3",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table with 4 columns by 3 rows",
"text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
},
"$:/language/Snippets/TableOfContents": {
"title": "$:/language/Snippets/TableOfContents",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table of Contents",
"text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
},
"$:/language/ThemeTweaks/ThemeTweaks": {
"title": "$:/language/ThemeTweaks/ThemeTweaks",
"text": "Theme Tweaks"
},
"$:/language/ThemeTweaks/ThemeTweaks/Hint": {
"title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
"text": "You can tweak certain aspects of the ''Vanilla'' theme."
},
"$:/language/ThemeTweaks/Options": {
"title": "$:/language/ThemeTweaks/Options",
"text": "Options"
},
"$:/language/ThemeTweaks/Options/SidebarLayout": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout",
"text": "Sidebar layout"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
"text": "Fixed story, fluid sidebar"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
"text": "Fluid story, fixed sidebar"
},
"$:/language/ThemeTweaks/Options/StickyTitles": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles",
"text": "Sticky titles"
},
"$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
"text": "Causes tiddler titles to \"stick\" to the top of the browser window"
},
"$:/language/ThemeTweaks/Options/CodeWrapping": {
"title": "$:/language/ThemeTweaks/Options/CodeWrapping",
"text": "Wrap long lines in code blocks"
},
"$:/language/ThemeTweaks/Settings": {
"title": "$:/language/ThemeTweaks/Settings",
"text": "Settings"
},
"$:/language/ThemeTweaks/Settings/FontFamily": {
"title": "$:/language/ThemeTweaks/Settings/FontFamily",
"text": "Font family"
},
"$:/language/ThemeTweaks/Settings/CodeFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
"text": "Code font family"
},
"$:/language/ThemeTweaks/Settings/EditorFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
"text": "Editor font family"
},
"$:/language/ThemeTweaks/Settings/BackgroundImage": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
"text": "Page background image"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
"text": "Page background image attachment"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
"text": "Scroll with tiddlers"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
"text": "Fixed to window"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
"text": "Page background image size"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
"text": "Auto"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
"text": "Cover"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
"text": "Contain"
},
"$:/language/ThemeTweaks/Metrics": {
"title": "$:/language/ThemeTweaks/Metrics",
"text": "Sizes"
},
"$:/language/ThemeTweaks/Metrics/FontSize": {
"title": "$:/language/ThemeTweaks/Metrics/FontSize",
"text": "Font size"
},
"$:/language/ThemeTweaks/Metrics/LineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/LineHeight",
"text": "Line height"
},
"$:/language/ThemeTweaks/Metrics/BodyFontSize": {
"title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
"text": "Font size for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
"text": "Line height for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
"text": "Story left position"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
"text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryTop": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop",
"text": "Story top position"
},
"$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
"text": "how far the top margin of the story river<br>is from the top of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryRight": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight",
"text": "Story right"
},
"$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
"text": "how far the left margin of the sidebar <br>is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
"text": "Story width"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
"text": "the overall width of the story river"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
"text": "Tiddler width"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
"text": "within the story river"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
"text": "Sidebar breakpoint"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
"text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
"text": "Sidebar width"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
"text": "the width of the sidebar in fluid-fixed layout"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"title": "$:/core/modules/commander.js",
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"title": "$:/core/modules/commands/build.js",
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"title": "$:/core/modules/commands/clearpassword.js",
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/deletetiddlers.js": {
"title": "$:/core/modules/commands/deletetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"title": "$:/core/modules/commands/editions.js",
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/fetch.js": {
"title": "$:/core/modules/commands/fetch.js",
"text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = $tw.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t \tdata = [];\n\t self.commander.write(\"Reading \" + url + \": \");\n\t response.on(\"data\",function(chunk) {\n\t data.push(chunk);\n\t self.commander.write(\".\");\n\t });\n\t response.on(\"end\",function() {\n\t self.commander.write(\"\\n\");\n\t if(response.statusCode === 200) {\n\t\t self.processBody(Buffer.concat(data),type,options,url);\n\t\t callback(null);\n\t } else {\n\t \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t \t} else {\n\t\t \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t \t\t\n\t \t}\n\t }\n\t \t});\n\t \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"title": "$:/core/modules/commands/help.js",
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/import.js": {
"title": "$:/core/modules/commands/import.js",
"text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"title": "$:/core/modules/commands/init.js",
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/listen.js": {
"title": "$:/core/modules/commands/listen.js",
"text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"title": "$:/core/modules/commands/load.js",
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"title": "$:/core/modules/commands/makelibrary.js",
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"title": "$:/core/modules/commands/output.js",
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"title": "$:/core/modules/commands/password.js",
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/render.js": {
"title": "$:/core/modules/commands/render.js",
"text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"title": "$:/core/modules/commands/rendertiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"title": "$:/core/modules/commands/rendertiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/save.js": {
"title": "$:/core/modules/commands/save.js",
"text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savelibrarytiddlers.js": {
"title": "$:/core/modules/commands/savelibrarytiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!$tw.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"title": "$:/core/modules/commands/savetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"title": "$:/core/modules/commands/savetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savewikifolder.js": {
"title": "$:/core/modules/commands/savewikifolder.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"title": "$:/core/modules/commands/server.js",
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"title": "$:/core/modules/commands/setfield.js",
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"title": "$:/core/modules/commands/unpackplugin.js",
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"title": "$:/core/modules/commands/verbose.js",
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"title": "$:/core/modules/commands/version.js",
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"title": "$:/core/modules/config.js",
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"title": "$:/core/modules/deserializers.js",
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/editor/engines/framed.js": {
"title": "$:/core/modules/editor/engines/framed.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\tthis.domNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/engines/simple.js": {
"title": "$:/core/modules/editor/engines/simple.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/factory.js": {
"title": "$:/core/modules/editor/factory.js",
"text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/operations/bitmap/clear.js": {
"title": "$:/core/modules/editor/operations/bitmap/clear.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/resize.js": {
"title": "$:/core/modules/editor/operations/bitmap/resize.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/rotate-left.js": {
"title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/text/excise.js": {
"title": "$:/core/modules/editor/operations/text/excise.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ? [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/make-link.js": {
"title": "$:/core/modules/editor/operations/text/make-link.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/prefix-lines.js": {
"title": "$:/core/modules/editor/operations/text/prefix-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline = prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-all.js": {
"title": "$:/core/modules/editor/operations/text/replace-all.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-selection.js": {
"title": "$:/core/modules/editor/operations/text/replace-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/save-selection.js": {
"title": "$:/core/modules/editor/operations/text/save-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-lines.js": {
"title": "$:/core/modules/editor/operations/text/wrap-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-selection.js": {
"title": "$:/core/modules/editor/operations/text/wrap-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/filters/addprefix.js": {
"title": "$:/core/modules/filters/addprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"title": "$:/core/modules/filters/addsuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"title": "$:/core/modules/filters/after.js",
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"title": "$:/core/modules/filters/all/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"title": "$:/core/modules/filters/all/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"title": "$:/core/modules/filters/all/orphans.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"title": "$:/core/modules/filters/all/shadows.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tags.js": {
"title": "$:/core/modules/filters/all/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"title": "$:/core/modules/filters/all/tiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"title": "$:/core/modules/filters/all.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"title": "$:/core/modules/filters/backlinks.js",
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"title": "$:/core/modules/filters/before.js",
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"title": "$:/core/modules/filters/commands.js",
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/compare.js": {
"title": "$:/core/modules/filters/compare.js",
"text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = types[type] || types.number,\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar types = {\n\t\"number\": function(a,b) {\n\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t},\n\t\"integer\": function(a,b) {\n\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t},\n\t\"string\": function(a,b) {\n\t\treturn compare(\"\" + a,\"\" +b);\n\t},\n\t\"date\": function(a,b) {\n\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\tdateB = $tw.utils.parseDate(b);\n\t\tif(!isFinite(dateA)) {\n\t\t\tdateA = new Date(0);\n\t\t}\n\t\tif(!isFinite(dateB)) {\n\t\t\tdateB = new Date(0);\n\t\t}\n\t\treturn compare(dateA,dateB);\n\t},\n\t\"version\": function(a,b) {\n\t\treturn $tw.utils.compareVersions(a,b);\n\t}\n};\n\nfunction compare(a,b) {\n\tif(a > b) {\n\t\treturn +1;\n\t} else if(a < b) {\n\t\treturn -1;\n\t} else {\n\t\treturn 0;\n\t}\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/contains.js": {
"title": "$:/core/modules/filters/contains.js",
"text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/count.js": {
"title": "$:/core/modules/filters/count.js",
"text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/days.js": {
"title": "$:/core/modules/filters/days.js",
"text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"title": "$:/core/modules/filters/each.js",
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"title": "$:/core/modules/filters/eachday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"title": "$:/core/modules/filters/editiondescription.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"title": "$:/core/modules/filters/editions.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/else.js": {
"title": "$:/core/modules/filters/else.js",
"text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/decodeuricomponent.js": {
"title": "$:/core/modules/filters/decodeuricomponent.js",
"text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/enlist.js": {
"title": "$:/core/modules/filters/enlist.js",
"text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"title": "$:/core/modules/filters/field.js",
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"title": "$:/core/modules/filters/fields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"title": "$:/core/modules/filters/get.js",
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getindex.js": {
"title": "$:/core/modules/filters/getindex.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getvariable.js": {
"title": "$:/core/modules/filters/getvariable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"title": "$:/core/modules/filters/has.js",
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === \"\")) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === \"\" || tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/haschanged.js": {
"title": "$:/core/modules/filters/haschanged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"title": "$:/core/modules/filters/indexes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/insertbefore.js": {
"title": "$:/core/modules/filters/insertbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/binary.js": {
"title": "$:/core/modules/filters/is/binary.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/blank.js": {
"title": "$:/core/modules/filters/is/blank.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/current.js": {
"title": "$:/core/modules/filters/is/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"title": "$:/core/modules/filters/is/image.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"title": "$:/core/modules/filters/is/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"title": "$:/core/modules/filters/is/orphan.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"title": "$:/core/modules/filters/is/shadow.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"title": "$:/core/modules/filters/is/system.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"title": "$:/core/modules/filters/is/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"title": "$:/core/modules/filters/is/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/variable.js": {
"title": "$:/core/modules/filters/is/variable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"title": "$:/core/modules/filters/is.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"title": "$:/core/modules/filters/limit.js",
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"title": "$:/core/modules/filters/links.js",
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"title": "$:/core/modules/filters/list.js",
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"title": "$:/core/modules/filters/listed.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"title": "$:/core/modules/filters/listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/lookup.js": {
"title": "$:/core/modules/filters/lookup.js",
"text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || options.wiki.getTiddlerText(operator.operand + operator.suffix));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/match.js": {
"title": "$:/core/modules/filters/match.js",
"text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/math.js": {
"title": "$:/core/modules/filters/math.js",
"text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/minlength.js": {
"title": "$:/core/modules/filters/minlength.js",
"text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"title": "$:/core/modules/filters/modules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"title": "$:/core/modules/filters/moduletypes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"title": "$:/core/modules/filters/next.js",
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"title": "$:/core/modules/filters/plugintiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"title": "$:/core/modules/filters/prefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"title": "$:/core/modules/filters/previous.js",
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/range.js": {
"title": "$:/core/modules/filters/range.js",
"text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"title": "$:/core/modules/filters/regexp.js",
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"title": "$:/core/modules/filters/removeprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"title": "$:/core/modules/filters/removesuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"title": "$:/core/modules/filters/sameday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"title": "$:/core/modules/filters/search.js",
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"title": "$:/core/modules/filters/shadowsource.js",
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"title": "$:/core/modules/filters/sort.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"title": "$:/core/modules/filters/splitbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"title": "$:/core/modules/filters/storyviews.js",
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/strings.js": {
"title": "$:/core/modules/filters/strings.js",
"text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.trim(a)];}\n);\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subfilter.js": {
"title": "$:/core/modules/filters/subfilter.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subtiddlerfields.js": {
"title": "$:/core/modules/filters/subtiddlerfields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"title": "$:/core/modules/filters/suffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"title": "$:/core/modules/filters/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"title": "$:/core/modules/filters/tagging.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"title": "$:/core/modules/filters/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/then.js": {
"title": "$:/core/modules/filters/then.js",
"text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"title": "$:/core/modules/filters/title.js",
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"title": "$:/core/modules/filters/untagged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/variables.js": {
"title": "$:/core/modules/filters/variables.js",
"text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/wikiparserrules.js": {
"title": "$:/core/modules/filters/wikiparserrules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/x-listops.js": {
"title": "$:/core/modules/filters/x-listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n /*jslint node: true, browser: true */\n /*global $tw: false */\n \"use strict\";\n\n /*\n Fetch titles from the current list\n */\n var prepare_results = function (source) {\n var results = [];\n source(function (tiddler, title) {\n results.push(title);\n });\n return results;\n };\n\n /*\n Moves a number of items from the tail of the current list before the item named in the operand\n */\n exports.putbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list after the item named in the operand\n */\n exports.putafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Replaces the item named in the operand with a number of items from the tail of the current list\n */\n exports.replace = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -count) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list to the head of the list\n */\n exports.putfirst = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(-count).concat(results.slice(0, -count));\n };\n\n /*\n Moves a number of items from the head of the current list to the tail of the list\n */\n exports.putlast = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(count).concat(results.slice(0, count));\n };\n\n /*\n Moves the item named in the operand a number of places forward or backward in the list\n */\n exports.move = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1),\n marker = results.splice(index, 1),\n offset = (index + count) > 0 ? index + count : 0;\n return results.slice(0, offset).concat(marker).concat(results.slice(offset));\n };\n\n /*\n Returns the items from the current list that are after the item named in the operand\n */\n exports.allafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(index) :\n results.slice(index + 1);\n };\n\n /*\n Returns the items from the current list that are before the item named in the operand\n */\n exports.allbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(0, index + 1) :\n results.slice(0, index);\n };\n\n /*\n Appends the items listed in the operand array to the tail of the current list\n */\n exports.append = function (source, operator) {\n var append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || append.length;\n return (append.length === 0) ? results :\n (operator.prefix) ? results.concat(append.slice(-count)) :\n results.concat(append.slice(0, count));\n };\n\n /*\n Prepends the items listed in the operand array to the head of the current list\n */\n exports.prepend = function (source, operator) {\n var prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,prepend.length);\n return (prepend.length === 0) ? results :\n (operator.prefix) ? prepend.slice(-count).concat(results) :\n prepend.slice(0, count).concat(results);\n };\n\n /*\n Returns all items from the current list except the items listed in the operand array\n */\n exports.remove = function (source, operator) {\n var array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || array.length,\n p,\n len,\n index;\n len = array.length - 1;\n for (p = 0; p < count; ++p) {\n if (operator.prefix) {\n index = results.indexOf(array[len - p]);\n } else {\n index = results.indexOf(array[p]);\n }\n if (index !== -1) {\n results.splice(index, 1);\n }\n }\n return results;\n };\n\n /*\n Returns all items from the current list sorted in the order of the items in the operand array\n */\n exports.sortby = function (source, operator) {\n var results = prepare_results(source);\n if (!results || results.length < 2) {\n return results;\n }\n var lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n results.sort(function (a, b) {\n return lookup.indexOf(a) - lookup.indexOf(b);\n });\n return results;\n };\n\n /*\n Removes all duplicate items from the current list\n */\n exports.unique = function (source, operator) {\n var results = prepare_results(source);\n var set = results.reduce(function (a, b) {\n if (a.indexOf(b) < 0) {\n a.push(b);\n }\n return a;\n }, []);\n return set;\n };\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"title": "$:/core/modules/filters.js",
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tArray.prototype.push.apply(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tif(results.length === 0) {\n\t\t\t\t\t\t\t// Main result so far is empty\n\t\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/indexers/backlinks-indexer.js": {
"title": "$:/core/modules/indexers/backlinks-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t oldLinks = [],\n\t self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/field-indexer.js": {
"title": "$:/core/modules/indexers/field-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/tag-indexer.js": {
"title": "$:/core/modules/indexers/tag-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/info/platform.js": {
"title": "$:/core/modules/info/platform.js",
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/keyboard.js": {
"title": "$:/core/modules/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/language.js": {
"title": "$:/core/modules/language.js",
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"title": "$:/core/modules/macros/changecount.js",
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"title": "$:/core/modules/macros/contrastcolour.js",
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"title": "$:/core/modules/macros/csvtiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/displayshortcuts.js": {
"title": "$:/core/modules/macros/displayshortcuts.js",
"text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddler.js": {
"title": "$:/core/modules/macros/jsontiddler.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"title": "$:/core/modules/macros/jsontiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"title": "$:/core/modules/macros/makedatauri.js",
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"title": "$:/core/modules/macros/now.js",
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"title": "$:/core/modules/macros/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/resolvepath.js": {
"title": "$:/core/modules/macros/resolvepath.js",
"text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/unusedtitle.js": {
"title": "$:/core/modules/macros/unusedtitle.js",
"text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"title": "$:/core/modules/macros/version.js",
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"title": "$:/core/modules/parsers/audioparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/binaryparser.js": {
"title": "$:/core/modules/parsers/binaryparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"title": "$:/core/modules/parsers/csvparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"title": "$:/core/modules/parsers/htmlparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"title": "$:/core/modules/parsers/imageparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"title": "$:/core/modules/utils/parseutils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/pdfparser.js": {
"title": "$:/core/modules/parsers/pdfparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/textparser.js": {
"title": "$:/core/modules/parsers/textparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/videoparser.js": {
"title": "$:/core/modules/parsers/videoparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/import.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/import.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"title": "$:/core/modules/pluginswitcher.js",
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"title": "$:/core/modules/saver-handler.js",
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"title": "$:/core/modules/savers/andtidwiki.js",
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/beaker.js": {
"title": "$:/core/modules/savers/beaker.js",
"text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"title": "$:/core/modules/savers/download.js",
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"title": "$:/core/modules/savers/fsosaver.js",
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitea.js": {
"title": "$:/core/modules/savers/gitea.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/github.js": {
"title": "$:/core/modules/savers/github.js",
"text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitlab.js": {
"title": "$:/core/modules/savers/gitlab.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"title": "$:/core/modules/savers/manualdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"title": "$:/core/modules/savers/msdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/put.js": {
"title": "$:/core/modules/savers/put.js",
"text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"title": "$:/core/modules/savers/tiddlyfox.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"title": "$:/core/modules/savers/tiddlyie.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"title": "$:/core/modules/savers/twedit.js",
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"title": "$:/core/modules/savers/upload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/server/authenticators/basic.js": {
"title": "$:/core/modules/server/authenticators/basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve($tw.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/authenticators/header.js": {
"title": "$:/core/modules/server/authenticators/header.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\");\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/routes/delete-tiddler.js": {
"title": "$:/core/modules/server/routes/delete-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-favicon.js": {
"title": "$:/core/modules/server/routes/get-favicon.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-file.js": {
"title": "$:/core/modules/server/routes/get-file.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve($tw.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-index.js": {
"title": "$:/core/modules/server/routes/get-index.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-login-basic.js": {
"title": "$:/core/modules/server/routes/get-login-basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-status.js": {
"title": "$:/core/modules/server/routes/get-status.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler-html.js": {
"title": "$:/core/modules/server/routes/get-tiddler-html.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler.js": {
"title": "$:/core/modules/server/routes/get-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddlers-json.js": {
"title": "$:/core/modules/server/routes/get-tiddlers-json.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif($tw.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif($tw.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/put-tiddler.js": {
"title": "$:/core/modules/server/routes/put-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/server.js": {
"title": "$:/core/modules/server/server.js",
"text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"path-prefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response) {\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = self.wiki;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/browser-messaging.js": {
"title": "$:/core/modules/browser-messaging.js",
"text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/commands.js": {
"title": "$:/core/modules/startup/commands.js",
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/CSSescape.js": {
"title": "$:/core/modules/startup/CSSescape.js",
"text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"title": "$:/core/modules/startup/favicon.js",
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"title": "$:/core/modules/startup/info.js",
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\tvar fields = {\n\t\ttitle: TITLE_INFO_PLUGIN,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"title": "$:/core/modules/startup/load-modules.js",
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"title": "$:/core/modules/startup/password.js",
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/plugins.js": {
"title": "$:/core/modules/startup/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"title": "$:/core/modules/startup/render.js",
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"title": "$:/core/modules/startup/rootwidget.js",
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"title": "$:/core/modules/startup.js",
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\tvar executeStartupTiddlers = function(tag) {\n\t\t$tw.utils.each($tw.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\t\t$tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget);\n\t\t});\n\t};\n\texecuteStartupTiddlers(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"title": "$:/core/modules/startup/story.js",
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\t$tw.wiki.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/windows.js": {
"title": "$:/core/modules/startup/windows.js",
"text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t},{\n\t\t\tname: \"click\",\n\t\t\thandlerObject: $tw.popup,\n\t\t\thandlerMethod: \"handleEvent\"\n\t\t}]);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/story.js": {
"title": "$:/core/modules/story.js",
"text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/storyviews/classic.js": {
"title": "$:/core/modules/storyviews/classic.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"title": "$:/core/modules/storyviews/pop.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"title": "$:/core/modules/storyviews/zoomin.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"title": "$:/core/modules/syncer.js",
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif($tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t};\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || $tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"title": "$:/core/modules/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"title": "$:/core/modules/upgraders/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = $tw.wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"title": "$:/core/modules/upgraders/system.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"title": "$:/core/modules/upgraders/themetweaks.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
"text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)(e=r.charCodeAt(t))<128?o+=String.fromCharCode(e):e>127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128));return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)(t=r.charCodeAt(o))<128?(e+=String.fromCharCode(t),o++):t>191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n<t.length;n++)o[t[n]]=o.require(t[n]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,n,i,d,f,a,h,c=\"\",u=0;u<r.length;)d=(t=r.charCodeAt(u++))>>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(h=64),c+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return c},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,n,i,d,f,a,h=\"\",c=0;c<r.length;)t=o.indexOf(r.charAt(c++))<<2|(d=o.indexOf(r.charAt(c++)))>>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
"module-type": "library"
},
"$:/core/modules/utils/crypto.js": {
"title": "$:/core/modules/utils/crypto.js",
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/csv.js": {
"title": "$:/core/modules/utils/csv.js",
"text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
"text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
"module-type": "library"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"title": "$:/core/modules/utils/dom/animations/slide.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"title": "$:/core/modules/utils/dom/animator.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"title": "$:/core/modules/utils/dom/browser.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"title": "$:/core/modules/utils/dom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/dragndrop.js": {
"title": "$:/core/modules/utils/dom/dragndrop.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"title": "$:/core/modules/utils/dom/http.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!$tw.utils.hop(headers,\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"title": "$:/core/modules/utils/dom/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"title": "$:/core/modules/utils/dom/modal.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"title": "$:/core/modules/utils/dom/notifier.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"title": "$:/core/modules/utils/dom/popup.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"title": "$:/core/modules/utils/dom/scroller.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"title": "$:/core/modules/utils/edition-info.js",
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"title": "$:/core/modules/utils/fakedom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"title": "$:/core/modules/utils/filesystem.js",
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {};\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\tfilepath;\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// If not, generate a base pathname\n\tif(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t// Don't let the filename start with a dot because such files are invisible on *nix\n\tfilepath = filepath.replace(/^\\./g,\"_\");\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"title": "$:/core/modules/utils/logger.js",
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"title": "$:/core/modules/utils/parsetree.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"title": "$:/core/modules/utils/performance.js",
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"title": "$:/core/modules/utils/pluginmaker.js",
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/transliterate.js": {
"title": "$:/core/modules/utils/transliterate.js",
"text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"title": "$:/core/modules/utils/utils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s) {\n\t// See http://www.json.org/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/\\x08/g, '\\\\b') // backspace\n\t\t.replace(/\\x0c/g, '\\\\f') // formfeed\n\t\t.replace(/\\t/g, '\\\\t') // tab\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-createtiddler.js": {
"title": "$:/core/modules/widgets/action-createtiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletefield.js": {
"title": "$:/core/modules/widgets/action-deletefield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-listops.js": {
"title": "$:/core/modules/widgets/action-listops.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"title": "$:/core/modules/widgets/action-navigate.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-popup.js": {
"title": "$:/core/modules/widgets/action-popup.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords);\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"title": "$:/core/modules/widgets/action-sendmessage.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"title": "$:/core/modules/widgets/action-setfield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"title": "$:/core/modules/widgets/browse.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"title": "$:/core/modules/widgets/button.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\t\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"title": "$:/core/modules/widgets/checkbox.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"title": "$:/core/modules/widgets/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"title": "$:/core/modules/widgets/count.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/diff-text.js": {
"title": "$:/core/modules/widgets/diff-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/draggable.js": {
"title": "$:/core/modules/widgets/draggable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/droppable.js": {
"title": "$:/core/modules/widgets/droppable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tvar domNode = this.document.createElement(tag),\n\t\tclasses = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tdomNode.className = classes.join(\" \");\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = event.ctrlKey && ! event.shiftKey ? \"ctrl\" : event.shiftKey && !event.ctrlKey ? \"shift\" : \n\t\t\t\tevent.ctrlKey && event.shiftKey ? \"ctrl-shift\" : \"normal\" ;\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableClass = this.getAttribute(\"class\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"] || changedAttributes.tag || changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"title": "$:/core/modules/widgets/dropzone.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"title": "$:/core/modules/widgets/edit-binary.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"title": "$:/core/modules/widgets/edit-bitmap.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-shortcut.js": {
"title": "$:/core/modules/widgets/edit-shortcut.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"title": "$:/core/modules/widgets/edit-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"title": "$:/core/modules/widgets/edit.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder},\n\t\t\t\"tabindex\": {type: \"string\", value: this.editTabIndex},\n\t\t\t\"focus\": {type: \"string\", value: this.editFocus}\n\t\t},\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"title": "$:/core/modules/widgets/element.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\ttag = \"h\" + headingLevel;\n\t}\n\t// Create the DOM node\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"title": "$:/core/modules/widgets/encrypt.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"title": "$:/core/modules/widgets/entity.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"title": "$:/core/modules/widgets/fieldmangler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"title": "$:/core/modules/widgets/fields.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"title": "$:/core/modules/widgets/image.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"title": "$:/core/modules/widgets/importvariables.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.makeChildWidgets([node]);\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"title": "$:/core/modules/widgets/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tself.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"title": "$:/core/modules/widgets/link.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"title": "$:/core/modules/widgets/linkcatcher.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"title": "$:/core/modules/widgets/list.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"title": "$:/core/modules/widgets/macrocall.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"title": "$:/core/modules/widgets/navigator.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.wiki.addToStory(title,fromTitle,this.storyTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\nconsole.log(\"Relinking '\" + draftOf + \"' to '\" + draftTitle + \"'\");\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\tthis.wiki.renameTiddler(from,to);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"title": "$:/core/modules/widgets/password.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/qualify.js": {
"title": "$:/core/modules/widgets/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"title": "$:/core/modules/widgets/radio.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n \t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n \t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/range.js": {
"title": "$:/core/modules/widgets/range.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\t\t\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField || \"text\",\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue || \"\");\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue || \"\";\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\t\t\t\t\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"title": "$:/core/modules/widgets/raw.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"title": "$:/core/modules/widgets/reveal.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"title": "$:/core/modules/widgets/scrollable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"title": "$:/core/modules/widgets/select.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"title": "$:/core/modules/widgets/set.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"title": "$:/core/modules/widgets/text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"title": "$:/core/modules/widgets/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"title": "$:/core/modules/widgets/transclude.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/vars.js": {
"title": "$:/core/modules/widgets/vars.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"title": "$:/core/modules/widgets/view.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"title": "$:/core/modules/widgets/widget.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/wikify.js": {
"title": "$:/core/modules/widgets/wikify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki-bulkops.js": {
"title": "$:/core/modules/wiki-bulkops.js",
"text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/wiki.js": {
"title": "$:/core/modules/wiki.js",
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t// indexOf unless we have a new\n\t\t\t\t\t// position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title}},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\t\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\t\t\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n})();\n\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastLight": {
"title": "$:/palettes/ContrastLight",
"name": "Contrast (Light)",
"description": "High contrast and unambiguous (light version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastDark": {
"title": "$:/palettes/ContrastDark",
"name": "Contrast (Dark)",
"description": "High contrast and unambiguous (dark version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/DarkPhotos": {
"title": "$:/palettes/DarkPhotos",
"created": "20150402111612188",
"description": "Good with dark photo backgrounds",
"modified": "20150402112344080",
"name": "DarkPhotos",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/GruvboxDark": {
"title": "$:/palettes/GruvboxDark",
"name": "Gruvbox Dark",
"description": "Retro groove color scheme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "https://github.com/morhetz/gruvbox",
"text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #504945\nbutton-foreground: #fbf1c7\nbutton-border: transparent\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: #7c6f64\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #282828\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: <<colour button-background>>\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>"
},
"$:/palettes/Nord": {
"title": "$:/palettes/Nord",
"name": "Nord",
"description": "An arctic, north-bluish color palette.",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
"text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #4C566A\nbutton-foreground: #D8DEE9\nbutton-border: transparent\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #2e3440\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarFlare": {
"title": "$:/palettes/SolarFlare",
"name": "Solar Flare",
"description": "Warm, relaxing earth colours",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarizedLight": {
"title": "$:/palettes/SolarizedLight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Precision colors for machines and people",
"license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
"name": "SolarizedLight",
"text": "alert-background: #eee8d5\nalert-border: #073642\nalert-highlight: #cb4b16\nalert-muted-foreground: #586e75\nbackground: #fdf6e3\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #cb4b16\nbutton-foreground: #fdf6e3\nbutton-border: transparent\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #d33682\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #859900\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #D08770\ndownload-background: #859900\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #fdf6e3\ndropdown-tab-background: #93a1a1\ndropzone-background: #859900\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: #d33682\nexternal-link-foreground-visited: #b58900\nexternal-link-foreground: #cb4b16\nforeground: #839496\nmessage-background: #586e75\nmessage-border: #586e75\nmessage-foreground: #eee8d5\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #eee8d5\nmodal-footer-background: #eee8d5\nmodal-footer-border: #eee8d5\nmodal-header-border: #eee8d5\nmuted-foreground: #93a1a1\nnotification-background: #EBCB8B\nnotification-border: #D08770\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #93a1a1\nprimary: #2aa198\nselect-tag-background: #eee8d5\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: #eee8d5\nsidebar-controls-foreground-hover: #268bd2\nsidebar-controls-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #839496\nsidebar-muted-foreground-hover: #657b83\nsidebar-muted-foreground: #93a1a1\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-background: #839496\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #657b83\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #839496\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #859900\nsidebar-tiddler-link-foreground: #268bd2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #dc322f\ntab-background-selected: #fdf6e3\ntab-background: #839496\ntab-border-selected: #93a1a1\ntab-border: #93a1a1\ntab-divider: #fdf6e3\ntab-foreground-selected: #839496\ntab-foreground: #eee8d5\ntable-border: #657b83\ntable-footer-background: #657b83\ntable-header-background: #93a1a1\ntag-background: #6c71c4\ntag-foreground: #eee8d5\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #b58900\ntiddler-controls-foreground-selected: #b58900\ntiddler-controls-foreground: #073642\ntiddler-editor-background: #eee8d5\ntiddler-editor-border-image: #eee8d5\ntiddler-editor-border: #eee8d5\ntiddler-editor-fields-even: #eee8d5\ntiddler-editor-fields-odd: #fdf6e3\ntiddler-info-background: #eee8d5\ntiddler-info-border: #eee8d5\ntiddler-info-tab-background: #586e75\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #586e75\ntiddler-title-foreground: #073642\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #839496\nvery-muted-foreground: #93a1a1\n"
},
"$:/palettes/SpartanDay": {
"title": "$:/palettes/SpartanDay",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Cold, spartan day colors",
"name": "Spartan Day",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
},
"$:/palettes/SpartanNight": {
"title": "$:/palettes/SpartanNight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Dark spartan colors",
"name": "Spartan Night",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
},
"$:/palettes/Twilight": {
"title": "$:/palettes/Twilight",
"tags": "$:/tags/Palette",
"author": "Thomas Elmiger",
"type": "application/x-tiddler-dictionary",
"name": "Twilight",
"description": "Delightful, soft darkness.",
"text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/library/sjcl.js/license": {
"title": "$:/library/sjcl.js/license",
"type": "text/plain",
"text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-raw": {
"title": "$:/core/templates/canonical-uri-external-raw",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-text": {
"title": "$:/core/templates/canonical-uri-external-text",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
},
"$:/core/save/all-external-js": {
"title": "$:/core/save/all-external-js",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
},
"$:/core/templates/tiddlywiki5.js": {
"title": "$:/core/templates/tiddlywiki5.js",
"text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
},
"$:/core/templates/tiddlywiki5.js/tiddlers": {
"title": "$:/core/templates/tiddlywiki5.js/tiddlers",
"text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n$tw.preloadTiddlerArray([{\n\ttitle: \"$:/config/SaveWikiButton/Template\",\n\ttext: \"$:/core/save/all-external-js\"\n}]);\n`\n"
},
"$:/core/templates/tiddlywiki5-external-js.html": {
"title": "$:/core/templates/tiddlywiki5-external-js.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
},
"$:/core/templates/html-div-skinny-tiddler": {
"title": "$:/core/templates/html-div-skinny-tiddler",
"text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/json-tiddler": {
"title": "$:/core/templates/json-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/raw-static-tiddler": {
"title": "$:/core/templates/raw-static-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-all": {
"title": "$:/core/save/lazy-all",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/server/static.sidebar.wikitext": {
"title": "$:/core/templates/server/static.sidebar.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
},
"$:/core/templates/server/static.tiddler.html": {
"title": "$:/core/templates/server/static.tiddler.html",
"text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
},
"$:/core/templates/server/static.tiddler.wikitext": {
"title": "$:/core/templates/server/static.tiddler.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
},
"$:/core/templates/single.tiddler.window": {
"title": "$:/core/templates/single.tiddler.window",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AboveStory/tw2-plugin-check": {
"title": "$:/core/ui/AboveStory/tw2-plugin-check",
"tags": "$:/tags/AboveStory",
"text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/Actions/new-image": {
"title": "$:/core/ui/Actions/new-image",
"tags": "$:/tags/Actions",
"description": "create a new image tiddler",
"text": "\\define get-type()\nimage/$(imageType)$\n\\end\n<$vars imageType={{$:/config/NewImageType}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/>\n</$vars>\n"
},
"$:/core/ui/Actions/new-journal": {
"title": "$:/core/ui/Actions/new-journal",
"tags": "$:/tags/Actions",
"description": "create a new journal tiddler",
"text": "<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
},
"$:/core/ui/Actions/new-tiddler": {
"title": "$:/core/ui/Actions/new-tiddler",
"tags": "$:/tags/Actions",
"description": "create a new empty tiddler",
"text": "<$action-sendmessage $message=\"tm-new-tiddler\" tags={{$:/config/NewTiddler/Tags!!tags}}/>\n"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbb",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
},
"$:/core/ui/Components/plugin-info": {
"title": "$:/core/ui/Components/plugin-info",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewTiddler/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewJournal/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/KeyboardShortcuts": {
"title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Modals/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
"subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
"text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Parsing": {
"title": "$:/core/ui/ControlPanel/Parsing",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
},
"$:/core/ui/ControlPanel/Plugins/Add/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
"text": "<<display-server-assets language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
"text": "<<display-server-assets plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
"text": "<<display-server-assets theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Updates": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
"caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
"text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"[[<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/Plugins/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
"text": "<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
"text": "<<plugin-table plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
"text": "<<plugin-table theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[title]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n"
},
"$:/core/ui/ControlPanel/Saving/DownloadSaver": {
"title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Saving/General": {
"title": "$:/core/ui/ControlPanel/Saving/General",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
"list-before": "",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Saving/GitHub": {
"title": "$:/core/ui/ControlPanel/Saving/GitHub",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/GitLab": {
"title": "$:/core/ui/ControlPanel/Saving/GitLab",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/TiddlySpot": {
"title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<backupLink>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>"
},
"$:/core/ui/ControlPanel/Saving/Gitea": {
"title": "$:/core/ui/ControlPanel/Saving/Gitea",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Saving/General\">>\n</div>\n"
},
"$:/core/buttonstyles/Borderless": {
"title": "$:/core/buttonstyles/Borderless",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
"text": "tc-btn-invisible"
},
"$:/core/buttonstyles/Boxed": {
"title": "$:/core/buttonstyles/Boxed",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
"text": "tc-btn-boxed"
},
"$:/core/buttonstyles/Rounded": {
"title": "$:/core/buttonstyles/Rounded",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
"text": "tc-btn-rounded"
},
"$:/core/ui/ControlPanel/Settings/CamelCase": {
"title": "$:/core/ui/ControlPanel/Settings/CamelCase",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
"title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
"title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/MissingLinks": {
"title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
"title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/TitleLinks": {
"title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Stylesheets": {
"title": "$:/core/ui/ControlPanel/Stylesheets",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
},
"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-current": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
"tags": "$:/tags/EditPreview",
"caption": "differences from current",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
"tags": "$:/tags/EditPreview",
"caption": "differences from shadow (if any)",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/output": {
"title": "$:/core/ui/EditTemplate/body/preview/output",
"tags": "$:/tags/EditPreview",
"caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
"text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
},
"$:/state/showeditpreview": {
"title": "$:/state/showeditpreview",
"text": "no"
},
"$:/core/ui/EditTemplate/body/editor": {
"title": "$:/core/ui/EditTemplate/body/editor",
"text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabIndex}}\n focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
},
"$:/core/ui/EditTemplate/body/toolbar/button": {
"title": "$:/core/ui/EditTemplate/body/toolbar/button",
"text": "\\define toolbar-button-icon()\n<$list\n\n filter=\"[all[current]!has[custom-icon]]\"\n variable=\"no-custom-icon\"\n\n><$transclude\n\n tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n filter={{!!condition}}\n variable=\"list-condition\"\n\n><$wikify\n\n name=\"tooltip-text\"\n text=<<toolbar-button-tooltip>>\n mode=\"inline\"\n output=\"text\"\n\n><$list\n\n filter=\"[all[current]!has[dropdown]]\"\n variable=\"no-dropdown\"\n\n><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$list><$list\n\n filter=\"[all[current]has[dropdown]]\"\n variable=\"dropdown\"\n\n><$set\n\n name=\"dropdown-state\"\n value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n popup=<<dropdown-state>>\n class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n selectedClass=\"tc-selected\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button><$reveal\n\n state=<<dropdown-state>>\n type=\"popup\"\n position=\"below\"\n animate=\"yes\"\n tag=\"span\"\n\n><div\n\n class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n tiddler={{!!dropdown}}\n mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n name=\"buttonClasses\"\n value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}}></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>> \n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=<<newFieldNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/>\n</span> \n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> \n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}}/>\n</$keyboard>\n</$set>\n</span> \n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</div>\n</$fieldmangler>\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon)\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon)\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\"/>\n\\end\n\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/>\n</$list>\n<$set name=\"tabIndex\" value={{$:/config/EditTabIndex}}>\n<$macrocall $name=\"tag-picker\"/>\n</$set>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}}/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\whitespace trim\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "\\define save-tiddler-button()\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
},
"$:/core/ui/EditorToolbar/bold": {
"title": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}}",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
},
"$:/core/ui/EditorToolbar/clear-dropdown": {
"title": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
},
"$:/core/ui/EditorToolbar/clear": {
"title": "$:/core/ui/EditorToolbar/clear",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/erase",
"caption": "{{$:/language/Buttons/Clear/Caption}}",
"description": "{{$:/language/Buttons/Clear/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/editor-height-dropdown": {
"title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
},
"$:/core/ui/EditorToolbar/editor-height": {
"title": "$:/core/ui/EditorToolbar/editor-height",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/fixed-height",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
"description": "{{$:/language/Buttons/EditorHeight/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/excise-dropdown": {
"title": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
},
"$:/core/ui/EditorToolbar/excise": {
"title": "$:/core/ui/EditorToolbar/excise",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/excise",
"caption": "{{$:/language/Buttons/Excise/Caption}}",
"description": "{{$:/language/Buttons/Excise/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
"shortcuts": "((excise))",
"dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/heading-1": {
"title": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}}",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-2": {
"title": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}}",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-3": {
"title": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}}",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}}",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}}",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}}",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
},
"$:/core/ui/EditorToolbar/italic": {
"title": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}}",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
},
"$:/core/ui/EditorToolbar/line-width-dropdown": {
"title": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/line-width": {
"title": "$:/core/ui/EditorToolbar/line-width",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/line-width",
"caption": "{{$:/language/Buttons/LineWidth/Caption}}",
"description": "{{$:/language/Buttons/LineWidth/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>"
},
"$:/core/ui/EditorToolbar/link-dropdown": {
"title": "$:/core/ui/EditorToolbar/link-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $tiddler=<<dropdown-state>> />\n<$action-deletetiddler $tiddler=<<searchTiddler>> />\n<$action-deletetiddler $tiddler=<<linkTiddler>> />\n\\end\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" >\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"ENTER\" actions=<<add-link-actions>>>\n<$edit-text tiddler=<<searchTiddler>> type=\"search\" tag=\"input\" focus=\"true\" placeholder={{$:/language/Search/Search}} default=\"\"/>\n<$reveal tag=\"span\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<$action-setfield $tiddler=<<searchTiddler>> text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$vars>\n\n<$reveal tag=\"div\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>"
},
"$:/core/ui/EditorToolbar/link": {
"title": "$:/core/ui/EditorToolbar/link",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/link",
"caption": "{{$:/language/Buttons/Link/Caption}}",
"description": "{{$:/language/Buttons/Link/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((link))",
"dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/linkify": {
"title": "$:/core/ui/EditorToolbar/linkify",
"caption": "{{$:/language/Buttons/Linkify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Linkify/Hint}}",
"icon": "$:/core/images/linkify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((linkify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-bullet": {
"title": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}}",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-number": {
"title": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}}",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-block": {
"title": "$:/core/ui/EditorToolbar/mono-block",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-block",
"caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
"description": "{{$:/language/Buttons/MonoBlock/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((mono-block))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-line": {
"title": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}}",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/core/ui/EditorToolbar/more-dropdown": {
"title": "$:/core/ui/EditorToolbar/more-dropdown",
"text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
},
"$:/core/ui/EditorToolbar/more": {
"title": "$:/core/ui/EditorToolbar/more",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/down-arrow",
"caption": "{{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"condition": "[<targetTiddler>]",
"dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/opacity-dropdown": {
"title": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/EditorToolbar/opacity": {
"title": "$:/core/ui/EditorToolbar/opacity",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/opacity",
"caption": "{{$:/language/Buttons/Opacity/Caption}}",
"description": "{{$:/language/Buttons/Opacity/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
},
"$:/core/ui/EditorToolbar/paint-dropdown": {
"title": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/paint": {
"title": "$:/core/ui/EditorToolbar/paint",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/paint",
"caption": "{{$:/language/Buttons/Paint/Caption}}",
"description": "{{$:/language/Buttons/Paint/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
},
"$:/core/ui/EditorToolbar/picture-dropdown": {
"title": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/picture": {
"title": "$:/core/ui/EditorToolbar/picture",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/picture",
"caption": "{{$:/language/Buttons/Picture/Caption}}",
"description": "{{$:/language/Buttons/Picture/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((picture))",
"dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/preview-type-dropdown": {
"title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
"text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/preview-type": {
"title": "$:/core/ui/EditorToolbar/preview-type",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/chevron-down",
"caption": "{{$:/language/Buttons/PreviewType/Caption}}",
"description": "{{$:/language/Buttons/PreviewType/Hint}}",
"condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
"button-classes": "tc-text-editor-toolbar-item-adjunct",
"dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
},
"$:/core/ui/EditorToolbar/preview": {
"title": "$:/core/ui/EditorToolbar/preview",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/preview-open",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/Preview/Caption}}",
"description": "{{$:/language/Buttons/Preview/Hint}}",
"condition": "[<targetTiddler>]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((preview))",
"text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/quote": {
"title": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}}",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
},
"$:/core/ui/EditorToolbar/rotate-left": {
"title": "$:/core/ui/EditorToolbar/rotate-left",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/rotate-left",
"caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
"description": "{{$:/language/Buttons/RotateLeft/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
},
"$:/core/ui/EditorToolbar/size-dropdown": {
"title": "$:/core/ui/EditorToolbar/size-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> × <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
},
"$:/core/ui/EditorToolbar/size": {
"title": "$:/core/ui/EditorToolbar/size",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/size",
"caption": "{{$:/language/Buttons/Size/Caption}}",
"description": "{{$:/language/Buttons/Size/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/stamp-dropdown": {
"title": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
},
"$:/core/ui/EditorToolbar/stamp": {
"title": "$:/core/ui/EditorToolbar/stamp",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/stamp",
"caption": "{{$:/language/Buttons/Stamp/Caption}}",
"description": "{{$:/language/Buttons/Stamp/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"shortcuts": "((stamp))",
"dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/strikethrough": {
"title": "$:/core/ui/EditorToolbar/strikethrough",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/strikethrough",
"caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
"description": "{{$:/language/Buttons/Strikethrough/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((strikethrough))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
},
"$:/core/ui/EditorToolbar/subscript": {
"title": "$:/core/ui/EditorToolbar/subscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/subscript",
"caption": "{{$:/language/Buttons/Subscript/Caption}}",
"description": "{{$:/language/Buttons/Subscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((subscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
},
"$:/core/ui/EditorToolbar/superscript": {
"title": "$:/core/ui/EditorToolbar/superscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/superscript",
"caption": "{{$:/language/Buttons/Superscript/Caption}}",
"description": "{{$:/language/Buttons/Superscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((superscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
},
"$:/core/ui/EditorToolbar/transcludify": {
"title": "$:/core/ui/EditorToolbar/transcludify",
"caption": "{{$:/language/Buttons/Transcludify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Transcludify/Hint}}",
"icon": "$:/core/images/transcludify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((transcludify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
},
"$:/core/ui/EditorToolbar/underline": {
"title": "$:/core/ui/EditorToolbar/underline",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/underline",
"caption": "{{$:/language/Buttons/Underline/Caption}}",
"description": "{{$:/language/Buttons/Underline/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((underline))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/SessionTiddlers": {
"title": "$:/core/Filters/SessionTiddlers",
"tags": "$:/tags/Filter",
"filter": "[haschanged[]]",
"description": "{{$:/language/Filters/SessionTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/StoryList": {
"title": "$:/core/Filters/StoryList",
"tags": "$:/tags/Filter",
"filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
"description": "{{$:/language/Filters/StoryList}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/Filters/TypedTiddlers": {
"title": "$:/core/Filters/TypedTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Filters/TypedTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table>\n<tbody>\n<tr>\n<th>\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" stateTitle=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Diff": {
"title": "$:/core/ui/ImportPreviews/Diff",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Diff}}",
"text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
},
"$:/core/ui/ImportPreviews/DiffFields": {
"title": "$:/core/ui/ImportPreviews/DiffFields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
"text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
},
"$:/core/ui/ImportPreviews/Fields": {
"title": "$:/core/ui/ImportPreviews/Fields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Fields}}",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Text": {
"title": "$:/core/ui/ImportPreviews/Text",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Text}}",
"text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
},
"$:/core/ui/ImportPreviews/TextRaw": {
"title": "$:/core/ui/ImportPreviews/TextRaw",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
"text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
},
"$:/core/ui/KeyboardShortcuts/advanced-search": {
"title": "$:/core/ui/KeyboardShortcuts/advanced-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((advanced-search))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\"/>\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-image": {
"title": "$:/core/ui/KeyboardShortcuts/new-image",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-image))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-journal": {
"title": "$:/core/ui/KeyboardShortcuts/new-journal",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-journal))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-tiddler": {
"title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-tiddler))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/sidebar-search": {
"title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((sidebar-search))",
"text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
},
"$:/core/ui/KeyboardShortcut/toggle-sidebar": {
"title": "$:/core/ui/KeyboardShortcut/toggle-sidebar",
"tags": "$:/tags/KeyboardShortcut",
"key": "((toggle-sidebar))",
"text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
},
"$:/Manager/ItemMain/Fields": {
"title": "$:/Manager/ItemMain/Fields",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/Fields}}",
"text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/Manager/ItemMain/RawText": {
"title": "$:/Manager/ItemMain/RawText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/RawText}}",
"text": "<pre><code><$view/></code></pre>\n"
},
"$:/Manager/ItemMain/WikifiedText": {
"title": "$:/Manager/ItemMain/WikifiedText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/WikifiedText}}",
"text": "<$transclude mode=\"block\"/>\n"
},
"$:/Manager/ItemSidebar/Colour": {
"title": "$:/Manager/ItemSidebar/Colour",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Colour}}",
"text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Icon": {
"title": "$:/Manager/ItemSidebar/Icon",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Icon}}",
"text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tags": {
"title": "$:/Manager/ItemSidebar/Tags",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tags}}",
"text": "\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n<$action-listops\n\t$tiddler=<<currentTiddler>>\n\t$field=\"tags\"\n\t$subfilter=\"[<tag>] [all[current]tags[]]\"\n/>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tools": {
"title": "$:/Manager/ItemSidebar/Tools",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tools}}",
"text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
},
"$:/Manager": {
"title": "$:/Manager",
"icon": "$:/core/images/list",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Explorer": {
"title": "$:/core/ui/MoreSideBar/Explorer",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Explorer/Caption}}",
"text": "<<tree \"$:/\">>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Plugins/Plugins\">>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Languages": {
"title": "$:/core/ui/MoreSideBar/Plugins/Languages",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Theme": {
"title": "$:/core/ui/MoreSideBar/Plugins/Theme",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/fold-all": {
"title": "$:/core/ui/Buttons/fold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
"description": "{{$:/language/Buttons/FoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/manager": {
"title": "$:/core/ui/Buttons/manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
"description": "{{$:/language/Buttons/Manager/Hint}}",
"text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-image": {
"title": "$:/core/ui/Buttons/new-image",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
"description": "{{$:/language/Buttons/NewImage/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/palette": {
"title": "$:/core/ui/Buttons/palette",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
"description": "{{$:/language/Buttons/Palette/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/print": {
"title": "$:/core/ui/Buttons/print",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
"description": "{{$:/language/Buttons/Print/Hint}}",
"text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/timestamp": {
"title": "$:/core/ui/Buttons/timestamp",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
"description": "{{$:/language/Buttons/Timestamp/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/unfold-all": {
"title": "$:/core/ui/Buttons/unfold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
"description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/drafts": {
"title": "$:/core/ui/PageTemplate/drafts",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/PageTemplate/pluginreloadwarning": {
"title": "$:/core/ui/PageTemplate/pluginreloadwarning",
"tags": "$:/tags/PageTemplate",
"text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-enable-drag-and-drop\" value={{$:/config/DragAndDrop/Enable}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/PaletteManager": {
"title": "$:/PaletteManager",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip=<<lingo Delete/Hint>> aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"> <<lingo Names/External/Show>></$checkbox>\n\n<<palette-manager-table>>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/PluginInfo/Default/contents": {
"title": "$:/core/ui/PluginInfo/Default/contents",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
},
"$:/core/ui/PluginListItemTemplate": {
"title": "$:/core/ui/PluginListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" />\n</div>"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
},
"$:/core/ui/SideBarSegments/page-controls": {
"title": "$:/core/ui/SideBarSegments/page-controls",
"tags": "$:/tags/SideBarSegment",
"text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
},
"$:/core/ui/SideBarSegments/search": {
"title": "$:/core/ui/SideBarSegments/search",
"tags": "$:/tags/SideBarSegment",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [<searchTiddler>get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-subtitle": {
"title": "$:/core/ui/SideBarSegments/site-subtitle",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-title": {
"title": "$:/core/ui/SideBarSegments/site-title",
"tags": "$:/tags/SideBarSegment",
"text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
},
"$:/core/ui/SideBarSegments/tabs": {
"title": "$:/core/ui/SideBarSegments/tabs",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\"/>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate/unfold": {
"title": "$:/core/ui/ViewTemplate/unfold",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/fold-bar": {
"title": "$:/core/ui/Buttons/fold-bar",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
"description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
"text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
},
"$:/core/ui/Buttons/fold-others": {
"title": "$:/core/ui/Buttons/fold-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
"description": "{{$:/language/Buttons/FoldOthers/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/fold": {
"title": "$:/core/ui/Buttons/fold",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
"description": "{{$:/language/Buttons/Fold/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags!!tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags!!tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
},
"$:/core/ui/Buttons/open-window": {
"title": "$:/core/ui/Buttons/open-window",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
"description": "{{$:/language/Buttons/OpenWindow/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoFocus": {
"title": "$:/config/AutoFocus",
"text": "title"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#444"
},
"$:/config/BitmapEditor/ImageSizes": {
"title": "$:/config/BitmapEditor/ImageSizes",
"text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3px"
},
"$:/config/BitmapEditor/LineWidths": {
"title": "$:/config/BitmapEditor/LineWidths",
"text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
},
"$:/config/BitmapEditor/Opacities": {
"title": "$:/config/BitmapEditor/Opacities",
"text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
},
"$:/config/BitmapEditor/Opacity": {
"title": "$:/config/BitmapEditor/Opacity",
"text": "1.0"
},
"$:/config/DefaultMoreSidebarTab": {
"title": "$:/config/DefaultMoreSidebarTab",
"text": "$:/core/ui/MoreSideBar/Tags"
},
"$:/config/DefaultSidebarTab": {
"title": "$:/config/DefaultSidebarTab",
"text": "$:/core/ui/SideBar/Open"
},
"$:/config/DownloadSaver/AutoSave": {
"title": "$:/config/DownloadSaver/AutoSave",
"text": "no"
},
"$:/config/Drafts/TypingTimeout": {
"title": "$:/config/Drafts/TypingTimeout",
"text": "400"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/webp": {
"title": "$:/config/EditorTypeMappings/image/webp",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heic": {
"title": "$:/config/EditorTypeMappings/image/heic",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heif": {
"title": "$:/config/EditorTypeMappings/image/heif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Manager/Show": {
"title": "$:/config/Manager/Show",
"text": "tiddlers"
},
"$:/config/Manager/Filter": {
"title": "$:/config/Manager/Filter",
"text": ""
},
"$:/config/Manager/Order": {
"title": "$:/config/Manager/Order",
"text": "forward"
},
"$:/config/Manager/Sort": {
"title": "$:/config/Manager/Sort",
"text": "title"
},
"$:/config/Manager/System": {
"title": "$:/config/Manager/System",
"text": "system"
},
"$:/config/Manager/Tag": {
"title": "$:/config/Manager/Tag",
"text": ""
},
"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
"title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
"text": "hide"
},
"$:/config/MissingLinks": {
"title": "$:/config/MissingLinks",
"text": "yes"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/NewImageType": {
"title": "$:/config/NewImageType",
"text": "jpeg"
},
"$:/config/OfficialPluginLibrary": {
"title": "$:/config/OfficialPluginLibrary",
"tags": "$:/tags/PluginLibrary",
"url": "https://tiddlywiki.com/library/v5.1.22/index.html",
"caption": "{{$:/language/OfficialPluginLibrary}}",
"text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
},
"$:/config/Navigation/openLinkFromInsideRiver": {
"title": "$:/config/Navigation/openLinkFromInsideRiver",
"text": "below"
},
"$:/config/Navigation/openLinkFromOutsideRiver": {
"title": "$:/config/Navigation/openLinkFromOutsideRiver",
"text": "top"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
"text": "hide"
},
"$:/config/Performance/Instrumentation": {
"title": "$:/config/Performance/Instrumentation",
"text": "no"
},
"$:/config/RegisterPluginType/plugin": {
"title": "$:/config/RegisterPluginType/plugin",
"text": "yes"
},
"$:/config/RegisterPluginType/theme": {
"title": "$:/config/RegisterPluginType/theme",
"text": "no"
},
"$:/config/RegisterPluginType/language": {
"title": "$:/config/RegisterPluginType/language",
"text": "no"
},
"$:/config/RegisterPluginType/info": {
"title": "$:/config/RegisterPluginType/info",
"text": "no"
},
"$:/config/RegisterPluginType/import": {
"title": "$:/config/RegisterPluginType/import",
"text": "no"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Search/AutoFocus": {
"title": "$:/config/Search/AutoFocus",
"text": "true"
},
"$:/config/Search/MinLength": {
"title": "$:/config/Search/MinLength",
"text": "3"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
"title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
"text": "yes"
},
"$:/config/ShortcutInfo/add-field": {
"title": "$:/config/ShortcutInfo/add-field",
"text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
},
"$:/config/ShortcutInfo/advanced-search": {
"title": "$:/config/ShortcutInfo/advanced-search",
"text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
},
"$:/config/ShortcutInfo/bold": {
"title": "$:/config/ShortcutInfo/bold",
"text": "{{$:/language/Buttons/Bold/Hint}}"
},
"$:/config/ShortcutInfo/cancel-edit-tiddler": {
"title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
"text": "{{$:/language/Buttons/Cancel/Hint}}"
},
"$:/config/ShortcutInfo/excise": {
"title": "$:/config/ShortcutInfo/excise",
"text": "{{$:/language/Buttons/Excise/Hint}}"
},
"$:/config/ShortcutInfo/heading-1": {
"title": "$:/config/ShortcutInfo/heading-1",
"text": "{{$:/language/Buttons/Heading1/Hint}}"
},
"$:/config/ShortcutInfo/heading-2": {
"title": "$:/config/ShortcutInfo/heading-2",
"text": "{{$:/language/Buttons/Heading2/Hint}}"
},
"$:/config/ShortcutInfo/heading-3": {
"title": "$:/config/ShortcutInfo/heading-3",
"text": "{{$:/language/Buttons/Heading3/Hint}}"
},
"$:/config/ShortcutInfo/heading-4": {
"title": "$:/config/ShortcutInfo/heading-4",
"text": "{{$:/language/Buttons/Heading4/Hint}}"
},
"$:/config/ShortcutInfo/heading-5": {
"title": "$:/config/ShortcutInfo/heading-5",
"text": "{{$:/language/Buttons/Heading5/Hint}}"
},
"$:/config/ShortcutInfo/heading-6": {
"title": "$:/config/ShortcutInfo/heading-6",
"text": "{{$:/language/Buttons/Heading6/Hint}}"
},
"$:/config/ShortcutInfo/italic": {
"title": "$:/config/ShortcutInfo/italic",
"text": "{{$:/language/Buttons/Italic/Hint}}"
},
"$:/config/ShortcutInfo/link": {
"title": "$:/config/ShortcutInfo/link",
"text": "{{$:/language/Buttons/Link/Hint}}"
},
"$:/config/ShortcutInfo/list-bullet": {
"title": "$:/config/ShortcutInfo/list-bullet",
"text": "{{$:/language/Buttons/ListBullet/Hint}}"
},
"$:/config/ShortcutInfo/list-number": {
"title": "$:/config/ShortcutInfo/list-number",
"text": "{{$:/language/Buttons/ListNumber/Hint}}"
},
"$:/config/ShortcutInfo/mono-block": {
"title": "$:/config/ShortcutInfo/mono-block",
"text": "{{$:/language/Buttons/MonoBlock/Hint}}"
},
"$:/config/ShortcutInfo/mono-line": {
"title": "$:/config/ShortcutInfo/mono-line",
"text": "{{$:/language/Buttons/MonoLine/Hint}}"
},
"$:/config/ShortcutInfo/new-image": {
"title": "$:/config/ShortcutInfo/new-image",
"text": "{{$:/language/Buttons/NewImage/Hint}}"
},
"$:/config/ShortcutInfo/new-journal": {
"title": "$:/config/ShortcutInfo/new-journal",
"text": "{{$:/language/Buttons/NewJournal/Hint}}"
},
"$:/config/ShortcutInfo/new-tiddler": {
"title": "$:/config/ShortcutInfo/new-tiddler",
"text": "{{$:/language/Buttons/NewTiddler/Hint}}"
},
"$:/config/ShortcutInfo/picture": {
"title": "$:/config/ShortcutInfo/picture",
"text": "{{$:/language/Buttons/Picture/Hint}}"
},
"$:/config/ShortcutInfo/preview": {
"title": "$:/config/ShortcutInfo/preview",
"text": "{{$:/language/Buttons/Preview/Hint}}"
},
"$:/config/ShortcutInfo/quote": {
"title": "$:/config/ShortcutInfo/quote",
"text": "{{$:/language/Buttons/Quote/Hint}}"
},
"$:/config/ShortcutInfo/save-tiddler": {
"title": "$:/config/ShortcutInfo/save-tiddler",
"text": "{{$:/language/Buttons/Save/Hint}}"
},
"$:/config/ShortcutInfo/sidebar-search": {
"title": "$:/config/ShortcutInfo/sidebar-search",
"text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
},
"$:/config/ShortcutInfo/stamp": {
"title": "$:/config/ShortcutInfo/stamp",
"text": "{{$:/language/Buttons/Stamp/Hint}}"
},
"$:/config/ShortcutInfo/strikethrough": {
"title": "$:/config/ShortcutInfo/strikethrough",
"text": "{{$:/language/Buttons/Strikethrough/Hint}}"
},
"$:/config/ShortcutInfo/subscript": {
"title": "$:/config/ShortcutInfo/subscript",
"text": "{{$:/language/Buttons/Subscript/Hint}}"
},
"$:/config/ShortcutInfo/superscript": {
"title": "$:/config/ShortcutInfo/superscript",
"text": "{{$:/language/Buttons/Superscript/Hint}}"
},
"$:/config/ShortcutInfo/toggle-sidebar": {
"title": "$:/config/ShortcutInfo/toggle-sidebar",
"text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
},
"$:/config/ShortcutInfo/underline": {
"title": "$:/config/ShortcutInfo/underline",
"text": "{{$:/language/Buttons/Underline/Hint}}"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Tags/MinLength": {
"title": "$:/config/Tags/MinLength",
"text": "0"
},
"$:/config/TextEditor/EditorHeight/Height": {
"title": "$:/config/TextEditor/EditorHeight/Height",
"text": "400px"
},
"$:/config/TextEditor/EditorHeight/Mode": {
"title": "$:/config/TextEditor/EditorHeight/Mode",
"text": "auto"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/TiddlerInfo/Mode": {
"title": "$:/config/TiddlerInfo/Mode",
"text": "popup"
},
"$:/config/Tiddlers/TitleLinks": {
"title": "$:/config/Tiddlers/TitleLinks",
"text": "no"
},
"$:/config/Toolbar/ButtonClass": {
"title": "$:/config/Toolbar/ButtonClass",
"text": "tc-btn-invisible"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
"text": "hide"
},
"$:/config/shortcuts-mac/bold": {
"title": "$:/config/shortcuts-mac/bold",
"text": "meta-B"
},
"$:/config/shortcuts-mac/italic": {
"title": "$:/config/shortcuts-mac/italic",
"text": "meta-I"
},
"$:/config/shortcuts-mac/underline": {
"title": "$:/config/shortcuts-mac/underline",
"text": "meta-U"
},
"$:/config/shortcuts-mac/new-image": {
"title": "$:/config/shortcuts-mac/new-image",
"text": "ctrl-I"
},
"$:/config/shortcuts-mac/new-journal": {
"title": "$:/config/shortcuts-mac/new-journal",
"text": "ctrl-J"
},
"$:/config/shortcuts-mac/new-tiddler": {
"title": "$:/config/shortcuts-mac/new-tiddler",
"text": "ctrl-N"
},
"$:/config/shortcuts-not-mac/bold": {
"title": "$:/config/shortcuts-not-mac/bold",
"text": "ctrl-B"
},
"$:/config/shortcuts-not-mac/italic": {
"title": "$:/config/shortcuts-not-mac/italic",
"text": "ctrl-I"
},
"$:/config/shortcuts-not-mac/underline": {
"title": "$:/config/shortcuts-not-mac/underline",
"text": "ctrl-U"
},
"$:/config/shortcuts-not-mac/new-image": {
"title": "$:/config/shortcuts-not-mac/new-image",
"text": "alt-I"
},
"$:/config/shortcuts-not-mac/new-journal": {
"title": "$:/config/shortcuts-not-mac/new-journal",
"text": "alt-J"
},
"$:/config/shortcuts-not-mac/new-tiddler": {
"title": "$:/config/shortcuts-not-mac/new-tiddler",
"text": "alt-N"
},
"$:/config/shortcuts/add-field": {
"title": "$:/config/shortcuts/add-field",
"text": "enter"
},
"$:/config/shortcuts/advanced-search": {
"title": "$:/config/shortcuts/advanced-search",
"text": "ctrl-shift-A"
},
"$:/config/shortcuts/cancel-edit-tiddler": {
"title": "$:/config/shortcuts/cancel-edit-tiddler",
"text": "escape"
},
"$:/config/shortcuts/excise": {
"title": "$:/config/shortcuts/excise",
"text": "ctrl-E"
},
"$:/config/shortcuts/sidebar-search": {
"title": "$:/config/shortcuts/sidebar-search",
"text": "ctrl-shift-F"
},
"$:/config/shortcuts/heading-1": {
"title": "$:/config/shortcuts/heading-1",
"text": "ctrl-1"
},
"$:/config/shortcuts/heading-2": {
"title": "$:/config/shortcuts/heading-2",
"text": "ctrl-2"
},
"$:/config/shortcuts/heading-3": {
"title": "$:/config/shortcuts/heading-3",
"text": "ctrl-3"
},
"$:/config/shortcuts/heading-4": {
"title": "$:/config/shortcuts/heading-4",
"text": "ctrl-4"
},
"$:/config/shortcuts/heading-5": {
"title": "$:/config/shortcuts/heading-5",
"text": "ctrl-5"
},
"$:/config/shortcuts/heading-6": {
"title": "$:/config/shortcuts/heading-6",
"text": "ctrl-6"
},
"$:/config/shortcuts/link": {
"title": "$:/config/shortcuts/link",
"text": "ctrl-L"
},
"$:/config/shortcuts/linkify": {
"title": "$:/config/shortcuts/linkify",
"text": "alt-shift-L"
},
"$:/config/shortcuts/list-bullet": {
"title": "$:/config/shortcuts/list-bullet",
"text": "ctrl-shift-L"
},
"$:/config/shortcuts/list-number": {
"title": "$:/config/shortcuts/list-number",
"text": "ctrl-shift-N"
},
"$:/config/shortcuts/mono-block": {
"title": "$:/config/shortcuts/mono-block",
"text": "ctrl-shift-M"
},
"$:/config/shortcuts/mono-line": {
"title": "$:/config/shortcuts/mono-line",
"text": "ctrl-M"
},
"$:/config/shortcuts/picture": {
"title": "$:/config/shortcuts/picture",
"text": "ctrl-shift-I"
},
"$:/config/shortcuts/preview": {
"title": "$:/config/shortcuts/preview",
"text": "alt-P"
},
"$:/config/shortcuts/quote": {
"title": "$:/config/shortcuts/quote",
"text": "ctrl-Q"
},
"$:/config/shortcuts/save-tiddler": {
"title": "$:/config/shortcuts/save-tiddler",
"text": "ctrl+enter"
},
"$:/config/shortcuts/stamp": {
"title": "$:/config/shortcuts/stamp",
"text": "ctrl-S"
},
"$:/config/shortcuts/strikethrough": {
"title": "$:/config/shortcuts/strikethrough",
"text": "ctrl-T"
},
"$:/config/shortcuts/subscript": {
"title": "$:/config/shortcuts/subscript",
"text": "ctrl-shift-B"
},
"$:/config/shortcuts/superscript": {
"title": "$:/config/shortcuts/superscript",
"text": "ctrl-shift-P"
},
"$:/config/shortcuts/toggle-sidebar": {
"title": "$:/config/shortcuts/toggle-sidebar",
"text": "alt-shift-S"
},
"$:/config/shortcuts/transcludify": {
"title": "$:/config/shortcuts/transcludify",
"text": "alt-shift-T"
},
"$:/config/ui/EditTemplate": {
"title": "$:/config/ui/EditTemplate",
"text": "$:/core/ui/EditTemplate"
},
"$:/config/ui/ViewTemplate": {
"title": "$:/config/ui/ViewTemplate",
"text": "$:/core/ui/ViewTemplate"
},
"$:/config/WikiParserRules/Inline/wikilink": {
"title": "$:/config/WikiParserRules/Inline/wikilink",
"text": "enable"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}\n><div class=\"tc-swatch\" style=<<swatchStyle>> title=<<colour>>/></$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/colour-picker": {
"title": "$:/core/macros/colour-picker",
"tags": "$:/tags/Macro",
"text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
},
"$:/core/macros/copy-to-clipboard": {
"title": "$:/core/macros/copy-to-clipboard",
"tags": "$:/tags/Macro",
"text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
},
"$:/core/macros/diff": {
"title": "$:/core/macros/diff",
"tags": "$:/tags/Macro",
"text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
},
"$:/core/macros/dumpvariables": {
"title": "$:/core/macros/dumpvariables",
"tags": "$:/tags/Macro",
"text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/image-picker": {
"title": "$:/core/macros/image-picker",
"created": "20170715180840889",
"modified": "20170715180914005",
"tags": "$:/tags/Macro",
"type": "text/vnd.tiddlywiki",
"text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n</$type$>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n \n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag-picker": {
"title": "$:/core/macros/tag-picker",
"tags": "$:/tags/Macro",
"text": "\\define add-tag-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n\\end\n\n\\define tag-button()\n<$button class=\"tc-btn-invisible\" tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<tag>>/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$button>\n\\end\n\n\\define tag-picker-inner()\n\\whitespace trim\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$keyboard key=\"ENTER\" actions=<<add-tag-actions>>>\n<$edit-text tiddler=<<newTagNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/>\n</$keyboard>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<add-tag-actions>>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$set name=\"newTagName\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]!is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n<hr>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n\\end\n\\define tag-picker()\n\\whitespace trim\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=<<tag-picker-inner>>>\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<<tag-picker-inner>>\n</$set>\n</$list>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/thumbnails": {
"title": "$:/core/macros/thumbnails",
"tags": "$:/tags/Macro",
"text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
},
"$:/core/macros/timeline": {
"title": "$:/core/macros/timeline",
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n <<toc-caption>>\n </$list>\n <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </li>\n </$set>\n </$set>\n </$vars>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$link>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n <li class=<<toc-item-class>>>\n <$link>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n </$list>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n </$list>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n <div class=\"tc-tabbed-table-of-contents\">\n <$linkcatcher to=<<__selectedTiddler__>>>\n <div class=\"tc-table-of-contents\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n </div>\n </$linkcatcher>\n <div class=\"tc-tabbed-table-of-contents-content\">\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n <$transclude mode=\"block\" tiddler=<<__template__>>>\n <h1><<toc-caption>></h1>\n <$transclude mode=\"block\">$missingText$</$transclude>\n </$transclude>\n </$reveal>\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n $unselectedText$\n </$reveal>\n </div>\n </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/core/macros/translink": {
"title": "$:/core/macros/translink",
"tags": "$:/tags/Macro",
"text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tree": {
"title": "$:/core/macros/tree",
"tags": "$:/tags/Macro",
"text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/utils": {
"title": "$:/core/macros/utils",
"text": "\\define colour(colour)\n$colour$\n\\end\n"
},
"$:/snippets/minifocusswitcher": {
"title": "$:/snippets/minifocusswitcher",
"text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
},
"$:/snippets/peek-stylesheets": {
"title": "$:/snippets/peek-stylesheets",
"text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/AdvancedSearch/FilterButton": {
"title": "$:/tags/AdvancedSearch/FilterButton",
"list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/ControlPanel/Plugins": {
"title": "$:/tags/ControlPanel/Plugins",
"list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/EditorToolbar": {
"title": "$:/tags/EditorToolbar",
"list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
},
"$:/tags/Manager/ItemMain": {
"title": "$:/tags/Manager/ItemMain",
"list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
},
"$:/tags/Manager/ItemSidebar": {
"title": "$:/tags/Manager/ItemSidebar",
"list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
"text": ""
},
"$:/tags/PluginLibrary": {
"title": "$:/tags/PluginLibrary",
"list": "$:/config/OfficialPluginLibrary"
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/SideBarSegment": {
"title": "$:/tags/SideBarSegment",
"list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
}
}
}
/*\
title: $:/core/modules/filters/has.js
type: application/javascript
module-type: filteroperator
Filter operator for checking if a tiddler has the specified field
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.has = function(source,operator,options) {
var results = [],
invert = operator.prefix === "!";
if(operator.suffix === "field") {
if(invert) {
source(function(tiddler,title) {
if(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {
results.push(title);
}
});
} else {
source(function(tiddler,title) {
if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {
results.push(title);
}
});
}
} else {
if(invert) {
source(function(tiddler,title) {
if(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === "") || (tiddler.fields[operator.operand].length === 0)) {
results.push(title);
}
});
} else {
source(function(tiddler,title) {
if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === "" || tiddler.fields[operator.operand].length === 0)) {
results.push(title);
}
});
}
}
return results;
};
})();
\whitespace trim
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" default="show">
<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-fold-tiddler" $param=<<currentTiddler>> foldedState=<<folded-state>>/>
<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem">
{{$:/core/images/fold-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>match[yes]]">
<span class="tc-btn-text">
<$text text=" "/>
<$text text={{$:/language/Buttons/Fold/Caption}}/>
</span>
</$list>
</$button>
</$reveal>
<$reveal type="match" stateTitle=<<folded-state>> text="hide" default="show">
<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-fold-tiddler" $param=<<currentTiddler>> foldedState=<<folded-state>>/>
<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem">
{{$:/core/images/unfold-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>match[yes]]">
<span class="tc-btn-text">
<$text text=" "/>
<$text text={{$:/language/Buttons/Unfold/Caption}}/>
</span>
</$list>
</$button>
</$reveal>
{{$:/snippets/viewswitcher}}
\define lingo-base() $:/language/EditTemplate/
\define config-title()
$:/config/EditTemplateFields/Visibility/$(currentField)$
\end
\define config-filter()
[[hide]] -[title{$(config-title)$}]
\end
\define current-tiddler-new-field-selector()
[data-tiddler-title="$(currentTiddlerCSSescaped)$"] .tc-edit-field-add-name input
\end
\define new-field-actions()
<$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>
<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>
<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>
<$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/>
\end
\define new-field()
<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>
<$reveal type="nomatch" text="" default=<<name>>>
<$button tooltip=<<lingo Fields/Add/Button/Hint>>>
<$action-sendmessage $message="tm-add-field"
$name=<<name>>
$value={{{ [<newFieldValueTiddler>get[text]] }}}/>
<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>
<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>
<<lingo Fields/Add/Button>>
</$button>
</$reveal>
<$reveal type="match" text="" default=<<name>>>
<$button>
<<lingo Fields/Add/Button>>
</$button>
</$reveal>
</$vars>
\end
\whitespace trim
<div class="tc-edit-fields">
<table class="tc-edit-fields">
<tbody>
<$list filter="[all[current]fields[]] +[sort[title]]" variable="currentField" storyview="pop">
<$list filter=<<config-filter>> variable="temp">
<tr class="tc-edit-field">
<td class="tc-edit-field-name">
<$text text=<<currentField>>/>:</td>
<td class="tc-edit-field-value">
<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>
</td>
<td class="tc-edit-field-remove">
<$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>
<$action-deletefield $field=<<currentField>>/>
{{$:/core/images/delete-button}}
</$button>
</td>
</tr>
</$list>
</$list>
</tbody>
</table>
</div>
<$fieldmangler>
<div class="tc-edit-field-add">
<em class="tc-edit">
<<lingo Fields/Add/Prompt>>
</em>
<span class="tc-edit-field-add-name">
<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/>
</span>
<$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>
<$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default="">
<div class="tc-block-dropdown tc-edit-type-dropdown">
<$set name="tv-show-missing-links" value="yes">
<$linkcatcher to=<<newFieldNameTiddler>>>
<div class="tc-dropdown-item">
<<lingo Fields/Add/Dropdown/User>>
</div>
<$set name="newFieldName" value={{{ [<newFieldNameTiddler>get[text]] }}}>
<$list filter="[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField">
<$link to=<<currentField>>>
<$text text=<<currentField>>/>
</$link>
</$list>
<div class="tc-dropdown-item">
<<lingo Fields/Add/Dropdown/System>>
</div>
<$list filter="[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField">
<$link to=<<currentField>>>
<$text text=<<currentField>>/>
</$link>
</$list>
</$set>
</$linkcatcher>
</$set>
</div>
</$reveal>
<span class="tc-edit-field-add-value">
<$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}>
<$keyboard key="((add-field))" actions=<<new-field-actions>>>
<$edit-text tiddler=<<newFieldValueTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}}/>
</$keyboard>
</$set>
</span>
<span class="tc-edit-field-add-button">
<$macrocall $name="new-field"/>
</span>
</div>
</$fieldmangler>
\whitespace trim
\define lingo-base() $:/language/EditTemplate/
\define tag-styles()
background-color:$(backgroundColor)$;
fill:$(foregroundColor)$;
color:$(foregroundColor)$;
\end
\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon)
\whitespace trim
<$vars foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">> backgroundColor="""$colour$""">
<span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item">
<$transclude tiddler="""$icon$"""/><$view field="title" format="text" />
<$button message="tm-remove-tag" param={{!!title}} class="tc-btn-invisible tc-remove-tag-button">{{$:/core/images/close-button}}</$button>
</span>
</$vars>
\end
\define tag-body(colour,palette,icon)
<$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon="""$icon$"""/>
\end
<div class="tc-edit-tags">
<$fieldmangler>
<$list filter="[all[current]tags[]sort[title]]" storyview="pop">
<$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/>
</$list>
<$set name="tabIndex" value={{$:/config/EditTabIndex}}>
<$macrocall $name="tag-picker"/>
</$set>
</$fieldmangler>
</div>
\define lingo-base() $:/language/EditTemplate/
\whitespace trim
<div class="tc-type-selector"><$fieldmangler>
<em class="tc-edit"><<lingo Type/Prompt>></em> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>
</$fieldmangler></div>
<div class="tc-block-dropdown-wrapper">
<$set name="tv-show-missing-links" value="yes">
<$reveal state=<<qualify "$:/state/popup/type-dropdown">> type="nomatch" text="" default="">
<div class="tc-block-dropdown tc-edit-type-dropdown">
<$linkcatcher to="!!type">
<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>
<div class="tc-dropdown-item">
<$text text={{!!group}}/>
</div>
<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]"><$link to={{!!name}}><$view field="description"/> (<$view field="name"/>)</$link>
</$list>
</$list>
</$linkcatcher>
</div>
</$reveal>
</$set>
</div>
\define title-styles()
fill:$(foregroundColor)$;
\end
\define config-title()
$:/config/ViewToolbarButtons/Visibility/$(listItem)$
\end
<div class="tc-tiddler-title">
<div class="tc-titlebar">
<span class="tc-tiddler-controls">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]" variable="listItem"><$reveal type="nomatch" state=<<config-title>> text="hide"><$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>
</span>
<$set name="tv-wikilinks" value={{$:/config/Tiddlers/TitleLinks}}>
<$link>
<$set name="foregroundColor" value={{!!color}}>
<span class="tc-tiddler-title-icon" style=<<title-styles>>>
<$transclude tiddler={{!!icon}}/>
</span>
</$set>
<$list filter="[all[current]removeprefix[$:/]]">
<h2 class="tc-title" title={{$:/language/SystemTiddler/Tooltip}}>
<span class="tc-system-title-prefix">$:/</span><$text text=<<currentTiddler>>/>
</h2>
</$list>
<$list filter="[all[current]!prefix[$:/]]">
<h2 class="tc-title">
<$view field="title"/>
</h2>
</$list>
</$link>
</$set>
</div>
<$reveal type="nomatch" text="" default="" state=<<tiddlerInfoState>> class="tc-tiddler-info tc-popup-handle" animate="yes" retain="yes">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]" variable="listItem"><$transclude tiddler=<<listItem>> mode="block"/></$list>
</$reveal>
</div>
[[Learnings 2022]] [[Goals 2021]]
sumitkant/sumitkant.github.io
{
"tiddlers": {
"Untitled 1": {
"title": "Untitled 1",
"text": "New Tiddler 2"
}
}
}
Create a new tiddler that links to this one
Create a new journal tiddler that links to this one
.bm-table {margin:0 auto;}
.bm-table, .bm-table th, .bm-table td {
border:0; background:white;
}
.bm-input-table {width:100%;}
.bm-input-table > tr > td:nth-child(2) {max-width:300px;}
.bm-input-table select {max-width:calc(100% - 50px - 1.2em);}
.bm-fieldeditor {max-width:calc(100% - 1.2em);}
.bm-relations-table {margin-top:4em;}
.bm-table th.rotate {
white-space: nowrap;
vertical-align:bottom;
}
.bm-table th.rotate > div {
transform: translate(27px, -.5em) rotate(315deg);
width: 1em;
margin-left:-1em;
}
.bm-table th.rotate > div > span {
border-bottom: 1px solid #ccc;
padding: 0px 10px 2px 0;
margin-left:-.6em;
background:white;
}
.bm-table ::-webkit-input-placeholder { color: #a6a6a6; }
.bm-table :-ms-input-placeholder { color: #a6a6a6; }
.bm-table ::-ms-input-placeholder { color: #a6a6a6; }
.bm-table ::-moz-placeholder { color: #a6a6a6; }
.bm-singledata-table-head {border-bottom:2px solid silver}
.bm-btn {width:1em;}
.bm-btn-addtofilter {color:blue; }
.bm-btn-add, .tm-add-tag, .tm-add-field { background:lightgray;}
.bm-btn-remove, .tm-remove-tag, .tm-remove-field {background:lightgreen;}
.peek {display:none;z-index:2;background-color:lightgray;position:absolute;}
.peek-hover:hover .peek {display:block; background:lightgray;}
.bm-tooltip {position:absolute; display:none; z-index:2;background:white; margin:-2.6em -1em; border:1px solid silver; padding:0 5px; color:black;white-space:nowrap;}
.bm-btn-tooltip:hover .bm-tooltip {display:block;}
.bm-fontsmall {font-size:.8em; fill:gray;}
.bm-center {text-align:center; vertical-align:text-bottom;}
.bm-fontsmall svg,
.bm-fontsmall input[type="checkbox"] {vertical-align:text-top}
.bm-alert {border-color:red;}
.bm-drag {background:#ec6; border-radius:1em; padding:0; line-height:1.1em; width:3em; display:inline-block;}
button.green-link {color:#00cc00;}
alert-background: #ffe476
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #ffffff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #01c7fc
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: #ffffff
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: #048df6
external-link-foreground-visited: #048df6
foreground: #404040
message-background: #ecf2ff
message-border: #cfd6e6
message-foreground: #547599
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: #999999
modal-footer-background: #f5f5f5
modal-footer-border: #dddddd
modal-header-border: #eeeeee
muted-foreground: #999999
notification-background: #ffffdd
notification-border: #999999
page-background: #ebebeb
pre-background: #f5f5f5
pre-border: #ffffff
primary: #7897f3
select-tag-background:
select-tag-foreground:
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: #ccc
sidebar-foreground-shadow: rgba(255,255,255, 0.8)
sidebar-foreground: #605c5c
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #ffffff
sidebar-tab-background: <<colour tab-background>>
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: <<colour tab-divider>>
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #0687ea
sidebar-tiddler-link-foreground: #0687ea
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #eeeeee
tab-border-selected: #cccccc
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: #a3e3ff
tag-foreground: #000
tiddler-background: <<colour background>>
tiddler-border: #ffffff
tiddler-controls-foreground-hover: #888888
tiddler-controls-foreground-selected: #444444
tiddler-controls-foreground: #cccccc
tiddler-editor-background: #fafafa
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #ffffff
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #e8e8e8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: #eb0071
tiddler-subtitle-foreground: #787878
tiddler-title-foreground: #000000
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
.matched {background-color:#ffc;}
.tw-context {
border:0px solid #eee;background-color:#eee;
word-break: break-all; word-wrap: break-word;}
{
"tiddlers": {
"$:/plugins/danielo515/ContextPlugin/widgets/context.js": {
"created": "20140418153435777",
"creator": "danielo",
"modified": "20140530231943517",
"modifier": "danielo",
"module-type": "widget",
"title": "$:/plugins/danielo515/ContextPlugin/widgets/context.js",
"type": "application/javascript",
"text": "/*\\\\\ntitle: $:/core/modules/widgets/danielo/context-widget.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar contextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\ncontextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\ncontextWidget.prototype.render = function(parent,nextSibling) {\n // Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n \n if(this.term && this.term.length>3){\n \n this.createRegexp();\n var matches = this.executeRegexp();\n\t if(matches.length > 0){ \n this.domNode = this.document.createElement(this.element);\n this.domNode.className=\"tw-context\";\n this.composeResults( matches ); //this appends to domNode \n \t// Insert element\n \tparent.insertBefore(this.domNode,nextSibling);\n \tthis.renderChildren(this.domNode,null);\n\t \tthis.domNodes.push(this.domNode);\n }\n }\n\t\n};\n\n/*\nCompute the internal state of the widget\n*/\ncontextWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n this.matchedClass = this.getAttribute(\"matchClass\",\"matched\");\n\tthis.tiddler = this.getAttribute( \"tiddler\",this.getVariable(\"currentTiddler\") );\n this.term = this.getAttribute(\"term\",this.getAttribute(\"searchTerm\"));\n\tthis.contextLength = this.getAttribute(\"length\",50);\n this.before = this.getAttribute(\"before\",this.contextLength);\n this.after = this.getAttribute(\"after\",this.contextLength);\n this.maxMatches = this.getAttribute(\"maxMatches\",10);\n this.element = this.getAttribute(\"element\",\"pre\");\n\tthis.makeChildWidgets();\n};\n\n /*Create the regular expression*/\ncontextWidget.prototype.createRegexp = function()\n{\n var regString = \"(\\\\w+[\\\\s\\\\S]{0,#before#})?(#term#)([\\\\s\\\\S]{0,#after#}\\\\w+)?\";\n\n var regString = regString.replace(\"#before#\",this.before).replace(\"#term#\", $tw.utils.escapeRegExp(this.term) ) .replace(\"#after#\",this.after);\n this.regexp = new RegExp(regString,\"ig\");\n //console.log(regString);\n};\n/*\nexecute the regular expresion\n*/\ncontextWidget.prototype.executeRegexp = function()\n{\n var text = this.wiki.getTiddlerText(this.tiddler), match,results = new Array();\n while( (match = this.regexp.exec( text ) ) && (results.length < this.maxMatches) )\n { results.push(match) }\n //console.log(\"matches\",results);\n return results;\n};\n\n/*\ncompose the results\nmatches : array of match objects from regular expression execute\n*/\ncontextWidget.prototype.composeResults = function(matches){\n var result=[], self=this, node = this.domNode,\n dots = textNode(\"...\\n\"),\n span = matchedNode( this.term );\n\n for(var i=0; i < matches.length; i++){\n processMatch( matches[i] );\n }\n \n function processMatch(match){\n if( match.index !== 0) node.appendChild( dots.cloneNode(true) );\n for( var i=1;i<match.length;i++ ) {//match[0] full matched text (all groups together)\n if( match[i] ) {\n if ( match[i].toLowerCase() == self.term.toLowerCase() ) \n node.appendChild( match[i] == self.term ? span.cloneNode(true) : matchedNode( match[i] ) )\n else\n node.appendChild( textNode( match[i]) )\n }\n }\n if( match.index + match[0].length < match.input.length) node.appendChild( dots.cloneNode(true) );\n }\n \n function textNode(text){ return self.document.createTextNode(text) }\n function matchedNode(text) { \n var node = self.document.createElement(\"span\"); node.appendChild( textNode(text) ); node.className = self.matchedClass;\n return node }\n \n};\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\ncontextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.term || changedAttributes.length || changedAttributes.matchedClass) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n return this.refreshChildren(changedTiddlers);\n};\n\nexports.context = contextWidget;\n\n})();"
},
"$:/plugins/danielo515/ContextPlugin/visualizer": {
"title": "$:/plugins/danielo515/ContextPlugin/visualizer",
"tags": "$:/tags/SearchResults",
"caption": "Context",
"text": "<$list filter=\"[!is[system]search{$:/temp/search}sort[title]limit[250]]\">\r\n {{!!title||$:/core/ui/ListItemTemplate}}\r\n <$context term={{$:/temp/search}} />\r\n</$list>\r\n"
},
"$:/plugins/danielo515/ContextPlugin/Stylesheet/results": {
"created": "20140529162823729",
"tags": "$:/tags/Stylesheet contextPlugin",
"title": "$:/plugins/danielo515/ContextPlugin/Stylesheet/results",
"type": "text/css",
"text": ".matched{background-color:yellow}\n.tw-context {/*border:1px solid;\n /*word-break: break-all; word-wrap: break-word*/}"
},
"$:/plugins/danielo515/ContextPlugin/Caption": {
"created": "20140530174219263",
"tags": "contextPlugin",
"title": "$:/plugins/danielo515/ContextPlugin/Caption",
"type": "text/vnd.tiddlywiki",
"text": "Context search"
},
"Context Search": {
"caption": "{{$:/plugins/danielo515/ContextPlugin/Caption}}",
"created": "20140530173407542",
"tags": "$:/tags/AdvancedSearch",
"title": "Context Search",
"type": "text/vnd.tiddlywiki",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tw-search\"><$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/><$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\"> <$link to=\"\" class=\"btn-invisible\">{{$:/core/images/close-button}}</$link></$reveal></div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<div class=\"tw-search-results\">\n\n<<lingo Standard/Matches>>\n\n<$list filter=\"[!is[system]search{$:/temp/advancedsearch}sort[title]limit[250]]\">\n{{!!title||$:/core/ui/ListItemTemplate}}\n<$context term={{$:/temp/advancedsearch}}/>\n</$list>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/plugins/danielo515/ContextPlugin/readme": {
"title": "$:/plugins/danielo515/ContextPlugin/readme",
"text": "!Usage\n\nAfter installing the plugin you will have a new tab in [[$:/AdvancedSearch]] called [[Context Search]]. If you want this functionality in other places you will have to edit the desired tiddler yourself adding the ''context widget''. For more details about using the widget see the section below.\n\n!!Using the widget\n\nThe very basic usage of the widget is the following:\n\n```\r\n<$context term=\"lorem\"/>\r\n```\r\nWhich will render as:\r\n<$context term=\"lorem\"/>\n\nThe widgets will search inside the current tiddler by default. Because that you see the same content twice here. This example is not very useful. Other more meaningful would be:\n\n```\r\n<$list filter=\"[search{$:/temp/advancedsearch}sort[title]limit[250]]\">\r\n{{!!title||$:/core/ui/ListItemTemplate}}\r\n<$context term={{$:/temp/advancedsearch}}/>\r\n</$list>\r\n```\n\nThat will search for tiddlers containing the text specified in [[$:/temp/advancedsearch]] and will display a link to the matching tiddlers plus a preview of the matching content. Something very similar is used in [[Context Search]]. Below you can find a complete list of parameters and their default values.\n\n|! parameter |! description | !default |\r\n| term | The term you want to search ||\r\n| searchTerm | An alias for the previous one ||\r\n| tiddler | The tiddler's name to look into | current tiddler |\r\n| length | Number of context characters to show | 50 |\r\n| before | Number of characters before the matched term to show | the value of the length parameter |\r\n| after | Number of characters after the matched term to show | the value of the length parameter |\r\n| maxMatches | maximun number of matched elements to show. Incrementing this can cause several performance issues | 10 |\r\n| element | Node element to create. This element will contain the results of the search. If you want to style it its class is `tw-context` | `<pre>` |\r\n| matchClass | The css class to assign to the matched terms in the results. This is used to highlight the results | matched |\n\n!Customizing the output\r\nThere are not many ways to customize the output of this widget. You can specify ''what type of node you want to create'' to wrap the results (div,span...). The default is `<pre>`. This container is created with the class `tw-context` so you can easily apply styles to it. Something similar happens to the ''highlighted'' words. You can specify the name of the class to assign to it and also you can apply styles to that class.\n\nA very basic example of customization could be:\n\n# Create a tiddler, for example [[$/plugins/danielo515/context/css]]\r\n# Paste the following text or any css rule you want: \"\"\"\n\n<pre>\r\n.matched{background-color:yellow}\r\n.tw-context {\r\n border:1px solid blue;\r\n word-break: break-all; word-wrap: break-word;}\r\n</pre>\r\n\"\"\"\r\n# Tag it with `$:/tags/stylesheet`\r\n# Save the tiddler"
}
}
}
/*\\
title: $:/core/modules/widgets/danielo/context-widget.js
type: application/javascript
module-type: widget
Edit-text widget
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tc: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget;
var contextWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
contextWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
contextWidget.prototype.render = function(parent,nextSibling) {
// Save the parent dom node
this.parentDomNode = parent;
// Compute our attributes
this.computeAttributes();
// Execute our logic
this.execute();
if(this.term && this.term.length>3){
this.createRegexp();
var matches = this.executeRegexp();
if(matches.length > 0){
this.domNode = this.document.createElement(this.element);
this.domNode.className="tw-context";
this.composeResults( matches ); //this appends to domNode
// Insert element
parent.insertBefore(this.domNode,nextSibling);
this.renderChildren(this.domNode,null);
this.domNodes.push(this.domNode);
}
}
};
/*
Compute the internal state of the widget
*/
contextWidget.prototype.execute = function() {
// Get the parameters from the attributes
this.matchedClass = this.getAttribute("matchClass","matched");
this.tiddler = this.getAttribute( "tiddler",this.getVariable("currentTiddler") );
this.term = this.getAttribute("term",this.getAttribute("searchTerm"));
this.contextLength = this.getAttribute("length",50);
this.before = this.getAttribute("before",this.contextLength);
this.after = this.getAttribute("after",this.contextLength);
this.maxMatches = this.getAttribute("maxMatches",10);
this.element = this.getAttribute("element","pre");
this.makeChildWidgets();
};
/*Create the regular expression*/
contextWidget.prototype.createRegexp = function()
{
var regString = "(\\w+[\\s\\S]{0,#before#})?(#term#)([\\s\\S]{0,#after#}\\w+)?";
var regString = regString.replace("#before#",this.before).replace("#term#", $tw.utils.escapeRegExp(this.term) ) .replace("#after#",this.after);
this.regexp = new RegExp(regString,"ig");
//console.log(regString);
};
/*
execute the regular expresion
*/
contextWidget.prototype.executeRegexp = function()
{
var text = this.wiki.getTiddlerText(this.tiddler), match,results = new Array();
while( (match = this.regexp.exec( text ) ) && (results.length < this.maxMatches) )
{ results.push(match) }
//console.log("matches",results);
return results;
};
/*
compose the results
matches : array of match objects from regular expression execute
*/
contextWidget.prototype.composeResults = function(matches){
var result=[], self=this, node = this.domNode,
dots = textNode("...\n"),
span = matchedNode( this.term );
for(var i=0; i < matches.length; i++){
processMatch( matches[i] );
}
function processMatch(match){
if( match.index !== 0) node.appendChild( dots.cloneNode(true) );
for( var i=1;i<match.length;i++ ) {//match[0] full matched text (all groups together)
if( match[i] ) {
if ( match[i].toLowerCase() == self.term.toLowerCase() )
node.appendChild( match[i] == self.term ? span.cloneNode(true) : matchedNode( match[i] ) )
else
node.appendChild( textNode( match[i]) )
}
}
if( match.index + match[0].length < match.input.length) node.appendChild( dots.cloneNode(true) );
}
function textNode(text){ return self.document.createTextNode(text) }
function matchedNode(text) {
var node = self.document.createElement("span"); node.appendChild( textNode(text) ); node.className = self.matchedClass;
return node }
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
contextWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
if(changedAttributes.tiddler || changedAttributes.term || changedAttributes.length || changedAttributes.matchedClass) {
this.refreshSelf();
return true;
}
return this.refreshChildren(changedTiddlers);
};
exports.context = contextWidget;
})();
{
"tiddlers": {
"$:/plugins/flibbles/relink/js/bulkops.js": {
"text": "/*\\\nmodule-type: startup\n\nReplaces the relinkTiddler defined in $:/core/modules/wiki-bulkops.js\n\nThis is a startup instead of a wikimethods module-type because it's the only\nway to ensure this runs after the old relinkTiddler method is applied.\n\n\\*/\n(function(){\n\n/*jslint node: false, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\n\nexports.name = \"redefine-relinkTiddler\";\nexports.synchronous = true;\n// load-modules is when wikimethods are applied in\n// ``$:/core/modules/startup/load-modules.js``\nexports.after = ['load-modules'];\n\nexports.startup = function() {\n\t$tw.Wiki.prototype.relinkTiddler = relinkTiddler;\n};\n\n/** Walks through all relinkable tiddlers and relinks them.\n * This replaces the existing function in core Tiddlywiki.\n */\nfunction relinkTiddler(fromTitle, toTitle, options) {\n\tvar self = this;\n\tvar failures = [];\n\tvar records = this.getRelinkReport(fromTitle, toTitle, options);\n\tfor (var title in records) {\n\t\tvar entries = records[title];\n\t\tvar changes = Object.create(null);\n\t\tvar update = false;\n\t\tfor (var field in entries) {\n\t\t\tvar entry = entries[field];\n\t\t\tlanguage.eachImpossible(entry, function() {\n\t\t\t\tfailures.push(title);\n\t\t\t});\n\t\t\tlanguage.logAll(entry, title, fromTitle, toTitle, options);\n\t\t\tif (entry && entry.output) {\n\t\t\t\tchanges[field] = entry.output;\n\t\t\t\tupdate = true;\n\t\t\t}\n\t\t}\n\t\t// If any fields changed, update tiddler\n\t\tif (update) {\n\t\t\tvar tiddler = this.getTiddler(title);\n\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,changes,self.getModificationFields())\n\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\tself.addTiddler(newTiddler);\n\t\t}\n\t};\n\tif (failures.length > 0) {\n\t\tvar options = $tw.utils.extend(\n\t\t\t{ variables: {to: toTitle, from: fromTitle},\n\t\t\t wiki: this},\n\t\t\toptions );\n\t\tlanguage.reportFailures(failures, options);\n\t}\n};\n\n})();\n",
"module-type": "startup",
"title": "$:/plugins/flibbles/relink/js/bulkops.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/language.js": {
"text": "/*\\\nmodule-type: library\n\nThis handles all logging and alerts Relink emits.\n\n\\*/\n\nvar prettylink = require(\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js\");\nvar Placeholder = require(\"$:/plugins/flibbles/relink/js/utils/placeholder.js\");\n\nexports.eachImpossible = function(rootEntry, method) {\n\tif (rootEntry.eachChild) {\n\t\trootEntry.eachChild(function(child) {\n\t\t\texports.eachImpossible.call(this, child, method);\n\t\t});\n\t}\n\tif (rootEntry.impossible) {\n\t\tmethod(rootEntry);\n\t}\n};\n\nexports.logAll = function(entry, title, from, to, options) {\n\tvar raw = exports.log[entry.name];\n\tif (entry.impossible) {\n\t\treturn;\n\t}\n\tif (raw) {\n\t\texports.logRelink(raw, entry, title, from, to, options);\n\t\treturn;\n\t}\n\tif (entry.eachChild) {\n\t\tentry.eachChild(function(child) {\n\t\t\texports.logAll(child, title, from, to, options);\n\t\t});\n\t}\n};\n\nexports.logRelink = function(raw, args, title, from, to, options) {\n\traw = \"Renaming '\"+from+\"' to '\"+to+\"' in \" + raw + \" of tiddler '\"+title+\"'\";\n\t// This is cheap, but whatevs. To do a proper\n\t// rendering would require working through a wiki\n\t// object. Too heavy weight for log messages.\n\tvar msg = raw.replace(/<<([^<>]+)>>/g, function(match, key) {\n\t\tvar value = args[key];\n\t\tif (key === \"field\") {\n\t\t\tvalue = descriptor(value);\n\t\t};\n\t\treturn value || (\"<<\"+key+\">>\");\n\t});\n\tconsole.log(msg);\n};\n\n// This wraps alert so it can be monkeypatched during testing.\nexports.alert = function(message) {\n\talert(message);\n};\n\nexports.getString = function(title, options) {\n\ttitle = \"$:/plugins/flibbles/relink/language/\" + title;\n\treturn options.wiki.renderTiddler(\"text/plain\", title, options);\n};\n\nvar logger;\n\nexports.reportFailures = function(failureList, options) {\n\tif (!logger) {\n\t\tlogger = new $tw.utils.Logger(\"Relinker\");\n\t}\n\tvar alertString = this.getString(\"Error/ReportFailedRelinks\", options)\n\tvar placeholder = new Placeholder(options);\n\tvar phOptions = $tw.utils.extend({placeholder: placeholder}, options);\n\tvar alreadyReported = Object.create(null);\n\tvar reportList = [];\n\t$tw.utils.each(failureList, function(f) {\n\t\tif (!alreadyReported[f]) {\n\t\t\tif ($tw.browser) {\n\t\t\t\treportList.push(\"\\n* \" + prettylink.makeLink(f, undefined, phOptions));\n\t\t\t} else {\n\t\t\t\treportList.push(\"\\n* \" + f);\n\t\t\t}\n\t\t\talreadyReported[f] = true;\n\t\t}\n\t});\n\tlogger.alert(placeholder.getPreamble() + alertString + \"\\n\" + reportList.join(\"\"));\n};\n\nexports.log = {\n\t\"html\": \"<<<element>> /> element\",\n\t\"field\": \"<<field>>\",\n\t\"filteredtransclude\": \"filtered transclusion\",\n\t\"image\": \"image\",\n\t\"import\": \"\\\\import filter\",\n\t\"macrodef\": \"<<macro>> definition\",\n\t\"prettylink\": \"prettylink\",\n\t\"syslink\": \"syslink\",\n\t\"transclude\": \"transclusion\",\n\t\"wikilink\": \"CamelCase link\",\n};\n\nfunction descriptor(field) {\n\tif (field === \"tags\") {\n\t\treturn \"tags\";\n\t} else {\n\t\treturn field + \" field\" ;\n\t}\n};\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/language.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/mangler.js": {
"text": "/*\\\nmodule-type: widget\n\nCreates a mangler widget for field validation. This isn't meant to be used\nby the user. It's only used in Relink configuration.\n\n\\*/\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\n\nvar RelinkManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"relink-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"relink-add-operator\", handler: \"handleAddOperatorEvent\"},\n\t\t{type: \"relink-add-parameter\", handler: \"handleAddParameterEvent\"},\n\t\t{type: \"relink-add-attribute\", handler: \"handleAddAttributeEvent\"}\n\t]);\n};\n\nexports.relinkmangler = RelinkManglerWidget;\n\nRelinkManglerWidget.prototype = new Widget();\n\nRelinkManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar param = event.paramObject;\n\tif (typeof param !== \"object\" || !param.field) {\n\t\t// Can't handle it.\n\t\treturn true;\n\t}\n\tvar trimmedName = param.field.toLowerCase().trim();\n\tif (!trimmedName) {\n\t\t// Still can't handle it, but don't warn.\n\t\treturn true;\n\t}\n\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\tlanguage.alert($tw.language.getString(\n\t\t\t\"InvalidFieldName\",\n\t\t\t{variables:\n\t\t\t\t{fieldName: trimmedName}\n\t\t\t}\n\t\t));\n\t} else {\n\t\tadd(this.wiki, \"fields\", trimmedName);\n\t}\n\treturn true;\n};\n\n/**Not much validation, even though there are definitely illegal\n * operator names. If you input on, Relink won't relink it, but it\n * won't choke on it either. Tiddlywiki will...\n */\nRelinkManglerWidget.prototype.handleAddOperatorEvent = function(event) {\n\tvar param = event.paramObject;\n\tif (param) {\n\t\tadd(this.wiki, \"operators\", param.operator);\n\t}\n\treturn true;\n};\n\nRelinkManglerWidget.prototype.handleAddParameterEvent = function(event) {\n\tvar param = event.paramObject;\n\tif (param && param.macro && param.parameter) {\n\t\tif (/\\s/.test(param.macro.trim())) {\n\t\t\tlanguage.alert(language.getString(\n\t\t\t\t\"Error/InvalidMacroName\",\n\t\t\t\t{ variables: {macroName: param.macro},\n\t\t\t\t wiki: this.wiki\n\t\t\t\t}\n\t\t\t));\n\t\t} else if (/[ \\/]/.test(param.parameter.trim())) {\n\t\t\tlanguage.alert(language.getString(\n\t\t\t\t\"Error/InvalidParameterName\",\n\t\t\t\t{ variables: {parameterName: param.parameter},\n\t\t\t\t wiki: this.wiki\n\t\t\t\t}\n\t\t\t));\n\t\t} else {\n\t\t\tadd(this.wiki, \"macros\", param.macro, param.parameter);\n\t\t}\n\t}\n\treturn true;\n};\n\nRelinkManglerWidget.prototype.handleAddAttributeEvent = function(event) {\n\tvar param = event.paramObject;\n\tif (param && param.element && param.attribute) {\n\t\tif (/[ \\/]/.test(param.element.trim())) {\n\t\t\tlanguage.alert(language.getString(\n\t\t\t\t\"Error/InvalidElementName\",\n\t\t\t\t{ variables: {elementName: param.element},\n\t\t\t\t wiki: this.wiki\n\t\t\t\t}\n\t\t\t));\n\t\t} else if (/[ \\/]/.test(param.attribute.trim())) {\n\t\t\tlanguage.alert(language.getString(\n\t\t\t\t\"Error/InvalidAttributeName\",\n\t\t\t\t{ variables: {attributeName: param.attribute},\n\t\t\t\t wiki: this.wiki\n\t\t\t\t}\n\t\t\t));\n\t\t} else {\n\t\t\tadd(this.wiki, \"attributes\", param.element, param.attribute);\n\t\t}\n\t}\n\treturn true;\n};\n\nfunction add(wiki, category/*, path parts*/) {\n\tvar path = \"$:/config/flibbles/relink/\" + category;\n\tfor (var x = 2; x < arguments.length; x++) {\n\t\tvar part = arguments[x];\n\t\t// Abort if it's falsy, or only whitespace. Also, trim spaces\n\t\tif (!part || !(part = part.trim())) {\n\t\t\treturn;\n\t\t}\n\t\tpath = path + \"/\" + part;\n\t}\n\tvar def = settings.getDefaultType(wiki);\n\twiki.addTiddler({title: path, text: def});\n};\n",
"module-type": "widget",
"title": "$:/plugins/flibbles/relink/js/mangler.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/settings.js": {
"text": "/*\\\nmodule-type: library\n\nThis handles the fetching and distribution of relink settings.\n\n\\*/\n\nvar fieldTypes = Object.create(null);\nvar surveyors = [];\nvar prefix = \"$:/config/flibbles/relink/\";\n\n$tw.modules.forEachModuleOfType(\"relinkfieldtype\", function(title, exports) {\n\tfunction NewType() {};\n\tNewType.prototype = exports;\n\tNewType.typeName = exports.name;\n\tfieldTypes[exports.name] = NewType;\n\t// For legacy reasons, some of the field types can go by other names\n\tif (exports.aliases) {\n\t\t$tw.utils.each(exports.aliases, function(alias) {\n\t\t\tfieldTypes[alias] = NewType;\n\t\t});\n\t}\n});\n\n$tw.modules.forEachModuleOfType(\"relinksurveyor\", function(title, exports) {\n\tsurveyors.push(exports);\n});\n\nfunction Settings(wiki) {\n\tthis.settings = compileSettings(wiki);\n\tthis.wiki = wiki;\n};\n\nmodule.exports = Settings;\n\n/**Returns a specific relinker.\n * This is useful for wikitext rules which need to parse a filter or a list\n */\nSettings.getType = function(name) {\n\tvar Handler = fieldTypes[name];\n\treturn Handler ? new Handler() : undefined;\n};\n\nSettings.getTypes = function() {\n\t// We don't return fieldTypes, because we don't want it modified,\n\t// and we need to filter out legacy names.\n\tvar rtn = Object.create(null);\n\tfor (var type in fieldTypes) {\n\t\tvar typeObject = fieldTypes[type];\n\t\trtn[typeObject.typeName] = typeObject;\n\t}\n\treturn rtn;\n};\n\nSettings.getDefaultType = function(wiki) {\n\tvar tiddler = wiki.getTiddler(\"$:/config/flibbles/relink/settings/default-type\");\n\tvar defaultType = tiddler && tiddler.fields.text;\n\t// make sure the default actually exists, otherwise default\n\treturn fieldTypes[defaultType] ? defaultType : \"title\";\n};\n\nSettings.prototype.survey = function(text, fromTitle, options) {\n\tif (text) {\n\t\tfor (var i = 0; i < surveyors.length; i++) {\n\t\t\tif (surveyors[i].survey(text, fromTitle, options)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nSettings.prototype.getAttribute = function(elementName) {\n\treturn this.settings.attributes[elementName];\n};\n\nSettings.prototype.getAttributes = function() {\n\treturn flatten(this.settings.attributes);\n};\n\n\nSettings.prototype.getFields = function() {\n\treturn this.settings.fields;\n};\n\nSettings.prototype.getOperators = function() {\n\treturn this.settings.operators;\n};\n\nSettings.prototype.getMacro = function(macroName) {\n\treturn this.settings.macros[macroName];\n};\n\nSettings.prototype.getMacros = function() {\n\treturn flatten(this.settings.macros);\n};\n\nSettings.prototype.refresh = function(changes) {\n\tfor (var title in changes) {\n\t\tif (title.substr(0, prefix.length) === prefix) {\n\t\t\tthis.settings = compileSettings(this.wiki);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/**Factories define methods that create settings given config tiddlers.\n * for factory method 'example', it will be called once for each:\n * \"$:/config/flibbles/relink/example/...\" tiddler that exists.\n * the argument \"key\" will be set to the contents of \"...\"\n *\n * The reason I build relink settings in this convoluted way is to minimize\n * the number of times tiddlywiki has to run through EVERY tiddler looking\n * for relink config tiddlers.\n *\n * Also, by exporting \"factories\", anyone who extends relink can patch in\n * their own factory methods to create settings that are generated exactly\n * once per rename.\n */\nexports.factories = {\n\tattributes: function(attributes, data, key) {\n\t\tvar elem = root(key);\n\t\tvar attr = key.substr(elem.length+1);\n\t\tattributes[elem] = attributes[elem] || Object.create(null);\n\t\tattributes[elem][attr] = data;\n\t},\n\tfields: function(fields, data, name) {\n\t\tfields[name] = data;\n\t},\n\tmacros: function(macros, data, key) {\n\t\t// We take the last index, not the first, because macro\n\t\t// parameters can't have slashes, but macroNames can.\n\t\tvar name = dir(key);\n\t\tvar arg = key.substr(name.length+1);\n\t\tmacros[name] = macros[name] || Object.create(null);\n\t\tmacros[name][arg] = data;\n\t},\n\toperators: function(operators, data, name) {\n\t\toperators[name] = data;\n\t}\n};\n\nfunction compileSettings(wiki) {\n\tvar settings = Object.create(null);\n\tfor (var name in exports.factories) {\n\t\tsettings[name] = Object.create(null);\n\t}\n\twiki.eachShadowPlusTiddlers(function(tiddler, title) {\n\t\tif (title.substr(0, prefix.length) === prefix) {\n\t\t\tvar remainder = title.substr(prefix.length);\n\t\t\tvar category = root(remainder);\n\t\t\tvar factory = exports.factories[category];\n\t\t\tif (factory) {\n\t\t\t\tvar name = remainder.substr(category.length+1);\n\t\t\t\tvar Handler = fieldTypes[tiddler.fields.text];\n\t\t\t\tif (Handler) {\n\t\t\t\t\tvar data = new Handler();\n\t\t\t\t\tdata.source = title;\n\t\t\t\t\t// Secret feature. You can access a config tiddler's\n\t\t\t\t\t// fields from inside the fieldtype handler. Cool\n\t\t\t\t\t// tricks can be done with this.\n\t\t\t\t\tdata.fields = tiddler.fields;\n\t\t\t\t\tfactory(settings[category], data, name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn settings;\n};\n\n/* Returns first bit of a path. path/to/tiddler -> path\n */\nfunction root(string) {\n\tvar index = string.indexOf('/');\n\tif (index >= 0) {\n\t\treturn string.substr(0, index);\n\t}\n};\n\n/* Returns all but the last bit of a path. path/to/tiddler -> path/to\n */\nfunction dir(string) {\n\tvar index = string.lastIndexOf('/');\n\tif (index >= 0) {\n\t\treturn string.substr(0, index);\n\t}\n}\n\nfunction flatten(set) {\n\tvar signatures = Object.create(null);\n\tfor (var outerName in set) {\n\t\tvar setItem = set[outerName];\n\t\tfor (var innerName in setItem) {\n\t\t\tsignatures[outerName + \"/\" + innerName] = setItem[innerName];\n\t\t}\n\t}\n\treturn signatures;\n};\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/settings.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/wikimethods.js": {
"text": "/*\\\nmodule-type: wikimethod\n\nIntroduces some utility methods used by Relink.\n\n\\*/\n\nvar MacroSettings = require('$:/plugins/flibbles/relink/js/utils/macroConfig.js');\nvar Settings = require(\"$:/plugins/flibbles/relink/js/settings.js\");\n\nvar relinkOperations = Object.create(null);\n$tw.modules.applyMethods('relinkoperator', relinkOperations);\n\n/** Returns a pair like this,\n * { title: {field: entry, ... }, ... }\n */\nexports.getRelinkReport = function(fromTitle, toTitle, options) {\n\tvar cache = this.getGlobalCache(\"relink-\"+fromTitle, function() {\n\t\treturn Object.create(null);\n\t});\n\tif (!cache[toTitle]) {\n\t\tcache[toTitle] = getFreshRelinkReport(this, fromTitle, toTitle, options);\n\t}\n\treturn cache[toTitle];\n};\n\nfunction getFreshRelinkReport(wiki, fromTitle, toTitle, options) {\n\toptions = options || {};\n\toptions.wiki = options.wiki || wiki;\n\toptions.settings = wiki.getRelinkConfig();\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\tvar changeList = Object.create(null);\n\tif(fromTitle && toTitle) {\n\t\tvar tiddlerList = wiki.getRelinkableTitles();\n\t\tfor (var i = 0; i < tiddlerList.length; i++) {\n\t\t\tvar title = tiddlerList[i];\n\t\t\tvar tiddler = wiki.getTiddler(title);\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(tiddler\n\t\t\t&& !tiddler.fields[\"plugin-type\"]\n\t\t\t&& tiddler.fields.type !== \"application/javascript\") {\n\t\t\t\ttry {\n\t\t\t\t\tvar entries = Object.create(null);\n\t\t\t\t\tfor (var operation in relinkOperations) {\n\t\t\t\t\t\trelinkOperations[operation](tiddler, fromTitle, toTitle, entries, options);\n\t\t\t\t\t}\n\t\t\t\t\tfor (var field in entries) {\n\t\t\t\t\t\t// So long as there is one key,\n\t\t\t\t\t\t// add it to the change list.\n\t\t\t\t\t\tchangeList[title] = entries;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Should we test for instanceof Error instead?: yes\n\t\t\t\t\t// Does that work in the testing environment?: no\n\t\t\t\t\tif (e.message) {\n\t\t\t\t\t\te.message = e.message + \"\\nWhen relinking '\" + title + \"'\";\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn changeList;\n};\n\nexports.getRelinkableTitles = function() {\n\tvar toUpdate = \"$:/config/flibbles/relink/to-update\";\n\tvar self = this;\n\treturn this.getCacheForTiddler(toUpdate, \"relink-toUpdate\", function() {\n\t\tvar tiddler = self.getTiddler(toUpdate);\n\t\tif (tiddler) {\n\t\t\treturn self.compileFilter(tiddler.fields.text);\n\t\t} else {\n\t\t\treturn self.allTitles;\n\t\t}\n\t})();\n};\n\n\nexports.getRelinkConfig = function() {\n\tif (this._relinkConfig === undefined) {\n\t\tvar settings = new Settings(this);\n\t\tvar config = new MacroSettings(this, settings);\n\t\tconfig.import( \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\");\n\t\t// All this below is just wiki.addEventListener, only it\n\t\t// puts the event in front, because we need to refresh our\n\t\t// relink settings before updating tiddlers.\n\t\tthis.eventListeners = this.eventListeners || {};\n\t\tthis.eventListeners.change = this.eventListeners.change || [];\n\t\tthis.eventListeners.change.unshift(function(changes) {\n\t\t\tconfig.refresh(changes);\n\t\t});\n\t\tthis._relinkConfig = config;\n\t}\n\treturn this._relinkConfig;\n};\n",
"module-type": "wikimethod",
"title": "$:/plugins/flibbles/relink/js/wikimethods.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/all_relinkable.js": {
"text": "/*\\\nmodule-type: allfilteroperator\n\nFilter function for [all[relinkable]].\nReturns all tiddlers subject to relinking.\n\n\\*/\n\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.relinkable = function(source,prefix,options) {\n\treturn options.wiki.getRelinkableTitles();\n};\n\n})();\n",
"module-type": "allfilteroperator",
"title": "$:/plugins/flibbles/relink/js/filteroperators/all_relinkable.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/impossible.js": {
"text": "/*\\\nmodule-type: relinkfilteroperator\n\nThis filter is meant for internal Relink use only, thus it's\nundocumented and subject to change. Also, it's really not great.\n\nGiven an input of targets, (possibly just one), outputs all the tiddlers in\nwhich Relink would fail to update <<currentTiddler>> to the operand in ALL\ncases.\n\n`[all[tiddlers+system]relink:impossible<toTiddler>]`\n\n\\*/\n\nvar language = require(\"$:/plugins/flibbles/relink/js/language.js\");\n\nexports.impossible = function(source,operator,options) {\n\tvar from = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tvar to = operator.operand,\n\t\tresults = [];\n\tif (from) {\n\t\tvar records = options.wiki.getRelinkReport(\n\t\t\tfrom, to, options);\n\t\tsource(function(tiddler, title) {\n\t\t\tvar fields = records[title];\n\t\t\tif (fields) {\n\t\t\t\tvar impossible = false;\n\t\t\t\tfor (var field in fields) {\n\t\t\t\t\tlanguage.eachImpossible(fields[field], function() {\n\t\t\t\t\t\timpossible = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (impossible) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n",
"module-type": "relinkfilteroperator",
"title": "$:/plugins/flibbles/relink/js/filteroperators/impossible.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/references.js": {
"text": "/*\\\nmodule-type: relinkfilteroperator\n\nGiven a title as an operand, returns all non-shadow tiddlers that have any\nsort of updatable reference to it.\n\n\n`relink:references[fromTiddler]]`\n\nReturns all tiddlers that reference `fromTiddler` somewhere inside them.\n\nInput is ignored. Maybe it shouldn't do this.\nAlso, maybe it should properly recon, instead of fake replacing the title with\n`__relink_dummy__`\n\\*/\n\nexports.references = function(source,operator,options) {\n\tvar fromTitle = operator.operand,\n\t\tresults = [];\n\tif (fromTitle) {\n\t\tvar records = options.wiki.getRelinkReport(\n\t\t\tfromTitle, \"$:/plugins/flibbles/relink/dummy\", options);\n\t\tfor (var title in records) {\n\t\t\tresults.push(title);\n\t\t}\n\t}\n\treturn results;\n};\n",
"module-type": "relinkfilteroperator",
"title": "$:/plugins/flibbles/relink/js/filteroperators/references.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/relink.js": {
"text": "/*\\\nmodule-type: filteroperator\n\nThis filter acts as a namespace for several small, simple filters, such as\n\n`[relink:impossible[]]`\n\n\\*/\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\n\nvar relinkFilterOperators;\n\nfunction getRelinkFilterOperators() {\n\tif(!relinkFilterOperators) {\n\t\trelinkFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"relinkfilteroperator\",\n\t\t relinkFilterOperators);\n\t}\n\treturn relinkFilterOperators;\n}\n\nexports.relink = function(source,operator,options) {\n\tvar suffixPair = parseSuffix(operator.suffix);\n\tvar relinkFilterOperator = getRelinkFilterOperators()[suffixPair[0]];\n\tif (relinkFilterOperator) {\n\t\tvar newOperator = $tw.utils.extend({}, operator);\n\t\tnewOperator.suffix = suffixPair[1];\n\t\treturn relinkFilterOperator(source, newOperator, options);\n\t} else {\n\t\treturn [language.getString(\"Error/RelinkFilterOperator\", options)];\n\t}\n};\n\nfunction parseSuffix(suffix) {\n\tvar index = suffix? suffix.indexOf(\":\"): -1;\n\tif (index >= 0) {\n\t\treturn [suffix.substr(0, index), suffix.substr(index+1)];\n\t} else {\n\t\treturn [suffix];\n\t}\n}\n",
"module-type": "filteroperator",
"title": "$:/plugins/flibbles/relink/js/filteroperators/relink.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/report.js": {
"text": "/*\\\nmodule-type: relinkfilteroperator\n\nGiven a title as an operand, returns a string for each occurrence of that title\nwithin each input title.\n\n[[title]] +[relink:report[fromTiddler]]`\n\nReturns string representation of fromTiddler occurrences in title.\n\\*/\n\nexports.report = function(source,operator,options) {\n\tvar fromTitle = operator.operand,\n\t\tresults = [],\n\t\trecords = options.wiki.getRelinkReport(\n\t\t\tfromTitle, fromTitle, options);\n\tif (fromTitle) {\n\t\tsource(function(tiddler, title) {\n\t\t\tvar affectedFields = records[title];\n\t\t\tif (affectedFields) {\n\t\t\t\tfor (var field in affectedFields) {\n\t\t\t\t\tvar entry = affectedFields[field];\n\t\t\t\t\tvar signatures = entry.report();\n\t\t\t\t\tresults = results.concat(signatures);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n",
"module-type": "relinkfilteroperator",
"title": "$:/plugins/flibbles/relink/js/filteroperators/report.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/signatures.js": {
"text": "/*\\\nmodule-type: relinkfilteroperator\n\nThis filter returns all input tiddlers which are a source of\nrelink configuration.\n\n`[all[tiddlers+system]relink:source[macros]]`\n\n\\*/\n\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\n\nexports.signatures = function(source,operator,options) {\n\tvar plugin = operator.operand || null;\n\tvar set = getSet(options);\n\tif (plugin === \"$:/core\") {\n\t\t// Core doesn't actually have any settings. We mean Relink\n\t\tplugin = \"$:/plugins/flibbles/relink\";\n\t}\n\tvar signatures = [];\n\tfor (var signature in set) {\n\t\tvar source = set[signature].source;\n\t\tif (options.wiki.getShadowSource(source) === plugin) {\n\t\t\tsignatures.push(signature);\n\t\t}\n\t}\n\treturn signatures;\n};\n\nexports.type = function(source,operator,options) {\n\tvar results = [];\n\tvar set = getSet(options);\n\tsource(function(tiddler, signature) {\n\t\tif (set[signature]) {\n\t\t\tresults.push(set[signature].name);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.types = function(source,operator,options) {\n\tvar def = settings.getDefaultType(options.wiki);\n\tvar types = Object.keys(settings.getTypes());\n\ttypes.sort();\n\t// move default to front\n\ttypes.sort(function(x,y) { return x === def ? -1 : y === def ? 1 : 0; });\n\treturn types;\n};\n\nexports.source = function(source,operator,options) {\n\tvar results = [];\n\tvar category = operator.suffix;\n\tvar set = getSet(options);\n\tsource(function(tiddler, signature) {\n\t\tif (set[signature]) {\n\t\t\tresults.push(set[signature].source);\n\t\t}\n\t});\n\treturn results;\n};\n\nfunction getSet(options) {\n\treturn options.wiki.getGlobalCache(\"relink-signatures\", function() {\n\t\tvar config = options.wiki.getRelinkConfig();\n\t\tvar set = Object.create(null);\n\t\tvar categories = {\n\t\t\tattributes: config.getAttributes(),\n\t\t\tfields: config.getFields(),\n\t\t\tmacros: config.getMacros(),\n\t\t\toperators: config.getOperators()};\n\t\t$tw.utils.each(categories, function(list, category) {\n\t\t\t$tw.utils.each(list, function(item, key) {\n\t\t\t\tset[category + \"/\" + key] = item;\n\t\t\t});\n\t\t});\n\t\treturn set;\n\t});\n};\n",
"module-type": "relinkfilteroperator",
"title": "$:/plugins/flibbles/relink/js/filteroperators/signatures.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/filteroperators/splitafter.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: relinkfilteroperator\n\nFilter operator that splits each result on the last occurance of the specified separator and returns the last bit.\n\nWhat does this have to do with relink? Nothing. I need this so I can render\nthe configuration menu. I //could// use [splitregexp[]], but then I'd be\nlimited to Tiddlywiki v5.1.20 or later.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitafter = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar index = title.lastIndexOf(operator.operand);\n\t\tif(index < 0) {\n\t\t\t$tw.utils.pushTop(results,title);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,title.substr(index+1));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n\n",
"title": "$:/plugins/flibbles/relink/js/filteroperators/splitafter.js",
"type": "application/javascript",
"module-type": "relinkfilteroperator"
},
"$:/plugins/flibbles/relink/js/fieldtypes/filter.js": {
"text": "/*\\\nThis specifies logic for updating filters to reflect title changes.\n\\*/\n\nvar refHandler = require(\"$:/plugins/flibbles/relink/js/fieldtypes/reference\");\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar Rebuilder = require(\"$:/plugins/flibbles/relink/js/utils/rebuilder\");\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nexports.name = \"filter\";\n\nvar FilterEntry = EntryNode.newType(\"filter\");\n\nFilterEntry.prototype.report = function() {\n\treturn this.children.map(function(child) {\n\t\tif (!child.report) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn child.report();\n\t});\n};\n\nfunction OperatorEntry(operandEntry) { this.entry = operandEntry; };\nOperatorEntry.prototype.name = \"operator\";\n\nOperatorEntry.prototype.eachChild = function(method) { method(this.entry); }\n\nOperatorEntry.prototype.report = function() {\n\tvar operand = \"\";\n\tif (this.entry.report) {\n\t\toperand = this.entry.report();\n\t}\n\tvar op = this.operator;\n\tvar brackets = '[]';\n\tif (this.type === \"indirect\") {\n\t\toperand = \"{\" + operand + \"}\";\n\t} else {\n\t\toperand = \"[\" + operand + \"]\";\n\t}\n\tvar suffix = '';\n\tif (op.suffix) {\n\t\tsuffix = \":\" + op.suffix;\n\t}\n\treturn \"[\" + (op.prefix || '') + op.operator + suffix + operand + \"]\";\n};\n\n/**Returns undefined if no change was made.\n */\nexports.relink = function(filter, fromTitle, toTitle, options) {\n\tif (!options.settings.survey(filter, fromTitle, options)) {\n\t\treturn undefined;\n\t}\n\tvar filterEntry = new FilterEntry();\n\tvar relinker = new Rebuilder(filter);\n\tvar whitelist = options.settings.getOperators();\n\tvar p = 0, // Current position in the filter string\n\t\tmatch, noPrecedingWordBarrier,\n\t\twordBarrierRequired=false;\n\tvar whitespaceRegExp = /\\s+/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filter.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filter);\n\t\tnoPrecedingWordBarrier = false;\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t} else if (p != 0) {\n\t\t\tif (wordBarrierRequired) {\n\t\t\t\trelinker.add(' ', p, p);\n\t\t\t\twordBarrierRequired = false;\n\t\t\t} else {\n\t\t\t\tnoPrecedingWordBarrier = true;\n\t\t\t}\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filter.length) {\n\t\t\tvar val;\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filter);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\t// It's a bad filter\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif(match[1]) { // prefix\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\t// We check if this is a standalone title,\n\t\t\t\t// like `[[MyTitle]]`. We treat those like\n\t\t\t\t// `\"MyTitle\"` or `MyTitle`. Not like a run.\n\t\t\t\tvar standaloneTitle = /\\[\\[([^\\]]+)\\]\\]/g;\n\t\t\t\tstandaloneTitle.lastIndex = p;\n\t\t\t\tvar alone = standaloneTitle.exec(filter);\n\t\t\t\tif (!alone || alone.index != p) {\n\t\t\t\t\t// It's a legit run\n\t\t\t\t\tp =parseFilterOperation(relinker,fromTitle,toTitle,filterEntry,filter,p,whitelist,options);\n\t\t\t\t\tif (p === undefined) {\n\t\t\t\t\t\t// The filter is malformed\n\t\t\t\t\t\t// We do nothing.\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbracketTitle = alone[1];\n\t\t\t\toperandRegExp.lastIndex = standaloneTitle.lastIndex;\n\t\t\t\tval = alone[1];\n\t\t\t} else {\n\t\t\t\t// standalone Double quoted string, single\n\t\t\t\t// quoted string, or noquote ahead.\n\t\t\t\tval = match[3] || match[4] || match[5];\n\t\t\t}\n\t\t\t// From here on, we're dealing with a standalone title\n\t\t\t// expression. like `\"MyTitle\"` or `[[MyTitle]]`\n\t\t\t// We're much more flexible about relinking these.\n\t\t\tvar preference = undefined;\n\t\t\tif (match[3]) {\n\t\t\t\tpreference = '\"';\n\t\t\t} else if (match[4]) {\n\t\t\t\tpreference = \"'\";\n\t\t\t} else if (match[5]) {\n\t\t\t\tpreference = '';\n\t\t\t}\n\t\t\tif (val === fromTitle) {\n\t\t\t\tvar entry = {name: \"title\"};\n\t\t\t\tvar newVal = wrapTitle(toTitle, preference);\n\t\t\t\tif (newVal === undefined) {\n\t\t\t\t\tif (!options.placeholder) {\n\t\t\t\t\t\tentry.impossible = true;\n\t\t\t\t\t\tfilterEntry.add(entry);\n\t\t\t\t\t\tp = operandRegExp.lastIndex;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewVal = \"[<\"+options.placeholder.getPlaceholderFor(toTitle,undefined,options)+\">]\";\n\t\t\t\t}\n\t\t\t\tif (newVal[0] != '[') {\n\t\t\t\t\t// not bracket enclosed\n\t\t\t\t\t// this requires whitespace\n\t\t\t\t\t// arnound it\n\t\t\t\t\tif (noPrecedingWordBarrier && !match[1]) {\n\t\t\t\t\t\trelinker.add(' ', p, p);\n\t\t\t\t\t}\n\t\t\t\t\twordBarrierRequired = true;\n\t\t\t\t}\n\t\t\t\tentry.output = toTitle;\n\t\t\t\tentry.operator = {operator: \"title\"};\n\t\t\t\tentry.quotation = preference;\n\t\t\t\tfilterEntry.add(entry);\n\t\t\t\trelinker.add(newVal,p,operandRegExp.lastIndex);\n\t\t\t}\n\t\t\tp = operandRegExp.lastIndex;\n\t\t}\n\t}\n\tif (filterEntry.children.length > 0) {\n\t\tfilterEntry.output = relinker.results();\n\t\treturn filterEntry;\n\t}\n\treturn undefined;\n};\n\n/* Same as this.relink, except this has the added constraint that the return\n * value must be able to be wrapped in curly braces. (i.e. '{{{...}}}')\n */\nexports.relinkInBraces = function(filter, fromTitle, toTitle, options) {\n\tvar entry = this.relink(filter, fromTitle, toTitle, options);\n\tif (entry && entry.output && !canBeInBraces(entry.output)) {\n\t\t// Although I think we can actually do this one.\n\t\tdelete entry.output;\n\t\tentry.impossible = true;\n\t}\n\treturn entry;\n};\n\nfunction wrapTitle(value, preference) {\n\tvar choices = {\n\t\t\"\": function(v) {return !/[\\s\\[\\]]/.test(v); },\n\t\t\"[\": canBePrettyOperand,\n\t\t\"'\": function(v) {return v.indexOf(\"'\") < 0; },\n\t\t'\"': function(v) {return v.indexOf('\"') < 0; }\n\t};\n\tvar wrappers = {\n\t\t\"\": function(v) {return v; },\n\t\t\"[\": function(v) {return \"[[\"+v+\"]]\"; },\n\t\t\"'\": function(v) {return \"'\"+v+\"'\"; },\n\t\t'\"': function(v) {return '\"'+v+'\"'; }\n\t};\n\tif (choices[preference]) {\n\t\tif (choices[preference](value)) {\n\t\t\treturn wrappers[preference](value);\n\t\t}\n\t}\n\tfor (var quote in choices) {\n\t\tif (choices[quote](value)) {\n\t\t\treturn wrappers[quote](value);\n\t\t}\n\t}\n\t// No quotes will work on this\n\treturn undefined;\n}\n\nfunction parseFilterOperation(relinker, fromTitle, toTitle, logger, filterString, p, whitelist, options) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\t// Missing [ in filter expression\n\t\treturn undefined;\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = \"!\";\n\t\t\tp++;\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\t// Missing [ in filter expression\n\t\t\treturn undefined;\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tvar entry, type;\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\ttype = \"indirect\";\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tvar operand = filterString.substring(p,nextBracketPos);\n\t\t\t\tentry = refHandler.relinkInBraces(operand, fromTitle, toTitle, options);\n\t\t\t\tif (entry && entry.output) {\n\t\t\t\t\t// We don't check the whitelist.\n\t\t\t\t\t// All indirect operands convert.\n\t\t\t\t\trelinker.add(entry.output,p,nextBracketPos);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\ttype = \"string\";\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tvar operand = filterString.substring(p,nextBracketPos);\n\t\t\t\t// Check if this is a relevant operator\n\t\t\t\tvar handler = fieldType(whitelist, operator);\n\t\t\t\tif (!handler) {\n\t\t\t\t\t// This operator isn't managed. Bye.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tentry = handler.relink(operand, fromTitle, toTitle, options);\n\t\t\t\tif (!entry) {\n\t\t\t\t\t// The fromTitle wasn't in the operand.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!entry.output) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tvar wrapped;\n\t\t\t\tif (!canBePrettyOperand(entry.output)) {\n\t\t\t\t\tif (!options.placeholder) {\n\t\t\t\t\t\tdelete entry.output;\n\t\t\t\t\t\tentry.impossible = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvar ph = options.placeholder.getPlaceholderFor(entry.output, handler.name, options);\n\t\t\t\t\twrapped = \"<\"+ph+\">\";\n\t\t\t\t} else {\n\t\t\t\t\twrapped = \"[\"+entry.output+\"]\";\n\t\t\t\t}\n\t\t\t\trelinker.add(wrapped, p-1, nextBracketPos+1);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Unterminated regular expression\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\tif (entry) {\n\t\t\tvar operatorEntry = new OperatorEntry(entry);\n\t\t\toperatorEntry.operator = operator;\n\t\t\toperatorEntry.type = type;\n\t\t\tlogger.add(operatorEntry);\n\t\t}\n\n\t\tif(nextBracketPos === -1) {\n\t\t\t// Missing closing bracket in filter expression\n\t\t\t// return undefined;\n\t\t}\n\t\tp = nextBracketPos + 1;\n\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\t// Missing ] in filter expression\n\t\treturn undefined;\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n// Returns the relinker needed for a given operator, or returns undefined.\nfunction fieldType(whitelist, operator) {\n\treturn (operator.suffix &&\n\t whitelist[operator.operator + \":\" + operator.suffix]) ||\n\t whitelist[operator.operator];\n};\n\nfunction canBePrettyOperand(value) {\n\treturn value.indexOf(']') < 0;\n};\n\nfunction canBeInBraces(value) {\n\treturn value.indexOf(\"}}}\") < 0 && value.substr(value.length-2) !== '}}';\n};\n",
"module-type": "relinkfieldtype",
"title": "$:/plugins/flibbles/relink/js/fieldtypes/filter.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/fieldtypes/list.js": {
"text": "/*\\\nThis manages replacing titles that occur within stringLists, like,\n\nTiddlerA [[Tiddler with spaces]] [[Another Title]]\n\\*/\n\nexports.name = \"list\";\n\n/**Returns undefined if no change was made.\n * Parameter: value can literally be a list. This can happen for builtin\n * types 'list' and 'tag'. In those cases, we also return list.\n */\nexports.relink = function(value, fromTitle, toTitle, options) {\n\tvar isModified = false,\n\t\tactualList = false,\n\t\tlist;\n\tif (typeof value !== \"string\") {\n\t\t// Not a string. Must be a list.\n\t\t// clone it, since we may make changes to this possibly\n\t\t// frozen list.\n\t\tlist = (value || []).slice(0);\n\t\tactualList = true;\n\t} else {\n\t\tlist = $tw.utils.parseStringArray(value || \"\");\n\t}\n\t$tw.utils.each(list,function (title,index) {\n\t\tif(title === fromTitle) {\n\t\t\tlist[index] = toTitle;\n\t\t\tisModified = true;\n\t\t}\n\t});\n\tif (isModified) {\n\t\tvar entry = {name: \"list\"};\n\t\t// It doesn't parse correctly alone, it won't\n\t\t// parse correctly in any list.\n\t\tif (!canBeListItem(toTitle)) {\n\t\t\tentry.impossible = true;\n\t\t} else if (actualList) {\n\t\t\tentry.output = list;\n\t\t} else {\n\t\t\tentry.output = $tw.utils.stringifyList(list);\n\t\t}\n\t\treturn entry;\n\t}\n\treturn undefined;\n};\n\nfunction canBeListItem(value) {\n\tvar regexp = /\\]\\][^\\S\\xA0]/m;\n\treturn !regexp.test(value);\n};\n",
"module-type": "relinkfieldtype",
"title": "$:/plugins/flibbles/relink/js/fieldtypes/list.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/fieldtypes/reference.js": {
"text": "/*\\\nThis manages replacing titles that occur inside text references,\n\ntiddlerTitle\ntiddlerTitle!!field\n!!field\ntiddlerTitle##propertyIndex\n\\*/\n\nexports.name = \"reference\";\n\nfunction ReferenceEntry(reference) {\n\tthis.reference = reference;\n};\nReferenceEntry.prototype.name = \"reference\";\n\nReferenceEntry.prototype.report = function() {\n\tif (this.reference.field) {\n\t\treturn [\"!!\" + this.reference.field];\n\t}\n\tif (this.reference.index) {\n\t\treturn [\"##\" + this.reference.index];\n\t}\n\treturn [\"\"];\n};\n\nexports.relink = function(value, fromTitle, toTitle, options) {\n\tvar entry;\n\tif (value) {\n\t\tvar reference = $tw.utils.parseTextReference(value);\n\t\tif (reference.title === fromTitle) {\n\t\t\tentry = new ReferenceEntry(reference);\n\t\t\tif (!exports.canBePretty(toTitle)) {\n\t\t\t\tentry.impossible = true;\n\t\t\t} else {\n\t\t\t\treference.title = toTitle;\n\t\t\t\tentry.output = exports.toString(reference);\n\t\t\t}\n\t\t}\n\t}\n\treturn entry;\n};\n\n/* Same as this.relink, except this has the added constraint that the return\n * value must be able to be wrapped in curly braces.\n */\nexports.relinkInBraces = function(value, fromTitle, toTitle, options) {\n\tvar log = this.relink(value, fromTitle, toTitle, options);\n\tif (log && log.output && toTitle.indexOf(\"}\") >= 0) {\n\t\tdelete log.output;\n\t\tlog.impossible = true;\n\t}\n\treturn log;\n};\n\nexports.toString = function(textReference) {\n\tvar title = textReference.title || '';\n\tif (textReference.field) {\n\t\treturn title + \"!!\" + textReference.field;\n\t} else if (textReference.index) {\n\t\treturn title + \"##\" + textReference.index;\n\t}\n\treturn title;\n};\n\nexports.canBePretty = function(title) {\n\treturn !title || (title.indexOf(\"!!\") < 0 && title.indexOf(\"##\") < 0);\n};\n",
"module-type": "relinkfieldtype",
"title": "$:/plugins/flibbles/relink/js/fieldtypes/reference.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/fieldtypes/title.js": {
"text": "/*\\\nThis specifies logic for replacing a single-tiddler field. This is the\nsimplest kind of field type. One title swaps out for the other.\n\\*/\n\n// NOTE TO MODDERS: If you're making your own field types, the name must be\n// alpha characters only.\nexports.name = 'title';\n\n/**Returns undefined if no change was made.\n */\nexports.relink = function(value, fromTitle, toTitle, options) {\n\tif (value === fromTitle) {\n\t\treturn {name: \"title\", output: toTitle};\n\t}\n\treturn undefined;\n};\n\n// This is legacy support for when 'title' was known as 'field'\nexports.aliases = ['field', 'yes'];\n",
"module-type": "relinkfieldtype",
"title": "$:/plugins/flibbles/relink/js/fieldtypes/title.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/fieldtypes/wikitext.js": {
"text": "/*\\\nThis specifies logic for updating filters to reflect title changes.\n\\*/\n\nexports.name = \"wikitext\";\n\nvar type = 'text/vnd.tiddlywiki';\n\nvar WikiParser = require(\"$:/core/modules/parsers/wikiparser/wikiparser.js\")[type];\nvar Rebuilder = require(\"$:/plugins/flibbles/relink/js/utils/rebuilder.js\");\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nvar WikitextEntry = EntryNode.newType(\"wikitext\");\n\nWikitextEntry.prototype.report = function() {\n\tvar output = [];\n\t$tw.utils.each(this.children, function(child) {\n\t\t// All wikitext children should be able to report\n\t\t$tw.utils.each(child.report(), function(report) {\n\t\t\toutput.push(report);\n\t\t});\n\t});\n\treturn output;\n};\n\n\nfunction collectRules() {\n\tvar rules = Object.create(null);\n\t$tw.modules.forEachModuleOfType(\"relinkwikitextrule\", function(title, exports) {\n\t\tvar names = exports.name;\n\t\tif (typeof names === \"string\") {\n\t\t\tnames = [names];\n\t\t}\n\t\tfor (var i = 0; i < names.length; i++) {\n\t\t\trules[names[i]] = exports;\n\t\t}\n\t});\n\treturn rules;\n}\n\nfunction WikiRelinker(text, title, toTitle, options) {\n\tWikiParser.call(this, null, text, options);\n\tif (!this.relinkMethodsInjected) {\n\t\tvar rules = collectRules();\n\t\t$tw.utils.each([this.pragmaRuleClasses, this.blockRuleClasses, this.inlineRuleClasses], function(classList) {\n\t\t\tfor (var name in classList) {\n\t\t\t\tif (rules[name]) {\n\t\t\t\t\tdelete rules[name].name;\n\t\t\t\t\t$tw.utils.extend(classList[name].prototype, rules[name]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tWikiRelinker.prototype.relinkMethodsInjected = true;\n\t}\n\tthis.title = title;\n\tthis.toTitle = toTitle;\n\tthis.inlineRules = this.inlineRules.concat(this.pragmaRules, this.blockRules);\n\t// We work through relinkRules so we can change it later.\n\t// relinkRules is inlineRules so it gets touched up by amendRules().\n\tthis.relinkRules = this.inlineRules;\n};\n\nWikiRelinker.prototype = Object.create(WikiParser.prototype);\nWikiRelinker.prototype.parsePragmas = function() {return []; };\nWikiRelinker.prototype.parseInlineRun = function() {};\nWikiRelinker.prototype.parseBlocks = function() {};\n\nexports.relink = function(wikitext, fromTitle, toTitle, options) {\n\t// fromTitle doesn't even show up plaintext. No relinking to do.\n\tif (!options.settings.survey(wikitext, fromTitle, options)) {\n\t\treturn undefined;\n\t}\n\tvar builder = new Rebuilder(wikitext),\n\t\tparser = new WikiRelinker(wikitext, options.currentTiddler, toTitle, options),\n\t\tmatchingRule,\n\t\tentry = new WikitextEntry(),\n\t\tnewOptions = $tw.utils.extend({}, options);\n\tnewOptions.settings = options.settings.createChildLibrary(options.currentTiddler);\n\twhile (matchingRule = parser.findNextMatch(parser.relinkRules, parser.pos)) {\n\t\tif (matchingRule.rule.relink) {\n\t\t\tvar newEntry = matchingRule.rule.relink(wikitext, fromTitle, toTitle, newOptions);\n\t\t\tif (newEntry !== undefined) {\n\t\t\t\tentry.add(newEntry);\n\t\t\t\tif (newEntry.output) {\n\t\t\t\t\tbuilder.add(newEntry.output, matchingRule.matchIndex, parser.pos);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (matchingRule.rule.matchRegExp !== undefined) {\n\t\t\t\tparser.pos = matchingRule.rule.matchRegExp.lastIndex;\n\t\t\t} else {\n\t\t\t\t// We can't easily determine the end of this\n\t\t\t\t// rule match. We'll \"parse\" it so that\n\t\t\t\t// parser.pos gets updated, but we throw away\n\t\t\t\t// the results.\n\t\t\t\tmatchingRule.rule.parse();\n\t\t\t}\n\t\t}\n\t}\n\tif (entry.children.length > 0) {\n\t\tentry.output = builder.results();\n\t\treturn entry;\n\t}\n\treturn undefined;\n};\n",
"module-type": "relinkfieldtype",
"title": "$:/plugins/flibbles/relink/js/fieldtypes/wikitext.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/fields.js": {
"text": "/*\\\n\nHandles all fields specified in the plugin configuration. Currently, this\nonly supports single-value fields.\n\n\\*/\n\n/*jslint node: false, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar log = require('$:/plugins/flibbles/relink/js/language.js').logRelink;\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nvar FieldEntry = EntryNode.newType(\"field\");\n\nFieldEntry.prototype.report = function() {\n\tvar self = this;\n\tvar output = [];\n\t$tw.utils.each(this.children, function(child) {\n\t\tif (child.report) {\n\t\t\t$tw.utils.each(child.report(), function(report) {\n\t\t\t\tif (report) {\n\t\t\t\t\toutput.push(self.field + \": \" + report);\n\t\t\t\t} else {\n\t\t\t\t\toutput.push(self.field);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\toutput.push(self.field);\n\t\t}\n\t});\n\treturn output;\n};\n\nexports['fields'] = function(tiddler, fromTitle, toTitle, changes, options) {\n\tvar fields = options.settings.getFields();\n\t$tw.utils.each(fields, function(handler, field) {\n\t\tvar input = tiddler.fields[field];\n\t\tvar entry = handler.relink(input, fromTitle, toTitle, options);\n\t\tif (entry !== undefined) {\n\t\t\tvar fieldEntry = new FieldEntry();\n\t\t\tfieldEntry.field = field;\n\t\t\tfieldEntry.output = entry.output;\n\t\t\tfieldEntry.add(entry);\n\t\t\tchanges[field] = fieldEntry;\n\t\t}\n\t});\n};\n",
"module-type": "relinkoperator",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/fields.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text.js": {
"text": "/*\\\n\nDepending on the tiddler type, this will apply textOperators which may\nrelink titles within the body.\n\n\\*/\n\n/*jslint node: false, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar defaultOperator = \"text/vnd.tiddlywiki\";\n\nvar textOperators = Object.create(null);\n$tw.modules.applyMethods('relinktextoperator', textOperators);\n\n// $:/DefaultTiddlers is a tiddler which has type \"text/vnd.tiddlywiki\",\n// but it lies. It doesn't contain wikitext. It contains a filter, so\n// we pretend it has a filter type.\n// If you want to be able to add more exceptions for your plugin, let me know.\nvar exceptions = {\n\t\"$:/DefaultTiddlers\": \"text/x-tiddler-filter\"\n};\n\nexports['text'] = function(tiddler, fromTitle, toTitle, changes, options) {\n\tvar fields = tiddler.fields;\n\tif (fields.text) {\n\t\tvar type = exceptions[fields.title] || fields.type || defaultOperator;\n\t\tif (textOperators[type]) {\n\t\t\tvar entry = textOperators[type].call(this, tiddler, fromTitle, toTitle, options);\n\t\t\tif (entry) {\n\t\t\t\tchanges.text = entry;\n\t\t\t}\n\t\t}\n\t}\n};\n",
"module-type": "relinkoperator",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/filtertext.js": {
"text": "/*\\\n\nThis relinks tiddlers which contain filters in their body, as oppose to\nwikitext.\n\n\\*/\n\n/*jslint node: false, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar filterHandler = require(\"$:/plugins/flibbles/relink/js/settings\").getType('filter');\n\nexports['text/x-tiddler-filter'] = function(tiddler, fromTitle, toTitle, options) {\n\treturn filterHandler.relink(tiddler.fields.text, fromTitle, toTitle, options)\n};\n",
"module-type": "relinktextoperator",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/filtertext.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext.js": {
"text": "/*\\\n\nChecks for fromTitle in a tiddler's text. If found, sees if it's relevant,\nand tries to swap it out if it is.\n\n\\*/\n\n/*jslint node: false, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar type = 'text/vnd.tiddlywiki';\nvar Placeholder = require(\"$:/plugins/flibbles/relink/js/utils/placeholder.js\");\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar wikitextHandler = settings.getType('wikitext');\n\nexports[type] = function(tiddler, fromTitle, toTitle, options) {\n\tvar placeholder = new Placeholder();\n\tvar currentOptions = $tw.utils.extend(\n\t\t{\n\t\t\tcurrentTiddler: tiddler.fields.title,\n\t\t\tplaceholder: placeholder\n\t\t}, options);\n\tvar entry = wikitextHandler.relink(tiddler.fields.text, fromTitle, toTitle, currentOptions);\n\tif (entry && entry.output) {\n\t\t// If there's output, we've also got to prepend any macros\n\t\t// that the placeholder defined.\n\t\tvar preamble = placeholder.getPreamble();\n\t\tentry.output = preamble + entry.output;\n\t}\n\treturn entry;\n}\n",
"module-type": "relinktextoperator",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/code.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles code blocks. Or rather //doesn't// handle them, since we should\nignore their contents.\n\n\"`` [[Renamed Title]] ``\" will remain unchanged.\n\n\\*/\n\nexports.name = [\"codeinline\", \"codeblock\"];\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar reEnd;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// I'm lazy. This relink method works for both codeblock and codeinline\n\tif (this.match[0].length > 2) {\n\t\t// Must be a codeblock\n\t\treEnd = /\\r?\\n```$/mg;\n\t} else {\n\t\t// Must be a codeinline\n\t\treEnd = new RegExp(this.match[1], \"mg\");\n\t}\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(text);\n\tif (match) {\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn undefined;\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/code.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/comment.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles comment blocks. Or rather //doesn't// handle them, since we should\nignore their contents.\n\n\"<!-- [[Renamed Title]] -->\" will remain unchanged.\n\n\\*/\n\nexports.name = [\"commentinline\", \"commentblock\"];\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\treturn undefined;\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/comment.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/filteredtransclude.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles replacement of filtered transclusions in wiki text like,\n\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n\nThis renames both the list and the template field.\n\n\\*/\n\nexports.name = ['filteredtranscludeinline', 'filteredtranscludeblock'];\n\nvar filterHandler = require(\"$:/plugins/flibbles/relink/js/settings\").getType('filter');\nvar utils = require(\"./utils.js\");\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nvar FilteredTranscludeEntry = EntryNode.newType(\"filteredtransclude\");\n\nFilteredTranscludeEntry.prototype.report = function() {\n\tvar output = [];\n\tvar self = this;\n\t$tw.utils.each(this.children, function(child) {\n\t\tif (child.name === \"filter\") {\n\t\t\tvar append = \"}}}\";\n\t\t\tif (self.template) {\n\t\t\t\tappend = \"||\" + self.template + append;\n\t\t\t}\n\t\t\t$tw.utils.each(child.report(), function(report) {\n\t\t\t\toutput.push(\"{{{\" + report + append);\n\t\t\t});\n\t\t} else {\n\t\t\t// Must be the template\n\t\t\toutput.push(\"{{{\" + self.filter + \"||}}}\");\n\t\t}\n\t});\n\treturn output;\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar m = this.match;\n\t\tfilter = m[1],\n\t\ttooltip = m[2],\n\t\ttemplate = m[3],\n\t\tstyle = m[4],\n\t\tclasses = m[5],\n\t\tparser = this.parser,\n\t\tentry = new FilteredTranscludeEntry();\n\tparser.pos = this.matchRegExp.lastIndex;\n\tvar modified = false;\n\n\tvar filterEntry = filterHandler.relink(filter, fromTitle, toTitle, options);\n\tif (filterEntry !== undefined) {\n\t\tentry.add(filterEntry);\n\t\tif (filterEntry.output) {\n\t\t\tmodified = true;\n\t\t\tfilter = filterEntry.output;\n\t\t}\n\t}\n\n\tif ($tw.utils.trim(template) === fromTitle) {\n\t\t// preserves user-inputted whitespace\n\t\ttemplate = template.replace(fromTitle, toTitle);\n\t\tentry.add({name: \"title\", output: template});\n\t\tmodified = true;\n\t}\n\tif (!modified) {\n\t\tif (entry.children.length <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t} else {\n\t\tvar output = this.makeFilteredtransclude(filter, tooltip, template, style, classes, options);\n\t\tif (output === undefined) {\n\t\t\tentry.impossible = true;\n\t\t} else {\n\t\t\t// By copying over the ending newline of the original\n\t\t\t// text if present, thisrelink method thus works for\n\t\t\t// both the inline and block rule\n\t\t\tentry.output = output + utils.getEndingNewline(m[0]);\n\t\t}\n\t\tentry.filter = filter;\n\t}\n\tentry.template = template;\n\treturn entry;\n};\n\nexports.makeFilteredtransclude = function(filter, tooltip, template, style, classes, options) {\n\tif (canBePretty(filter) && canBePrettyTemplate(template)) {\n\t\treturn prettyList(filter, tooltip, template, style, classes);\n\t} else {\n\t\treturn widget(filter, tooltip, template, style, classes, options);\n\t}\n};\n\nfunction prettyList(filter, tooltip, template, style, classes) {\n\tif (tooltip === undefined) {\n\t\ttooltip = '';\n\t} else {\n\t\ttooltip = \"|\" + tooltip;\n\t}\n\tif (template === undefined) {\n\t\ttemplate = '';\n\t} else {\n\t\ttemplate = \"||\" + template;\n\t}\n\tif (classes === undefined) {\n\t\tclasses = '';\n\t} else {\n\t\tclasses = \".\" + classes;\n\t}\n\tstyle = style || '';\n\treturn \"{{{\"+filter+tooltip+template+\"}}\"+style+\"}\"+classes;\n};\n\n/** Returns a filtered transclude as a string of a widget.\n */\nfunction widget(filter, tooltip, template, style, classes, options) {\n\tvar cannotDo = false;\n\tif (classes !== undefined) {\n\t\tclasses = classes.split('.').join(' ');\n\t}\n\tfunction wrap(name, value, treatAsTitle) {\n\t\tif (!value) {\n\t\t\treturn '';\n\t\t}\n\t\tvar wrappedValue = utils.wrapAttributeValue(value);\n\t\tif (wrappedValue === undefined) {\n\t\t\tif (!options.placeholder) {\n\t\t\t\tcannotDo = true;\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tvar category = treatAsTitle ? undefined : name;\n\t\t\twrappedValue = \"<<\"+options.placeholder.getPlaceholderFor(value,category,options)+\">>\";\n\t\t}\n\t\treturn \" \"+name+\"=\"+wrappedValue;\n\t};\n\tvar widget = [\n\t\t\"<$list\",\n\t\twrap(\"filter\", filter),\n\t\twrap(\"tooltip\", tooltip),\n\t\twrap(\"template\", template, true),\n\t\twrap(\"style\", style),\n\t\twrap(\"itemClass\", classes),\n\t\t\"/>\"\n\t];\n\tif (cannotDo) {\n\t\treturn undefined;\n\t}\n\treturn widget.join('');\n};\n\nfunction canBePretty(filter) {\n\treturn filter.indexOf('|') < 0 && filter.indexOf('}}') < 0;\n};\n\nfunction canBePrettyTemplate(template) {\n\treturn !template || (\n\t\ttemplate.indexOf('|') < 0\n\t\t&& template.indexOf('{') < 0\n\t\t&& template.indexOf('}') < 0);\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/filteredtransclude.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles replacement in attributes of widgets and html elements\nThis is configurable to select exactly which attributes of which elements\nshould be changed.\n\n<$link to=\"TiddlerTitle\" />\n\n\\*/\n\nvar utils = require(\"./utils.js\");\nvar Rebuilder = require(\"$:/plugins/flibbles/relink/js/utils/rebuilder\");\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar refHandler = settings.getType('reference');\nvar filterHandler = settings.getType('filter');\nvar macrocall = require(\"./macrocall.js\");\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nexports.name = \"html\";\n\nvar HtmlEntry = EntryNode.newCollection(\"html\");\n\nHtmlEntry.prototype.forEachChildReport = function(report, attribute, type) {\n\tvar rtn = attribute;\n\tif (type === \"filtered\") {\n\t\trtn += \"={{{\" + report + \"}}}\";\n\t} else if (type === \"indirect\") {\n\t\trtn += \"={{\" + report + \"}}\";\n\t} else if (type === \"macro\") {\n\t\trtn += \"=\"+report;\n\t} else{\n\t\t// must be string.\n\t\tif (report.length > 0) {\n\t\t\trtn += '=\"' + report + '\"';\n\t\t}\n\t}\n\treturn \"<\" + this.element + \" \" + rtn + \" />\";\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar managedElement = options.settings.getAttribute(this.nextTag.tag),\n\t\tbuilder = new Rebuilder(text, this.nextTag.start);\n\tvar importFilterAttr;\n\tvar widgetEntry = new HtmlEntry();\n\twidgetEntry.attributes = Object.create(null);\n\twidgetEntry.element = this.nextTag.tag;\n\tfor (var attributeName in this.nextTag.attributes) {\n\t\tvar attr = this.nextTag.attributes[attributeName];\n\t\tvar nextEql = text.indexOf('=', attr.start);\n\t\t// This is the rare case of changing tiddler\n\t\t// \"true\" to something else when \"true\" is\n\t\t// implicit, like <$link to /> We ignore those.\n\t\tif (nextEql < 0 || nextEql > attr.end) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (this.nextTag.tag === \"$importvariables\" && attributeName === \"filter\") {\n\t\t\timportFilterAttr = attr;\n\t\t}\n\t\tvar oldLength, quotedValue, entry;\n\t\tif (attr.type === \"string\") {\n\t\t\tvar handler = getAttributeHandler(this.nextTag, attributeName, options);\n\t\t\tif (!handler) {\n\t\t\t\t// We don't manage this attribute. Bye.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tentry = handler.relink(attr.value, fromTitle, toTitle, options);\n\t\t\tif (entry === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (entry.output) {\n\t\t\t\tvar quote = utils.determineQuote(text, attr);\n\t\t\t\toldLength = attr.value.length + (quote.length * 2);\n\t\t\t\tquotedValue = utils.wrapAttributeValue(entry.output,quote);\n\t\t\t\tif (quotedValue === undefined) {\n\t\t\t\t\t// The value was unquotable. We need to make\n\t\t\t\t\t// a macro in order to replace it.\n\t\t\t\t\tif (!options.placeholder) {\n\t\t\t\t\t\t// but we can't...\n\t\t\t\t\t\tentry.impossible = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar value = options.placeholder.getPlaceholderFor(entry.output,handler.name,options)\n\t\t\t\t\t\tquotedValue = \"<<\"+value+\">>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (attr.type === \"indirect\") {\n\t\t\tentry = refHandler.relinkInBraces(attr.textReference, fromTitle, toTitle, options);\n\t\t\tif (entry === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.impossible) {\n\t\t\t\t// +4 for '{{' and '}}'\n\t\t\t\toldLength = attr.textReference.length + 4;\n\t\t\t\tquotedValue = \"{{\"+entry.output+\"}}\";\n\t\t\t}\n\t\t} else if (attr.type === \"filtered\") {\n\t\t\tentry = filterHandler.relinkInBraces(attr.filter, fromTitle, toTitle, options);\n\t\t\tif (entry === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.impossible) {\n\t\t\t\t// +6 for '{{{' and '}}}'\n\t\t\t\toldLength = attr.filter.length + 6;\n\t\t\t\tquotedValue = \"{{{\"+ entry.output +\"}}}\";\n\t\t\t}\n\t\t} else if (attr.type === \"macro\") {\n\t\t\tvar macro = attr.value;\n\t\t\tentry = macrocall.relinkAttribute(macro, text, fromTitle, toTitle, options);\n\t\t\tif (entry === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.impossible) {\n\t\t\t\t// already includes '<<' and '>>'\n\t\t\t\toldLength = macro.end-macro.start;\n\t\t\t\tquotedValue = entry.output;\n\t\t\t}\n\t\t}\n\t\twidgetEntry.addChild(entry, attributeName, attr.type);\n\t\tif (quotedValue === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (this.nextTag.tag === \"$importvariables\" && attributeName === \"filter\") {\n\t\t\t// If this is an import variable filter, we gotta\n\t\t\t// remember this new value when we import lower down.\n\t\t\timportFilterAttr = quotedValue;\n\t\t}\n\t\t// We count backwards from the end to preserve whitespace\n\t\tvar valueStart = attr.end - oldLength;\n\t\tbuilder.add(quotedValue, valueStart, attr.end);\n\t}\n\tif (importFilterAttr) {\n\t\tprocessImportFilter(importFilterAttr, options);\n\t}\n\tthis.parser.pos = this.nextTag.end;\n\tif (widgetEntry.hasChildren()) {\n\t\twidgetEntry.output = builder.results(this.nextTag.end);\n\t\treturn widgetEntry;\n\t}\n\treturn undefined;\n};\n\n/** Returns the field handler for the given attribute of the given widget.\n * If this returns undefined, it means we don't handle it. So skip.\n */\nfunction getAttributeHandler(widget, attributeName, options) {\n\tif (widget.tag === \"$macrocall\") {\n\t\tvar nameAttr = widget.attributes[\"$name\"];\n\t\tif (nameAttr) {\n\t\t\tvar macro = options.settings.getMacro(nameAttr.value);\n\t\t\tif (macro) {\n\t\t\t\treturn macro[attributeName];\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvar element = options.settings.getAttribute(widget.tag);\n\t\tif (element) {\n\t\t\treturn element[attributeName];\n\t\t}\n\t}\n\treturn undefined;\n};\n\nfunction computeAttribute(attribute, options) {\n\tvar value;\n\tif(attribute.type === \"filtered\") {\n\t\tvar parentWidget = options.settings.getVariableWidget();\n\t\tvalue = options.wiki.filterTiddlers(attribute.filter,parentWidget)[0] || \"\";\n\t} else if(attribute.type === \"indirect\") {\n\t\tvar parentWidget = options.settings.getVariableWidget();\n\t\tvalue = options.wiki.getTextReference(attribute.textReference,\"\",parentWidget.variables.currentTiddler.value);\n\t} else if(attribute.type === \"macro\") {\n\t\tvar parentWidget = options.settings.getVariableWidget();\n\t\tvalue = parentWidget.getVariable(attribute.value.name,{params: attribute.value.params});\n\t} else { // String attribute\n\t\tvalue = attribute.value;\n\t}\n\treturn value;\n};\n\n// This processes a <$importvariables> filter attribute and adds any new\n// variables to our parser.\nfunction processImportFilter(importAttribute, options) {\n\tif (typeof importAttribute === \"string\") {\n\t\t// It was changed. Reparse it. It'll be a quoted\n\t\t// attribute value. Add a dummy attribute name.\n\t\timportAttribute = $tw.utils.parseAttribute(\"p=\"+importAttribute, 0)\n\t}\n\tvar importFilter = computeAttribute(importAttribute, options);\n\toptions.settings.import(importFilter);\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/image.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles replacement in wiki text inline rules, like,\n\n[img[tiddler.jpg]]\n\n[img width=23 height=24 [Description|tiddler.jpg]]\n\n\\*/\n\nvar Rebuilder = require(\"$:/plugins/flibbles/relink/js/utils/rebuilder\");\nvar refHandler = require(\"$:/plugins/flibbles/relink/js/fieldtypes/reference\");\nvar filterHandler = require(\"$:/plugins/flibbles/relink/js/settings\").getType('filter');\nvar macrocall = require(\"./macrocall.js\");\nvar utils = require(\"./utils.js\");\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nexports.name = \"image\";\n\nvar ImageEntry = EntryNode.newCollection(\"image\");\n\nImageEntry.prototype.forEachChildReport = function(report, attribute, type) {\n\tvar value;\n\tif (attribute === \"source\") {\n\t\tif (this.tooltip) {\n\t\t\tvalue = \"[img[\" + this.tooltip.value + \"]]\";\n\t\t} else {\n\t\t\tvalue = \"[img[]]\";\n\t\t}\n\t} else {\n\t\tif (type === \"indirect\") {\n\t\t\tvalue = \"{{\" + report + \"}}\";\n\t\t} else if (type === \"filtered\") {\n\t\t\tvalue = \"{{{\" + report + \"}}}\";\n\t\t} else if (type === \"macro\") {\n\t\t\t// angle brackets already added...\n\t\t\tvalue = report;\n\t\t}\n\t\tvalue = \"[img \" + attribute + \"=\"+ value + \"]\";\n\t}\n\treturn value;\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar ptr = this.nextImage.start;\n\tvar builder = new Rebuilder(text, ptr);\n\tvar makeWidget = false;\n\tvar skipSource = false;\n\tvar imageEntry = new ImageEntry();\n\timageEntry.attributes = Object.create(null);\n\tif (this.nextImage.attributes.source.value === fromTitle && !canBePretty(toTitle, this.nextImage.attributes.tooltip)) {\n\t\tif (utils.wrapAttributeValue(toTitle) || options.placeholder) {\n\t\t\tmakeWidget = true;\n\t\t\tbuilder.add(\"<$image\", ptr, ptr+4);\n\t\t} else {\n\t\t\t// We won't be able to make a placeholder to replace\n\t\t\t// the source attribute. We check now so we don't\n\t\t\t// prematurely convert into a widget.\n\t\t\t// Keep going in case other attributes need replacing.\n\t\t\tskipSource = true;\n\t\t}\n\t}\n\tptr += 4; //[img\n\tvar inSource = false;\n\tfor (var attributeName in this.nextImage.attributes) {\n\t\tvar attr = this.nextImage.attributes[attributeName];\n\t\tif (attributeName === \"source\" || attributeName === \"tooltip\") {\n\t\t\tif (inSource) {\n\t\t\t\tptr = text.indexOf('|', ptr);\n\t\t\t} else {\n\t\t\t\tptr = text.indexOf('[', ptr);\n\t\t\t\tinSource = true;\n\t\t\t}\n\t\t\tif (makeWidget) {\n\t\t\t\tif (\" \\t\\n\".indexOf(text[ptr-1]) >= 0) {\n\t\t\t\t\tbuilder.add('', ptr, ptr+1);\n\t\t\t\t} else {\n\t\t\t\t\tbuilder.add(' ', ptr, ptr+1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tptr += 1;\n\t\t}\n\t\tif (attributeName === \"source\") {\n\t\t\tptr = text.indexOf(attr.value, ptr);\n\t\t\tif (attr.value === fromTitle) {\n\t\t\t\tvar entry = {name: \"title\"};\n\t\t\t\tif (makeWidget) {\n\t\t\t\t\tvar quotedValue = utils.wrapAttributeValue(toTitle);\n\t\t\t\t\tif (quotedValue === undefined) {\n\t\t\t\t\t\tvar key = options.placeholder.getPlaceholderFor(toTitle, undefined, options);\n\t\t\t\t\t\tbuilder.add(\"source=<<\"+key+\">>\", ptr, ptr+fromTitle.length);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuilder.add(\"source=\"+quotedValue, ptr, ptr+fromTitle.length);\n\t\t\t\t\t}\n\t\t\t\t} else if (!skipSource) {\n\t\t\t\t\tbuilder.add(toTitle, ptr, ptr+fromTitle.length);\n\t\t\t\t} else {\n\t\t\t\t\tentry.impossible = true;\n\t\t\t\t}\n\t\t\t\timageEntry.addChild(entry, attributeName, \"string\");\n\t\t\t}\n\t\t\tptr = text.indexOf(']]', ptr);\n\t\t\tif (makeWidget) {\n\t\t\t\tbuilder.add(\"/>\", ptr, ptr+2);\n\t\t\t}\n\t\t\tptr += 2;\n\t\t} else if (attributeName === \"tooltip\") {\n\t\t\tif (makeWidget) {\n\t\t\t\tptr = text.indexOf(attr.value, ptr);\n\t\t\t\tvar quotedValue = utils.wrapAttributeValue(attr.value);\n\t\t\t\tbuilder.add(\"tooltip=\"+quotedValue, ptr, ptr+attr.value.length);\n\t\t\t}\n\t\t\timageEntry.tooltip = this.nextImage.attributes.tooltip;\n\t\t} else {\n\t\t\tptr = relinkAttribute(attr, builder, fromTitle, toTitle, imageEntry, options);\n\t\t}\n\t}\n\tthis.parser.pos = ptr;\n\tif (imageEntry.hasChildren()) {\n\t\timageEntry.output = builder.results(ptr);\n\t\treturn imageEntry;\n\t}\n\treturn undefined;\n};\n\nfunction relinkAttribute(attribute, builder, fromTitle, toTitle, entry, options) {\n\tvar text = builder.text;\n\tvar ptr = text.indexOf(attribute.name, attribute.start);\n\tvar end;\n\tptr += attribute.name.length;\n\tptr = text.indexOf('=', ptr);\n\tif (attribute.type === \"string\") {\n\t\tptr = text.indexOf(attribute.value, ptr)\n\t\tvar quote = utils.determineQuote(text, attribute);\n\t\t// ignore first quote. We already passed it\n\t\tend = ptr + quote.length + attribute.value.length;\n\t} else if (attribute.type === \"indirect\") {\n\t\tptr = text.indexOf('{{', ptr);\n\t\tvar end = ptr + attribute.textReference.length + 4;\n\t\tvar ref = refHandler.relinkInBraces(attribute.textReference, fromTitle, toTitle, options);\n\t\tif (ref) {\n\t\t\tentry.addChild(ref, attribute.name, \"indirect\");\n\t\t\tif (ref.output) {\n\t\t\t\tbuilder.add(\"{{\"+ref.output+\"}}\", ptr, end);\n\t\t\t}\n\t\t}\n\t} else if (attribute.type === \"filtered\") {\n\t\tptr = text.indexOf('{{{', ptr);\n\t\tvar end = ptr + attribute.filter.length + 6;\n\t\tvar filter = filterHandler.relinkInBraces(attribute.filter, fromTitle, toTitle, options);\n\t\tif (filter !== undefined) {\n\t\t\tentry.addChild(filter, attribute.name, \"filtered\");\n\t\t\tif (filter.output) {\n\t\t\t\tvar quoted = \"{{{\"+filter.output+\"}}}\";\n\t\t\t\tbuilder.add(quoted, ptr, end);\n\t\t\t}\n\t\t}\n\t} else if (attribute.type === \"macro\") {\n\t\tptr = text.indexOf(\"<<\", ptr);\n\t\tvar end = attribute.value.end;\n\t\tvar macro = attribute.value;\n\t\toldValue = attribute.value;\n\t\tvar macroEntry = macrocall.relinkAttribute(macro, text, fromTitle, toTitle, options);\n\t\tif (macroEntry !== undefined) {\n\t\t\tentry.addChild(macroEntry, attribute.name, \"macro\");\n\t\t\tif (macroEntry.output) {\n\t\t\t\tbuilder.add(macroEntry.output, ptr, end);\n\t\t\t}\n\t\t}\n\t}\n\treturn end;\n};\n\nfunction canBePretty(title, tooltip) {\n\treturn title.indexOf(']') < 0 && (tooltip || title.indexOf('|') < 0);\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/image.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/import.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles import pragmas\n\n\\import [tag[MyTiddler]]\n\\*/\n\nvar settings = require(\"$:/plugins/flibbles/relink/js/settings.js\");\nvar filterRelinker = settings.getType('filter');\n\nexports.name = \"import\";\n\nfunction ImportEntry(filterEntry) {\n\tthis.filter = filterEntry;\n};\nImportEntry.prototype.name = \"import\";\nImportEntry.prototype.eachChild = function(block) { return block(this.filter);};\nImportEntry.prototype.report = function() {\n\treturn this.filter.report().map(function(report) {\n\t\tif (report.length > 0) {\n\t\t\treturn \"\\\\import \" + report;\n\t\t} else {\n\t\t\treturn \"\\\\import\";\n\t\t}\n\t});\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\t// In this one case, I'll let the parser parse out the filter and move\n\t// the ptr.\n\tvar start = this.matchRegExp.lastIndex;\n\tvar parseTree = this.parse();\n\tvar filter = parseTree[0].attributes.filter.value;\n\tvar entry = undefined;\n\tvar filterEntry = filterRelinker.relink(filter, fromTitle, toTitle, options);\n\tif (filterEntry !== undefined) {\n\t\tentry = new ImportEntry(filterEntry);\n\t\tvar newline = text.substring(start+filter.length, this.parser.pos);\n\t\tif (filterEntry.output) {\n\t\t\tfilter = filterEntry.output;\n\t\t\tentry.output = \"\\\\import \" + filter + newline;\n\t\t}\n\t}\n\n\t// Before we go, we need to actually import the variables\n\t// it's calling for, and any /relink pragma\n\toptions.settings.import(filter);\n\n\treturn entry;\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/import.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrocall.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles macro calls.\n\n<<myMacro '[[MyFilter]]' 'myTitle'>>\n\n\\*/\n\nvar utils = require(\"./utils.js\");\nvar Rebuilder = require(\"$:/plugins/flibbles/relink/js/utils/rebuilder\");\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\n\nexports.name = [\"macrocallinline\", \"macrocallblock\"];\n\n// Error thrown when a macro's definition is needed, but can't be found.\nfunction CannotFindMacroDef() {};\nCannotFindMacroDef.prototype.impossible = true;\nCannotFindMacroDef.prototype.name = \"macroparam\";\n// Failed relinks due to missing definitions aren't reported for now.\n// I may want to do something special later on.\nCannotFindMacroDef.prototype.report = function() { return []; };\n\nvar MacrocallEntry = EntryNode.newCollection(\"macrocall\");\n\nMacrocallEntry.prototype.forEachChildReport = function(report, parameter, type) {\n\tvar rtn;\n\tif (report.length > 0) {\n\t\trtn = parameter + ': \"' + report + '\"';\n\t} else {\n\t\trtn = parameter;\n\t}\n\treturn \"<<\" + this.macro + \" \" + rtn + \">>\";\n};\n\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2],\n\t\tmacroText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tif (!options.settings.survey(macroText, fromTitle, options)) {\n\t\treturn undefined;\n\t}\n\tvar start = this.matchRegExp.lastIndex - this.match[0].length;\n\tvar managedMacro = options.settings.getMacro(macroName);\n\tif (!managedMacro) {\n\t\t// We don't manage this macro. Bye.\n\t\treturn undefined;\n\t}\n\tvar offset = macroName.length+2;\n\toffset = $tw.utils.skipWhiteSpace(macroText, offset);\n\tvar params = parseParams(paramString, offset+start);\n\tvar macroInfo = {\n\t\tname: macroName,\n\t\tstart: start,\n\t\tend: this.matchRegExp.lastIndex,\n\t\tparams: params\n\t};\n\tvar mayBeWidget = true;\n\tvar names = getParamNames(macroInfo.name, macroInfo.params, options);\n\tif (names === undefined) {\n\t\t// Needed the definition, and couldn't find it. So if a single\n\t\t// parameter needs to placeholder, just fail.\n\t\tmayBeWidget = false;\n\t}\n\tvar entry = relinkMacroInvocation(macroInfo, text, fromTitle, toTitle, mayBeWidget, options);\n\tif (entry && entry.output) {\n\t\tentry.output =macroToString(entry.output, text, names, options);\n\t}\n\treturn entry;\n};\n\n/** Relinks macros that occur as attributes, like <$element attr=<<...>> />\n * Processes the same, except it can't downgrade into a widget if the title\n * is complicated.\n */\nexports.relinkAttribute = function(macro, text, fromTitle, toTitle, options) {\n\tvar entry = relinkMacroInvocation(macro, text, fromTitle, toTitle, false, options);\n\tif (entry && entry.output) {\n\t\tentry.output = macroToStringMacro(entry.output, text, options);\n\t}\n\treturn entry;\n};\n\n/**Processes the given macro,\n * macro: {name:, params:, start:, end:}\n * each parameters: {name:, end:, value:}\n * Macro invocation returned is the same, but relinked, and may have new keys:\n * parameters: {type: macro, start:, newValue: (quoted replacement value)}\n * Output of the returned entry isn't a string, but a macro object. It needs\n * to be converted.\n */\nfunction relinkMacroInvocation(macro, text, fromTitle, toTitle, mayBeWidget, options) {\n\tvar managedMacro = options.settings.getMacro(macro.name);\n\tvar modified = false;\n\tif (!managedMacro) {\n\t\t// We don't manage this macro. Bye.\n\t\treturn undefined;\n\t}\n\tif (macro.params.every(function(p) {\n\t\treturn !options.settings.survey(p.value, fromTitle, options);\n\t})) {\n\t\t// We cut early if the fromTitle doesn't even appear\n\t\t// anywhere in the title. This is to avoid any headache\n\t\t// about finding macro definitions (and any resulting\n\t\t// exceptions if there isn't even a title to replace.\n\t\treturn undefined;\n\t}\n\tvar outMacro = $tw.utils.extend({}, macro);\n\tvar macroEntry = new MacrocallEntry();\n\tmacroEntry.parameters = Object.create(null);\n\toutMacro.params = macro.params.slice();\n\tfor (var managedArg in managedMacro) {\n\t\tvar index;\n\t\ttry {\n\t\t\tindex = getParamIndexWithinMacrocall(macro.name, managedArg, macro.params, options);\n\t\t} catch (e) {\n\t\t\tif (e instanceof CannotFindMacroDef) {\n\t\t\t\tmacroEntry.addChild(e);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (index < 0) {\n\t\t\t// this arg either was not supplied, or we can't find\n\t\t\t// the definition, so we can't tie it to an anonymous\n\t\t\t// argument. Either way, move on to the next.\n\t\t\tcontinue;\n\t\t}\n\t\tvar param = macro.params[index];\n\t\tvar handler = managedMacro[managedArg];\n\t\tvar entry = handler.relink(param.value, fromTitle, toTitle, options);\n\t\tif (entry === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\t// Macro parameters can only be string parameters, not\n\t\t// indirect, or macro, or filtered\n\t\tmacroEntry.addChild(entry, managedArg, \"string\");\n\t\tif (!entry.output) {\n\t\t\tcontinue;\n\t\t}\n\t\tvar quote = utils.determineQuote(text, param);\n\t\tvar quoted = utils.wrapParameterValue(entry.output, quote);\n\t\tvar newParam = $tw.utils.extend({}, param);\n\t\tif (quoted === undefined) {\n\t\t\tif (!mayBeWidget || !options.placeholder) {\n\t\t\t\tentry.impossible = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar ph = options.placeholder.getPlaceholderFor(entry.output,handler.name, options);\n\t\t\tnewParam.newValue = \"<<\"+ph+\">>\";\n\t\t\tnewParam.type = \"macro\";\n\t\t} else {\n\t\t\tnewParam.start = newParam.end - (newParam.value.length + (quote.length*2));\n\t\t\tnewParam.value = entry.output;\n\t\t\tnewParam.newValue = quoted;\n\t\t}\n\t\toutMacro.params[index] = newParam;\n\t\tmodified = true;\n\t}\n\tif (macroEntry.hasChildren()) {\n\t\tmacroEntry.macro = macro.name;\n\t\tif (modified) {\n\t\t\tmacroEntry.output = outMacro;\n\t\t}\n\t\treturn macroEntry;\n\t}\n\treturn undefined;\n};\n\nfunction mustBeAWidget(macro) {\n\tfor (var i = 0; i < macro.params.length; i++) {\n\t\tif (macro.params[i].type === \"macro\") {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false\n};\n\n/**Given a macro object ({name:, params:, start: end:}), and the text where\n * it was parsed from, returns a new macro that maintains any syntactic\n * structuring.\n */\nfunction macroToString(macro, text, names, options) {\n\tif (mustBeAWidget(macro)) {\n\t\tvar attrs = [];\n\t\tfor (var i = 0; i < macro.params.length; i++) {\n\t\t\tvar p = macro.params[i];\n\t\t\tvar val;\n\t\t\tif (p.newValue) {\n\t\t\t\tval = p.newValue;\n\t\t\t} else {\n\t\t\t\tval = utils.wrapAttributeValue(p.value);\n\t\t\t}\n\t\t\tattrs.push(\" \"+names[i]+\"=\"+val);\n\t\t}\n\t\treturn \"<$macrocall $name=\"+utils.wrapAttributeValue(macro.name)+attrs.join('')+\"/>\";\n\t} else {\n\t\treturn macroToStringMacro(macro, text, options);\n\t}\n};\n\nfunction macroToStringMacro(macro, text, options) {\n\tvar builder = new Rebuilder(text, macro.start);\n\tfor (var i = 0; i < macro.params.length; i++) {\n\t\tvar param = macro.params[i];\n\t\tif (param.newValue) {\n\t\t\tbuilder.add(param.newValue, param.start, param.end);\n\t\t}\n\t}\n\treturn builder.results(macro.end);\n};\n\n/** Returns -1 if param definitely isn't in macrocall.\n */\nfunction getParamIndexWithinMacrocall(macroName, param, params, options) {\n\tvar index, i, anonsExist = false;\n\tfor (i = 0; i < params.length; i++) {\n\t\tvar name = params[i].name;\n\t\tif (name === param) {\n\t\t\treturn i;\n\t\t}\n\t\tif (name === undefined) {\n\t\t\tanonsExist = true;\n\t\t}\n\t}\n\tif (!anonsExist) {\n\t\t// If no anonymous parameters are present, and we didn't find\n\t\t// it among the named ones, it must not be there.\n\t\treturn -1;\n\t}\n\tvar expectedIndex = indexOfParameterDef(macroName, param, options);\n\t// We've got to skip over all the named parameter instances.\n\tif (expectedIndex >= 0) {\n\t\tvar anonI = 0;\n\t\tfor (i = 0; i < params.length; i++) {\n\t\t\tif (params[i].name === undefined) {\n\t\t\t\tif (anonI === expectedIndex) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t\tanonI++;\n\t\t\t} else {\n\t\t\t\tvar indexOfOther = indexOfParameterDef(macroName, params[i].name, options);\n\t\t\t\tif (indexOfOther < expectedIndex) {\n\t\t\t\t\tanonI++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn -1;\n};\n\n// Looks up the definition of a macro, and figures out what the expected index\n// is for the given parameter.\nfunction indexOfParameterDef(macroName, paramName, options) {\n\tvar def = options.settings.getMacroDefinition(macroName);\n\tif (def === undefined) {\n\t\tthrow new CannotFindMacroDef();\n\t}\n\tvar params = def.params || [];\n\tfor (var i = 0; i < params.length; i++) {\n\t\tif (params[i].name === paramName) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n};\n\nfunction getParamNames(macroName, params, options) {\n\tvar used = Object.create(null);\n\tvar rtn = new Array(params.length);\n\tvar anonsExist = false;\n\tvar i;\n\tfor (i = 0; i < params.length; i++) {\n\t\tvar name = params[i].name;\n\t\tif (name) {\n\t\t\trtn[i] = name;\n\t\t\tused[name] = true;\n\t\t} else {\n\t\t\tanonsExist = true;\n\t\t}\n\t}\n\tif (anonsExist) {\n\t\tvar def = options.settings.getMacroDefinition(macroName);\n\t\tif (def === undefined) {\n\t\t\t// If there are anonymous parameters, and we can't\n\t\t\t// find the definition, then we can't hope to create\n\t\t\t// a widget.\n\t\t\treturn undefined;\n\t\t}\n\t\tvar defParams = def.params || [];\n\t\tvar defPtr = 0;\n\t\tfor (i = 0; i < params.length; i++) {\n\t\t\tif (rtn[i] === undefined) {\n\t\t\t\twhile(defPtr < defParams.length && used[defParams[defPtr].name]) {\n\t\t\t\t\tdefPtr++;\n\t\t\t\t}\n\t\t\t\tif (defPtr >= defParams.length) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\trtn[i] = defParams[defPtr].name;\n\t\t\t\tused[defParams[defPtr].name] = true;\n\t\t\t}\n\t\t}\n\t}\n\treturn rtn;\n};\n\nfunction parseParams(paramString, pos) {\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\t//paramInfo.start = pos;\n\t\tparamInfo.end = reParam.lastIndex + pos;\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn params;\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrocall.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrodef.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles pragma macro definitions. Except we only update placeholder macros\nthat we may have previously install.\n\n\\define relink-?() Tough title\n\n\\*/\n\nvar settings = require(\"$:/plugins/flibbles/relink/js/settings\");\n\nexports.name = \"macrodef\";\n\nfunction MacrodefEntry(macroName, bodyEntry) {\n\tthis.macro = macroName;\n\tthis.body = bodyEntry;\n};\nMacrodefEntry.prototype.name = \"macrodef\";\nMacrodefEntry.prototype.eachChild = function(block) { return block(this.body);};\nMacrodefEntry.prototype.report = function() {\n\tvar macroStr = \"\\\\define \" + this.macro + \"()\";\n\tif (this.body.report) {\n\t\treturn this.body.report().map(function(report) {\n\t\t\treturn macroStr + \" \" + report;\n\t\t});\n\t} else {\n\t\treturn [macroStr];\n\t}\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar setParseTreeNode = this.parse(),\n\t\tmacroEntry,\n\t\tm = this.match,\n\t\tplaceholder = /^relink-(?:(\\w+)-)?(\\d+)$/.exec(m[1]),\n\t\twhitespace;\n\toptions.settings.addMacroDefinition(setParseTreeNode[0]);\n\t// Parse set the pos pointer, but we don't want to skip the macro body.\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tif (placeholder && m[2] === '') {\n\t\tvar valueRegExp;\n\t\t// m[3] means it's a multiline macrodef\n\t\tif (m[3]) {\n\t\t\tvalueRegExp = /\\r?\\n\\\\end[^\\S\\n\\r]*(?:\\r?\\n|$)/mg;\n\t\t\twhitespace = m[3];\n\t\t} else {\n\t\t\tvar newPos = $tw.utils.skipWhiteSpace(text, this.parser.pos);\n\t\t\tvalueRegExp = /(?:\\r?\\n|$)/mg;\n\t\t\twhitespace = text.substring(this.parser.pos, newPos);\n\t\t\tthis.parser.pos = newPos;\n\t\t}\n\t\tvalueRegExp.lastIndex = this.parser.pos;\n\t\tvar match = valueRegExp.exec(text);\n\t\tif (match) {\n\t\t\tvar handler = settings.getType(placeholder[1] || 'title');\n\t\t\tif (handler) {\n\t\t\t\tvar value = text.substring(this.parser.pos, match.index);\n\t\t\t\tvar entry = handler.relink(value, fromTitle, toTitle, options);\n\t\t\t\tif (entry !== undefined) {\n\t\t\t\t\tmacroEntry = new MacrodefEntry(m[1], entry);\n\t\t\t\t\tif (entry.output) {\n\t\t\t\t\t\tmacroEntry.output = this.makePlaceholder(m[1], whitespace+entry.output+match[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.parser.pos = match.index + match[0].length;\n\t\t}\n\t}\n\treturn macroEntry;\n};\n\nexports.makePlaceholder = function(name, content) {\n\treturn \"\\\\define \" + name + \"()\" + content;\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrodef.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles replacement in wiki text inline rules, like,\n\n[[Introduction]]\n\n[[link description|TiddlerTitle]]\n\n\\*/\n\nvar utils = require(\"./utils.js\");\n\nfunction PrettyLinkEntry() {};\nPrettyLinkEntry.prototype.name = \"prettylink\";\nPrettyLinkEntry.prototype.report = function() {\n\treturn [\"[[\" + (this.caption || this.link) + \"]]\"];\n};\n\nexports.name = \"prettylink\";\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar caption, m = this.match;\n\tif (m[2] === fromTitle) {\n\t\t// format is [[caption|MyTiddler]]\n\t\tcaption = m[1];\n\t} else if (m[2] !== undefined || m[1] !== fromTitle) {\n\t\t// format is [[MyTiddler]], and it doesn't match\n\t\treturn undefined;\n\t}\n\tvar entry = new PrettyLinkEntry();\n\tentry.caption = caption;\n\tentry.link = toTitle;\n\tentry.output = this.makeLink(toTitle, caption, options);\n\tif (entry.output === undefined) {\n\t\tentry.impossible = true;\n\t}\n\treturn entry;\n};\n\nexports.makeLink = function(tiddler, caption, options) {\n\tvar output, quoted;\n\tif (this.canBePretty(tiddler)) {\n\t\toutput = prettyLink(tiddler, caption);\n\t} else if (caption === undefined) {\n\t\tif (exports.shorthandSupported(options)) {\n\t\t\tquoted = utils.wrapAttributeValue(tiddler);\n\t\t\tif (!quoted) {\n\t\t\t\tif (!options.placeholder) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tquoted = \"<<\" + options.placeholder.getPlaceholderFor(tiddler,undefined,options) + \">>\";\n\t\t\t}\n\t\t\toutput = \"<$link to=\"+quoted+\"/>\";\n\t\t} else {\n\t\t\t// If we don't have a caption, we must resort to\n\t\t\t// placeholders anyway to prevent link/caption desync\n\t\t\t// from later relinks.\n\t\t\t// It doesn't matter whether the tiddler is quotable.\n\t\t\tif (options.placeholder) {\n\t\t\t\tvar ph = options.placeholder.getPlaceholderFor(tiddler, undefined, options);\n\t\t\t\toutput = \"<$link to=<<\"+ph+\">>><$text text=<<\"+ph+\">>/></$link>\";\n\t\t\t}\n\t\t}\n\t} else if (quoted = utils.wrapAttributeValue(tiddler)) {\n\t\tvar safeCaption = sanitizeCaption(caption, options);\n\t\tif (safeCaption !== undefined) {\n\t\t\toutput = \"<$link to=\"+quoted+\">\"+safeCaption+\"</$link>\";\n\t\t}\n\t} else if (options.placeholder) {\n\t\tvar ph = options.placeholder.getPlaceholderFor(tiddler, undefined, options);\n\t\t// We don't test if caption is undefined here, because it\n\t\t// never will be. options.placeholder exists.\n\t\tvar safeCaption = sanitizeCaption(caption, options);\n\t\toutput = \"<$link to=<<\"+ph+\">>>\"+safeCaption+\"</$link>\";\n\t}\n\treturn output;\n};\n\n/**Return true if value can be used inside a prettylink.\n */\nexports.canBePretty = function(value) {\n\treturn value.indexOf(\"]]\") < 0 && value[value.length-1] !== ']';\n};\n\n/**In version 5.1.20, Tiddlywiki made it so <$link to\"something\" /> would\n * use \"something\" as a caption. This is preferable. However, Relink works\n * going back to 5.1.14, so we need to have different handling for both\n * cases.\n */\nvar _supported;\nexports.shorthandSupported = function(options) {\n\tif (_supported === undefined) {\n\t\tvar test = options.wiki.renderText(\"text/plain\", \"text/vnd.tiddlywiki\", \"<$link to=test/>\");\n\t\t_supported = (test === \"test\");\n\t}\n\treturn _supported;\n};\n\nfunction sanitizeCaption(caption, options) {\n\tvar plaintext = options.wiki.renderText(\"text/plain\", \"text/vnd.tiddlywiki\", caption);\n\tif (plaintext === caption && caption.indexOf(\"</$link>\") <= 0) {\n\t\treturn caption;\n\t} else {\n\t\tvar wrapped = utils.wrapAttributeValue(caption);\n\t\tif (wrapped) {\n\t\t\treturn \"<$text text=\"+wrapped+\"/>\";\n\t\t} else if (options.placeholder) {\n\t\t\tvar ph = options.placeholder.getPlaceholderFor(caption, \"caption\", options);\n\t\t\treturn \"<$text text=<<\"+ph+\">>/>\";\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n};\n\nfunction prettyLink(title, caption) {\n\tif (caption) {\n\t\treturn \"[[\" + caption + \"|\" + title + \"]]\";\n\t} else {\n\t\treturn \"[[\" + title + \"]]\";\n\t}\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/relink.js": {
"text": "/*\\\nmodule-type: wikirule\n\nThis defines the \\relink inline pragma used to locally declare\nrelink rules for macros.\n\nIt takes care of providing its own relink and report rules.\n\n\\*/\n\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\n\nexports.name = \"relink\";\nexports.types = {pragma: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /^\\\\relink[^\\S\\n]+([^(\\s]+)([^\\r\\n]*)(\\r?\\n)?/mg;\n};\n\n/**This makes the widget that the macro library will later parse to determine\n * new macro relink state.\n *\n * It's a <$set> widget so it can appear BEFORE \\define pragma and not\n * prevent that pragma from being scooped up by importvariables.\n * (importvariables stops scooping as soon as it sees something besides $set) */\nexports.parse = function() {\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar macroName;\n\tvar macroParams = Object.create(null);\n\tvar error = undefined;\n\tvar rtn = [];\n\tvar self = this;\n\tthis.interpretSettings(function(macro, parameter, type) {\n\t\tmacroName = macro;\n\t\tif (type && !settings.getType(type)) {\n\t\t\terror = language.getString(\"Error/UnrecognizedType\",\n\t\t\t\t{variables: {type: type}, wiki: self.parser.wiki});\n\t\t}\n\t\tmacroParams[parameter] = type;\n\t});\n\t// If no macroname. Return nothing, this rule will be ignored by parsers\n\tif (macroName) {\n\t\tvar relink = Object.create(null);\n\t\trelink[macroName] = macroParams;\n\t\trtn.push({\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: \"\"}\n\t\t\t},\n\t\t\tchildren: [],\n\t\t\tisMacroDefinition: true,\n\t\t\trelink: relink});\n\t}\n\tif (error) {\n\t\trtn.push({\n\t\t\ttype: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tc-error tc-relink-error\"\n\t\t\t\t}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: error}\n\t\t\t]});\n\t}\n\treturn rtn;\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar self = this;\n\tthis.interpretSettings(function(macro, parameter, type) {\n\t\toptions.settings.addSetting(macro, parameter, type, options.currentTiddler);\n\t});\n\t// Return nothing, because this rule is ignored by the parser\n\treturn undefined;\n};\n\nexports.interpretSettings = function(block) {\n\tvar paramString = this.match[2];\n\tif (paramString !== \"\") {\n\t\tvar macro = this.match[1];\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*([^\\s]+))?/mg;\n\t\tvar paramMatch = reParam.exec(paramString);\n\t\twhile (paramMatch) {\n\t\t\tvar parameter = paramMatch[1];\n\t\t\tvar type = paramMatch[2];\n\t\t\tblock(macro, parameter, type);\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n};\n",
"module-type": "wikirule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/relink.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/rules.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nParses and acknowledges any pragma rules a tiddler has.\n\n\\rules except html wikilink\n\n\\*/\n\nexports.name = \"rules\";\n\n/**This is all we have to do. The rules rule doesn't parse. It just amends\n * the rules, which is exactly what I want it to do too.\n * It also takes care of moving the pos pointer forward.\n */\nexports.relink = function() {\n\tthis.parse();\n\treturn undefined;\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/rules.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/syslink.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles sys links\n\n$:/sys/link\n\nbut not:\n\n~$:/sys/link\n\n\\*/\n\nvar utils = require(\"./utils.js\");\nvar prettylink = require('$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js');\n\nexports.name = \"syslink\";\n\nfunction SyslinkEntry() {};\nSyslinkEntry.prototype.name = \"syslink\";\nSyslinkEntry.prototype.report = function() {\n\treturn [\"~\" + this.link];\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar entry = undefined;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tif (this.match[0] === fromTitle && this.match[0][0] !== \"~\") {\n\t\tentry = new SyslinkEntry();\n\t\tentry.link = fromTitle;\n\t\tentry.output = this.makeSyslink(toTitle, options);\n\t\tif (entry.output === undefined) {\n\t\t\tentry.impossible = true;\n\t\t}\n\t}\n\treturn entry;\n};\n\nexports.makeSyslink = function(title, options) {\n\tvar match = title.match(this.matchRegExp);\n\tif (match && match[0] === title && title[0] !== \"~\") {\n\t\treturn title;\n\t} else {\n\t\treturn prettylink.makeLink(title, undefined, options);\n\t}\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/syslink.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/transclude.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles replacement of transclusions in wiki text like,\n\n{{RenamedTiddler}}\n{{RenamedTiddler||TemplateTitle}}\n\nThis renames both the tiddler and the template field.\n\n\\*/\n\nvar refHandler = require(\"$:/plugins/flibbles/relink/js/fieldtypes/reference\");\nvar utils = require(\"./utils.js\");\n\nexports.name = ['transcludeinline', 'transcludeblock'];\n\nvar TranscludeEntry = function() {};\nTranscludeEntry.prototype.name = \"transclude\";\nTranscludeEntry.prototype.report = function() {\n\tvar ref = this.reference || {};\n\tvar output = [];\n\tif (this.referenceChanged) {\n\t\tvar suffix = \"\";\n\t\tif (ref.field) {\n\t\t\tsuffix = \"!!\" + ref.field;\n\t\t}\n\t\tif (ref.index) {\n\t\t\tsuffix = \"##\" + ref.index;\n\t\t}\n\t\tif (this.template) {\n\t\t\tsuffix = suffix + \"||\" + this.template;\n\t\t}\n\t\toutput.push(\"{{\" + suffix + \"}}\");\n\t}\n\tif (this.templateChanged) {\n\t\t// Must be template\n\t\tvar refString = refHandler.toString(ref);\n\t\toutput.push(\"{{\" + refString + \"||}}\");\n\t}\n\treturn output;\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar m = this.match,\n\t\treference = $tw.utils.parseTextReference(m[1]),\n\t\ttemplate = m[2],\n\t\tentry = new TranscludeEntry(),\n\t\tmodified = false;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tif ($tw.utils.trim(reference.title) === fromTitle) {\n\t\t// preserve user's whitespace\n\t\treference.title = reference.title.replace(fromTitle, toTitle);\n\t\tmodified = true;\n\t\tentry.referenceChanged = true;\n\t}\n\tif ($tw.utils.trim(template) === fromTitle) {\n\t\ttemplate = template.replace(fromTitle, toTitle);\n\t\tmodified = true;\n\t\tentry.templateChanged = true;\n\t}\n\tif (modified) {\n\t\tentry.reference = reference;\n\t\tentry.template = template;\n\t\tvar output = this.makeTransclude(reference, template, options);\n\t\tif (output) {\n\t\t\t// Adding any newline that might have existed is\n\t\t\t// what allows this relink method to work for both\n\t\t\t// the block and inline filter wikitext rule.\n\t\t\toutput = output + utils.getEndingNewline(m[0]);\n\t\t\tentry.output = output;\n\t\t} else {\n\t\t\tentry.impossible = true;\n\t\t}\n\t\treturn entry;\n\t}\n\treturn undefined;\n};\n\n/** This converts a reference and a template into a string representation\n * of a transclude.\n */\nexports.makeTransclude = function(reference, template, options) {\n\tvar rtn;\n\tif (!canBePrettyTemplate(template)) {\n\t\tvar resultTemplate = wrap(template, options);\n\t\tif (resultTemplate !== undefined) {\n\t\t\tif (reference.title) {\n\t\t\t\tvar resultTitle = wrap(reference.title, options);\n\t\t\t\tvar attrs = transcludeAttributes(reference.field, reference.index, options);\n\t\t\t\tif (resultTitle !== undefined && attrs !== undefined) {\n\t\t\t\t\trtn = \"<$tiddler tiddler=\"+resultTitle+\"><$transclude tiddler=\"+resultTemplate+attrs+\"/></$tiddler>\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trtn = \"<$transclude tiddler=\"+resultTemplate+\"/>\";\n\t\t\t}\n\t\t}\n\t} else if (!canBePrettyTitle(reference.title)) {\n\t\t// This block and the next account for the 1%...\n\t\tvar resultTitle = wrap(reference.title, options);\n\t\tif (resultTitle !== undefined) {\n\t\t\tvar reducedRef = {field: reference.field, index: reference.index};\n\t\t\trtn = \"<$tiddler tiddler=\"+resultTitle+\">\"+prettyTransclude(reducedRef, template)+\"</$tiddler>\";\n\t\t}\n\t} else {\n\t\t// This block takes care of 99% of all cases\n\t\trtn = prettyTransclude(reference, template);\n\t}\n\treturn rtn;\n};\n\nfunction wrap(tiddler, options) {\n\ttiddler = $tw.utils.trim(tiddler);\n\tvar result = utils.wrapAttributeValue(tiddler);\n\tif (result === undefined) {\n\t\tif (options.placeholder) {\n\t\t\tresult = \"<<\" + options.placeholder.getPlaceholderFor(tiddler, undefined, options) + \">>\";\n\t\t}\n\t}\n\treturn result;\n};\n\nfunction canBePrettyTitle(value) {\n\treturn refHandler.canBePretty(value) && canBePrettyTemplate(value);\n};\n\nfunction canBePrettyTemplate(value) {\n\treturn !value || (value.indexOf('}') < 0 && value.indexOf('{') < 0 && value.indexOf('|') < 0);\n};\n\n/**Returns attributes for a transclude widget.\n * only field or index should be used, not both, but both will return\n * the intuitive (albeit useless) result.\n */\nfunction transcludeAttributes(field, index, options) {\n\tvar rtn = [\n\t\twrapAttribute(\"field\", field, options),\n\t\twrapAttribute(\"index\", index, options)\n\t];\n\tif (rtn[0] === undefined || rtn[1] === undefined) {\n\t\t// This can only happen if the transclude is using an\n\t\t// illegal key.\n\t\treturn undefined;\n\t}\n\treturn rtn.join('');\n};\n\nfunction wrapAttribute(name, value, options) {\n\tif (value) {\n\t\tvar wrappedValue = utils.wrapAttributeValue(value);\n\t\tif (wrappedValue === undefined) {\n\t\t\tif (!options.placeholder) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\twrappedValue = \"<<\"+options.placeholder.getPlaceholderFor(value, name, options)+\">>\";\n\t\t}\n\t\treturn \" \"+name+\"=\"+wrappedValue;\n\t}\n\treturn '';\n};\n\nfunction prettyTransclude(textReference, template) {\n\tif (typeof textReference !== \"string\") {\n\t\ttextReference = refHandler.toString(textReference);\n\t}\n\tif (!textReference) {\n\t\ttextReference = '';\n\t}\n\tif (template !== undefined) {\n\t\treturn \"{{\"+textReference+\"||\"+template+\"}}\";\n\t} else {\n\t\treturn \"{{\"+textReference+\"}}\";\n\t}\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/transclude.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/utils.js": {
"text": "/*\\\nmodule-type: library\n\nUtility methods for the wikitext relink rules.\n\n\\*/\n\n/**Finds an appropriate quote mark for a given value.\n *\n *Tiddlywiki doesn't have escape characters for attribute values. Instead,\n * we just have to find the type of quotes that'll work for the given title.\n * There exist titles that simply can't be quoted.\n * If it can stick with the preference, it will.\n *\n * return: Returns the wrapped value, or undefined if it's impossible to wrap\n */\nexports.wrapAttributeValue = function(value, preference) {\n\tvar whitelist = [\"\", \"'\", '\"', '\"\"\"'];\n\tvar choices = {\n\t\t\"\": function(v) {return !/([\\/\\s<>\"'=])/.test(v); },\n\t\t\"'\": function(v) {return v.indexOf(\"'\") < 0; },\n\t\t'\"': function(v) {return v.indexOf('\"') < 0; },\n\t\t'\"\"\"': function(v) {return v.indexOf('\"\"\"') < 0 && v[v.length-1] != '\"';}\n\t};\n\tif (choices[preference] && choices[preference](value)) {\n\t\treturn wrap(value, preference);\n\t}\n\tfor (var i = 0; i < whitelist.length; i++) {\n\t\tvar quote = whitelist[i];\n\t\tif (choices[quote](value)) {\n\t\t\treturn wrap(value, quote);\n\t\t}\n\t}\n\t// No quotes will work on this\n\treturn undefined;\n};\n\n/**Like wrapAttribute value, except for macro parameters, not attributes.\n *\n * These are more permissive. Allows brackets,\n * and slashes and '<' in unquoted values.\n */\nexports.wrapParameterValue = function(value, preference) {\n\tvar whitelist = [\"\", \"'\", '\"', '[[', '\"\"\"'];\n\tvar choices = {\n\t\t\"\": function(v) {return !/([\\s>\"'=])/.test(v); },\n\t\t\"'\": function(v) {return v.indexOf(\"'\") < 0; },\n\t\t'\"': function(v) {return v.indexOf('\"') < 0; },\n\t\t\"[[\": exports.canBePrettyOperand,\n\t\t'\"\"\"': function(v) {return v.indexOf('\"\"\"') < 0 && v[v.length-1] != '\"';}\n\t};\n\tif (choices[preference] && choices[preference](value)) {\n\t\treturn wrap(value, preference);\n\t}\n\tfor (var i = 0; i < whitelist.length; i++) {\n\t\tvar quote = whitelist[i];\n\t\tif (choices[quote](value)) {\n\t\t\treturn wrap(value, quote);\n\t\t}\n\t}\n\t// No quotes will work on this\n\treturn undefined;\n};\n\nfunction wrap(value, wrapper) {\n\tvar wrappers = {\n\t\t\"\": function(v) {return v; },\n\t\t\"'\": function(v) {return \"'\"+v+\"'\"; },\n\t\t'\"': function(v) {return '\"'+v+'\"'; },\n\t\t'\"\"\"': function(v) {return '\"\"\"'+v+'\"\"\"'; },\n\t\t\"[[\": function(v) {return \"[[\"+v+\"]]\"; }\n\t};\n\tvar chosen = wrappers[wrapper];\n\tif (chosen) {\n\t\treturn chosen(value);\n\t} else {\n\t\treturn undefined;\n\t}\n};\n\nexports.canBePrettyOperand = function(value) {\n\treturn value.indexOf(']') < 0;\n};\n\n/**Given some text, and a param or attribute within that text, this returns\n * what type of quotation that attribute is using.\n *\n * param: An object in the form {end:, ...}\n */\nexports.determineQuote = function(text, param) {\n\tvar pos = param.end-1;\n\tif (text[pos] === \"'\") {\n\t\treturn \"'\";\n\t}\n\tif (text[pos] === '\"') {\n\t\tif (text.substr(pos-2, 3) === '\"\"\"') {\n\t\t\treturn '\"\"\"';\n\t\t} else {\n\t\t\treturn '\"';\n\t\t}\n\t}\n\tif (text.substr(pos-1,2) === ']]' && text.substr((pos-param.value.length)-3, 2) === '[[') {\n\t\treturn \"[[\";\n\t}\n\treturn '';\n};\n\n// Finds the newline at the end of a string and returns it. Empty string if\n// none exists.\nexports.getEndingNewline = function(string) {\n\tvar l = string.length;\n\tif (string[l-1] === '\\n') {\n\t\treturn (string[l-2] === '\\r') ? \"\\r\\n\" : \"\\n\";\n\t}\n\treturn \"\";\n};\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/utils.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/wikilink.js": {
"text": "/*\\\nmodule-type: relinkwikitextrule\n\nHandles CamelCase links\n\nWikiLink\n\nbut not:\n\n~WikiLink\n\n\\*/\n\nvar utils = require(\"./utils.js\");\nvar prettylink = require('$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js');\n\nexports.name = \"wikilink\";\n\nfunction WikilinkEntry() {};\nWikilinkEntry.prototype.name = \"wikilink\";\nWikilinkEntry.prototype.report = function() {\n\treturn [$tw.config.textPrimitives.unWikiLink + this.link];\n};\n\nexports.relink = function(text, fromTitle, toTitle, options) {\n\tvar entry = undefined;\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tif (this.match[0] === fromTitle && this.match[0][0] !== $tw.config.textPrimitives.unWikiLink) {\n\t\tentry = new WikilinkEntry();\n\t\tentry.link = fromTitle;\n\t\tentry.output = this.makeWikilink(toTitle, options);\n\t\tif (entry.output === undefined) {\n\t\t\tentry.impossible = true;\n\t\t}\n\t}\n\treturn entry;\n};\n\nexports.makeWikilink = function(title, options) {\n\tif (title.match(this.matchRegExp) && title[0] !== $tw.config.textPrimitives.unWikiLink) {\n\t\treturn title;\n\t} else {\n\t\treturn prettylink.makeLink(title, undefined, options);\n\t}\n};\n",
"module-type": "relinkwikitextrule",
"title": "$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/wikilink.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/surveyors/raw.js": {
"text": "/*\\\n\nThis looks at text and sees if fromTitle is inside of it. That's all.\n\nSURVEYORS\n\nSurveyors are an optimization. They are way of quick-discarding text so it\ndoesn't have to be interpreted by the wikitext parser, the filter parser,\netc...\n\nThe reason I split this off into a module type is in case anyone wants to\nrelink patterns which might NOT contain the fromTitle in raw text.\n\nThey return false for \"no\", and true for \"maybe\". If any surveyor returns\n\"maybe\", the text in question is fully parsed.\n\nSee the documentation for more details.\n\n\\*/\n\nexports.survey = function(text, fromTitle, options) {\n\treturn text.indexOf(fromTitle) >= 0;\n};\n",
"module-type": "relinksurveyor",
"title": "$:/plugins/flibbles/relink/js/surveyors/raw.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/utils/entry.js": {
"text": "function EntryNode() {\n\tthis.children = [];\n};\n\nmodule.exports = EntryNode;\n\n/** PURE VIRTUAL\n * EntryNode.prototype.report = function() -> [\"string\", ...]\n */\n\nEntryNode.newType = function(name) {\n\tfunction NewEntry() {\n\t\tEntryNode.apply(this, arguments);\n\t};\n\tNewEntry.prototype = Object.create(EntryNode.prototype);\n\tNewEntry.prototype.name = name;\n\treturn NewEntry;\n};\n\nEntryNode.prototype.eachChild = function(method) {\n\tif (this.children) {\n\t\tfor (var i = 0; i < this.children.length; i++) {\n\t\t\tmethod(this.children[i]);\n\t\t}\n\t}\n};\n\nEntryNode.prototype.add = function(entry) {\n\tthis.children.push(entry);\n};\n\nfunction EntryCollection() {\n\tthis.children = Object.create(null);\n\tthis.types = Object.create(null);\n};\n\nEntryNode.newCollection = function(name) {\n\tfunction NewCollection() {\n\t\tEntryCollection.apply(this, arguments);\n\t};\n\tNewCollection.prototype = Object.create(EntryCollection.prototype);\n\tNewCollection.prototype.name = name;\n\treturn NewCollection;\n};\n\nEntryCollection.prototype.eachChild = function(method) {\n\tfor (var child in this.children) {\n\t\tmethod(this.children[child]);\n\t}\n};\n\nEntryCollection.prototype.addChild = function(child, name, type) {\n\tthis.children[name] = child;\n\tthis.types[name] = type;\n};\n\nEntryCollection.prototype.report = function() {\n\tvar output = [];\n\tfor (var name in this.children) {\n\t\tvar child = this.children[name];\n\t\tvar type = this.types[name];\n\t\tif (child.report) {\n\t\t\tvar reports = child.report();\n\t\t\tfor (var i = 0; i < reports.length; i++) {\n\t\t\t\toutput.push(this.forEachChildReport(reports[i], name, type));\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(this.forEachChildReport('', name, type));\n\n\t\t}\n\t}\n\treturn output;\n};\n\nEntryCollection.prototype.hasChildren = function() {\n\treturn Object.keys(this.children).length > 0;\n};\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/utils/entry.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/utils/macroConfig.js": {
"text": "/*\\\nmodule-type: library\n\nThis handles the fetching and distribution of relink settings.\n\n\\*/\n\nvar settings = require('$:/plugins/flibbles/relink/js/settings.js');\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction MacroConfig(wiki, parent, title) {\n\tthis.macros = Object.create(null);\n\tthis.parent = parent;\n\tthis.title = title;\n\tthis.wiki = wiki;\n\tthis.widgetList = [];\n\tthis.reservedmacroNames = Object.create(null);\n};\n\nmodule.exports = MacroConfig;\n\nMacroConfig.prototype.import = function(filter) {\n\tvar parentWidget;\n\tif (this.parent) {\n\t\tparentWidget = this.getVariableWidget();\n\t}\n\tvar importWidget = createImportWidget(filter, this.wiki, parentWidget);\n\tthis._compileList(importWidget.tiddlerList);\n\tthis.widgetList.push(importWidget);\n\t// This only works if only one filter is imported\n\tthis.addWidget(importWidget);\n};\n\nMacroConfig.prototype.refresh = function(changes) {\n\tthis.parent.refresh(changes);\n\tif (this.widget.refresh(changes)) {\n\t\tthis.macros = Object.create(null);\n\t\t// Recompile all our widgets in the same order\n\t\tfor (var i = 0; i < this.widgetList.length; i++) {\n\t\t\tthis._compileList(this.widgetList[i].tiddlerList );\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n// This class does no special handling of fields, operators, or attributes.\n// we pass it along to the parent.\nMacroConfig.prototype.getFields = function() {\n\treturn this.parent.getFields();\n};\n\nMacroConfig.prototype.getOperators = function() {\n\treturn this.parent.getOperators();\n};\n\nMacroConfig.prototype.getAttributes = function() {\n\treturn this.parent.getAttributes();\n};\n\nMacroConfig.prototype.survey = function(text, fromTitle, options) {\n\treturn this.parent.survey(text, fromTitle, options);\n};\n\nMacroConfig.prototype.getAttribute = function(elementName) {\n\treturn this.parent.getAttribute(elementName);\n};\n\nMacroConfig.prototype.getMacros = function() {\n\tvar signatures = this.parent.getMacros();\n\tfor (var macroName in this.macros) {\n\t\tvar macro = this.macros[macroName];\n\t\tfor (var param in macro) {\n\t\t\tsignatures[macroName + \"/\" + param] = macro[param];\n\t\t}\n\t}\n\treturn signatures;\n};\n\n// But macro we handle differently.\nMacroConfig.prototype.getMacro = function(macroName) {\n\tvar theseSettings = this.macros[macroName];\n\tvar parentSettings;\n\tif (this.parent) {\n\t\tparentSettings = this.parent.getMacro(macroName);\n\t}\n\tif (theseSettings && parentSettings) {\n\t\t// gotta merge them without changing either. This is expensive,\n\t\t// but it'll happen rarely.\n\t\tvar rtnSettings = $tw.utils.extend(Object.create(null), theseSettings, parentSettings);\n\t\treturn rtnSettings;\n\t}\n\treturn theseSettings || parentSettings;\n};\n\nMacroConfig.prototype.addSetting = function(macroName, parameter, type, sourceTitle) {\n\tvar macro = this.macros[macroName];\n\ttype = type || settings.getDefaultType(this.wiki);\n\tif (macro === undefined) {\n\t\tmacro = this.macros[macroName] = Object.create(null);\n\t}\n\tvar handler = settings.getType(type);\n\tif (handler) {\n\t\thandler.source = sourceTitle;\n\t\t// We attach the fields of the defining tiddler for the benefit\n\t\t// of any 3rd party field types that want access to them.\n\t\tvar tiddler = this.wiki.getTiddler(sourceTitle);\n\t\thandler.fields = tiddler.fields;\n\t\tmacro[parameter] = handler;\n\t}\n};\n\nMacroConfig.prototype.createChildLibrary = function(title) {\n\treturn new MacroConfig(this.wiki, this, title);\n};\n\nMacroConfig.prototype.addWidget = function(widget) {\n\tthis.widget = widget;\n\twhile (this.widget.children.length > 0) {\n\t\tthis.widget = this.widget.children[0];\n\t}\n};\n\nMacroConfig.prototype.getVariableWidget = function() {\n\tif (!this.widget) {\n\t\tvar varWidget = this.parent && this.parent.widget;\n\t\tvar parentWidget = new Widget({}, {parentWidget: varWidget});\n\t\tparentWidget.setVariable(\"currentTiddler\", this.title);\n\t\tvar widget = new Widget({}, {parentWidget: parentWidget});\n\t\tthis.addWidget(widget);\n\t}\n\treturn this.widget;\n};\n\n/**This takes macros, specifically relink placeholders, and remembers them\n * It creates a dummy object for them, since we'll never need the definition\n */\nMacroConfig.prototype.reserveMacroName = function(variableName) {\n\tthis.reservedmacroNames[variableName] = {\n\t\tvalue: \"\",\n\t\tparams: []};\n};\n\nMacroConfig.prototype.addMacroDefinition = function(setParseTreeNode) {\n\tvar bottomWidget = this.getVariableWidget();\n\tvar setWidget = bottomWidget.makeChildWidget(setParseTreeNode);\n\tsetWidget.computeAttributes();\n\tsetWidget.execute();\n\tthis.addWidget(setWidget);\n};\n\nMacroConfig.prototype.getMacroDefinition = function(variableName) {\n\treturn this.getVariableWidget().variables[variableName] || $tw.macros[variableName] || this.reservedmacroNames[variableName];\n};\n\nfunction createImportWidget(filter, wiki, parent) {\n\tvar widget = wiki.makeWidget( { tree: [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\t\"filter\": {\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: filter\n\t\t\t}\n\t\t}\n\t}] }, { parentWidget: parent} );\n\twidget.execute();\n\twidget.renderChildren();\n\tvar importWidget = widget.children[0];\n\treturn importWidget;\n};\n\nMacroConfig.prototype._compileList = function(titleList) {\n\tfor (var i = 0; i < titleList.length; i++) {\n\t\tvar parser = this.wiki.parseTiddler(titleList[i]);\n\t\tif (parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile (parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tif (parseTreeNode.relink) {\n\t\t\t\t\tfor (var macroName in parseTreeNode.relink) {\n\t\t\t\t\t\tvar parameters = parseTreeNode.relink[macroName];\n\t\t\t\t\t\tfor (paramName in parameters) {\n\t\t\t\t\t\t\tthis.addSetting(macroName, paramName, parameters[paramName], titleList[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t}\n\t}\n};\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/utils/macroConfig.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/utils/placeholder.js": {
"text": "/*\\\n\nA method which doles out placeholders when requested, and constructs\nthe necessary supporting pragma when requested.\n\n\\*/\n\nfunction Placeholder() {\n\tthis.placeholders = Object.create(null);\n\tthis.reverseMap = Object.create(null);\n};\n\nmodule.exports = Placeholder;\n\nPlaceholder.prototype.getPlaceholderFor = function(value, category, options) {\n\tvar placeholder = this.reverseMap[value];\n\tvar config = options.settings || options.wiki.getRelinkConfig();\n\tif (placeholder) {\n\t\treturn placeholder;\n\t}\n\tvar number = 0;\n\tvar prefix = \"relink-\"\n\tif (category && category !== \"title\") {\n\t\t// I don't like \"relink-title-1\". \"relink-1\" should be for\n\t\t// titles. lists, and filters can have descriptors though.\n\t\tprefix += category + \"-\";\n\t}\n\tdo {\n\t\tnumber += 1;\n\t\tplaceholder = prefix + number;\n\t} while (config.getMacroDefinition(placeholder));\n\tconfig.reserveMacroName(placeholder);\n\tthis.placeholders[placeholder] = value;\n\tthis.reverseMap[value] = placeholder;\n\treturn placeholder;\n};\n\nPlaceholder.prototype.getPreamble = function() {\n\tvar results = [];\n\tfor (var name in this.placeholders) {\n\t\tvar val = this.placeholders[name];\n\t\tresults.push(\"\\\\define \"+name+\"() \"+val+\"\\n\");\n\t}\n\treturn results.join('');\n};\n\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/utils/placeholder.js",
"type": "application/javascript"
},
"$:/plugins/flibbles/relink/js/utils/rebuilder.js": {
"text": "/*\\\n\nThis helper class aids in reconstructing an existing string with new parts.\n\n\\*/\n\nfunction Rebuilder(text, start) {\n\tthis.text = text;\n\tthis.index = start || 0;\n\tthis.pieces = [];\n};\n\nmodule.exports = Rebuilder;\n\n/**Pieces must be added consecutively.\n * Start and end are the indices in the old string specifying where to graft\n * in the new piece.\n */\nRebuilder.prototype.add = function(value, start, end) {\n\tthis.pieces.push(this.text.substring(this.index, start), value);\n\tthis.index = end;\n};\n\nRebuilder.prototype.changed = function() {\n\treturn this.pieces.length > 0;\n};\n\nRebuilder.prototype.results = function(end) {\n\tif (this.changed()) {\n\t\tthis.pieces.push(this.text.substring(this.index, end));\n\t\treturn this.pieces.join('');\n\t}\n\treturn undefined;\n};\n",
"module-type": "library",
"title": "$:/plugins/flibbles/relink/js/utils/rebuilder.js",
"type": "application/javascript"
},
"$:/config/flibbles/relink/attributes/$button/set": {
"title": "$:/config/flibbles/relink/attributes/$button/set",
"text": "reference"
},
"$:/config/flibbles/relink/attributes/$button/setTo": {
"title": "$:/config/flibbles/relink/attributes/$button/setTo",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$button/to": {
"title": "$:/config/flibbles/relink/attributes/$button/to",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$checkbox/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$checkbox/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$checkbox/tag": {
"title": "$:/config/flibbles/relink/attributes/$checkbox/tag",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$count/filter": {
"title": "$:/config/flibbles/relink/attributes/$count/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$draggable/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$draggable/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$draggable/filter": {
"title": "$:/config/flibbles/relink/attributes/$draggable/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$edit-bitmap/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$edit-bitmap/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$edit-text/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$edit-text/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$edit/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$edit/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$encrypt/filter": {
"title": "$:/config/flibbles/relink/attributes/$encrypt/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$fieldmangler/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$fieldmangler/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$fields/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$fields/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$image/source": {
"title": "$:/config/flibbles/relink/attributes/$image/source",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$importvariables/filter": {
"title": "$:/config/flibbles/relink/attributes/$importvariables/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$linkcatcher/to": {
"title": "$:/config/flibbles/relink/attributes/$linkcatcher/to",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$linkcatcher/set": {
"title": "$:/config/flibbles/relink/attributes/$linkcatcher/set",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$link/to": {
"title": "$:/config/flibbles/relink/attributes/$link/to",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$list/filter": {
"title": "$:/config/flibbles/relink/attributes/$list/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$list/template": {
"title": "$:/config/flibbles/relink/attributes/$list/template",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$list/editTemplate": {
"title": "$:/config/flibbles/relink/attributes/$list/editTemplate",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$list/history": {
"title": "$:/config/flibbles/relink/attributes/$list/history",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$navigator/story": {
"title": "$:/config/flibbles/relink/attributes/$navigator/story",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$navigator/history": {
"title": "$:/config/flibbles/relink/attributes/$navigator/history",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$radio/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$radio/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$range/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$range/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$reveal/stateTitle": {
"title": "$:/config/flibbles/relink/attributes/$reveal/stateTitle",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$select/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$select/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$setvariable/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$setvariable/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$setvariable/subtiddler": {
"title": "$:/config/flibbles/relink/attributes/$setvariable/subtiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$setvariable/filter": {
"title": "$:/config/flibbles/relink/attributes/$setvariable/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$set/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$set/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$set/subtiddler": {
"title": "$:/config/flibbles/relink/attributes/$set/subtiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$set/filter": {
"title": "$:/config/flibbles/relink/attributes/$set/filter",
"text": "filter"
},
"$:/config/flibbles/relink/attributes/$tiddler/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$tiddler/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$transclude/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$transclude/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$transclude/subtiddler": {
"title": "$:/config/flibbles/relink/attributes/$transclude/subtiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$view/tiddler": {
"title": "$:/config/flibbles/relink/attributes/$view/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/attributes/$view/subtiddler": {
"title": "$:/config/flibbles/relink/attributes/$view/subtiddler",
"text": "title"
},
"$:/plugins/flibbles/relink/configuration": {
"title": "$:/plugins/flibbles/relink/configuration",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/flibbles/relink/Configuration]!has[draft.of]]\" \"$:/plugins/flibbles/relink/ui/configuration/Fields\">>\n</div>\n"
},
"$:/config/flibbles/relink/fields/filter": {
"title": "$:/config/flibbles/relink/fields/filter",
"text": "filter"
},
"$:/config/flibbles/relink/fields/list": {
"title": "$:/config/flibbles/relink/fields/list",
"text": "list"
},
"$:/config/flibbles/relink/fields/list-after": {
"title": "$:/config/flibbles/relink/fields/list-after",
"text": "title"
},
"$:/config/flibbles/relink/fields/list-before": {
"title": "$:/config/flibbles/relink/fields/list-before",
"text": "title"
},
"$:/config/flibbles/relink/fields/tags": {
"title": "$:/config/flibbles/relink/fields/tags",
"text": "list"
},
"$:/plugins/flibbles/relink/language/Buttons/Delete/Hint": {
"title": "$:/plugins/flibbles/relink/language/Buttons/Delete/Hint",
"text": "delete"
},
"$:/plugins/flibbles/relink/language/Buttons/LinkToInline/Hint": {
"title": "$:/plugins/flibbles/relink/language/Buttons/LinkToInline/Hint",
"text": "go to defining tiddler"
},
"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Hint": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Hint",
"text": "Specify a new widget/element attribute to be updated whenever a tiddler is renamed"
},
"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Caption": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Caption",
"text": "add"
},
"$:/plugins/flibbles/relink/language/Buttons/NewField/Hint": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewField/Hint",
"text": "Specify a new field to be updated whenever a tiddler is renamed"
},
"$:/plugins/flibbles/relink/language/Buttons/NewField/Caption": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewField/Caption",
"text": "add"
},
"$:/plugins/flibbles/relink/language/Buttons/NewOperator/Hint": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewOperator/Hint",
"text": "Specify a new filter operator to be considered whenever a tiddler is renamed"
},
"$:/plugins/flibbles/relink/language/Buttons/NewOperator/Caption": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewOperator/Caption",
"text": "add"
},
"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Hint": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewParameter/Hint",
"text": "Specify a new macro parameter to be updated whenever a tiddler is renamed"
},
"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Caption": {
"title": "$:/plugins/flibbles/relink/language/Buttons/NewParameter/Caption",
"text": "add"
},
"$:/plugins/flibbles/relink/language/Error/InvalidAttributeName": {
"title": "$:/plugins/flibbles/relink/language/Error/InvalidAttributeName",
"text": "Illegal characters in attribute name \"<$text text=<<attributeName>>/>\". Attributes cannot contain slashes ('/'), closing angle or square brackets ('>' or ']'), quotes or apostrophes ('\"' or \"'\"), equals ('='), or whitespace"
},
"$:/plugins/flibbles/relink/language/Error/InvalidElementName": {
"title": "$:/plugins/flibbles/relink/language/Error/InvalidElementName",
"text": "Illegal characters in element/widget name \"<$text text=<<elementName>>/>\". Element tags can only contain letters and the characters hyphen (`-`) and dollar sign (`$`)"
},
"$:/plugins/flibbles/relink/language/Error/InvalidMacroName": {
"title": "$:/plugins/flibbles/relink/language/Error/InvalidMacroName",
"text": "Illegal characters in macro name \"<$text text=<<macroName>>/>\". Macros cannot contain whitespace"
},
"$:/plugins/flibbles/relink/language/Error/InvalidParameterName": {
"title": "$:/plugins/flibbles/relink/language/Error/InvalidParameterName",
"text": "Illegal characters in parameter name \"<$text text=<<parameterName>>/>\". Parameters can only contain letters, digits, and the characters underscore (`_`) and hyphen (`-`)"
},
"$:/plugins/flibbles/relink/language/Error/RelinkFilterOperator": {
"title": "$:/plugins/flibbles/relink/language/Error/RelinkFilterOperator",
"text": "Filter Error: Unknown suffix for the 'relink' filter operator"
},
"$:/plugins/flibbles/relink/language/Error/ReportFailedRelinks": {
"title": "$:/plugins/flibbles/relink/language/Error/ReportFailedRelinks",
"text": "Relink could not update '<<from>>' to '<<to>>' inside the following tiddlers:"
},
"$:/plugins/flibbles/relink/language/Error/UnrecognizedType": {
"title": "$:/plugins/flibbles/relink/language/Error/UnrecognizedType",
"text": "Relink parse error: Unrecognized field type '<<type>>'"
},
"$:/plugins/flibbles/relink/language/Help/Attributes": {
"title": "$:/plugins/flibbles/relink/language/Help/Attributes",
"text": "See the [[Attributes documentation page|https://flibbles.github.io/tw5-relink/#Attributes]] for details."
},
"$:/plugins/flibbles/relink/language/Help/Fields": {
"title": "$:/plugins/flibbles/relink/language/Help/Fields",
"text": "See the [[Fields documentation page|https://flibbles.github.io/tw5-relink/#Fields]] for details."
},
"$:/plugins/flibbles/relink/language/Help/Macros": {
"title": "$:/plugins/flibbles/relink/language/Help/Macros",
"text": "See the [[Macros documentation page|https://flibbles.github.io/tw5-relink/#Macros]] for details."
},
"$:/plugins/flibbles/relink/language/Help/Operators": {
"title": "$:/plugins/flibbles/relink/language/Help/Operators",
"text": "See the [[Operators documentation page|https://flibbles.github.io/tw5-relink/#Operators]] for details."
},
"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Empty": {
"title": "$:/plugins/flibbles/relink/language/TiddlerInfo/References/Empty",
"text": "No tiddlers contain any fields, links, macros, transclusions, or widgets referencing this one"
},
"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Description": {
"title": "$:/plugins/flibbles/relink/language/TiddlerInfo/References/Description",
"text": "The following tiddlers contain fields, links, macros, transclusions, or widgets referencing this one:"
},
"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption": {
"title": "$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption",
"text": "//Relink// References"
},
"$:/plugins/flibbles/relink/language/ui/Attributes/Caption": {
"title": "$:/plugins/flibbles/relink/language/ui/Attributes/Caption",
"text": "Attributes"
},
"$:/plugins/flibbles/relink/language/ui/Fields/Caption": {
"title": "$:/plugins/flibbles/relink/language/ui/Fields/Caption",
"text": "Fields"
},
"$:/plugins/flibbles/relink/language/ui/Macros/Caption": {
"title": "$:/plugins/flibbles/relink/language/ui/Macros/Caption",
"text": "Macros"
},
"$:/plugins/flibbles/relink/language/ui/Operators/Caption": {
"title": "$:/plugins/flibbles/relink/language/ui/Operators/Caption",
"text": "Operators"
},
"$:/config/flibbles/relink/macros/csvtiddlers/filter": {
"title": "$:/config/flibbles/relink/macros/csvtiddlers/filter",
"text": "filter"
},
"$:/config/flibbles/relink/macros/datauri/title": {
"title": "$:/config/flibbles/relink/macros/datauri/title",
"text": "title"
},
"$:/config/flibbles/relink/macros/jsontiddler/title": {
"title": "$:/config/flibbles/relink/macros/jsontiddler/title",
"text": "title"
},
"$:/config/flibbles/relink/macros/jsontiddlers/filter": {
"title": "$:/config/flibbles/relink/macros/jsontiddlers/filter",
"text": "filter"
},
"$:/config/flibbles/relink/macros/list-links/filter": {
"title": "$:/config/flibbles/relink/macros/list-links/filter",
"text": "filter"
},
"$:/config/flibbles/relink/macros/list-links-draggable/tiddler": {
"title": "$:/config/flibbles/relink/macros/list-links-draggable/tiddler",
"text": "title"
},
"$:/config/flibbles/relink/macros/list-links-draggable/itemTemplate": {
"title": "$:/config/flibbles/relink/macros/list-links-draggable/itemTemplate",
"text": "title"
},
"$:/config/flibbles/relink/macros/list-tagged-draggable/tag": {
"title": "$:/config/flibbles/relink/macros/list-tagged-draggable/tag",
"text": "title"
},
"$:/config/flibbles/relink/macros/list-tagged-draggable/itemTemplate": {
"title": "$:/config/flibbles/relink/macros/list-tagged-draggable/itemTemplate",
"text": "title"
},
"$:/config/flibbles/relink/macros/toc/tag": {
"title": "$:/config/flibbles/relink/macros/toc/tag",
"text": "title"
},
"$:/config/flibbles/relink/macros/toc/selectedTiddler": {
"title": "$:/config/flibbles/relink/macros/toc/selectedTiddler",
"text": "title"
},
"$:/config/flibbles/relink/macros/toc/template": {
"title": "$:/config/flibbles/relink/macros/toc/template",
"text": "title"
},
"$:/config/flibbles/relink/macros/tabs/buttonTemplate": {
"title": "$:/config/flibbles/relink/macros/tabs/buttonTemplate",
"text": "title"
},
"$:/config/flibbles/relink/macros/tabs/default": {
"title": "$:/config/flibbles/relink/macros/tabs/default",
"text": "title"
},
"$:/config/flibbles/relink/macros/tabs/tabsList": {
"title": "$:/config/flibbles/relink/macros/tabs/tabsList",
"text": "filter"
},
"$:/config/flibbles/relink/macros/tabs/template": {
"title": "$:/config/flibbles/relink/macros/tabs/template",
"text": "title"
},
"$:/config/flibbles/relink/macros/tag/tag": {
"title": "$:/config/flibbles/relink/macros/tag/tag",
"text": "title"
},
"$:/config/flibbles/relink/macros/tag-pill/tag": {
"title": "$:/config/flibbles/relink/macros/tag-pill/tag",
"text": "title"
},
"$:/config/flibbles/relink/macros/timeline/subfilter": {
"title": "$:/config/flibbles/relink/macros/timeline/subfilter",
"text": "filter"
},
"$:/config/flibbles/relink/operators/list": {
"title": "$:/config/flibbles/relink/operators/list",
"text": "reference"
},
"$:/config/flibbles/relink/operators/tag": {
"title": "$:/config/flibbles/relink/operators/tag",
"text": "title"
},
"$:/config/flibbles/relink/operators/title": {
"title": "$:/config/flibbles/relink/operators/title",
"text": "title"
},
"$:/config/flibbles/relink/operators/field:title": {
"title": "$:/config/flibbles/relink/operators/field:title",
"text": "title"
},
"$:/language/EditTemplate/Title/Impossibles/Prompt": {
"title": "$:/language/EditTemplate/Title/Impossibles/Prompt",
"text": "''Warning:'' Not all references in the following tiddlers can be updated by //Relink// due to the complexity of the new title:"
},
"$:/language/EditTemplate/Title/References/Prompt": {
"title": "$:/language/EditTemplate/Title/References/Prompt",
"text": "The following tiddlers will be updated if relinking:"
},
"$:/language/EditTemplate/Title/Relink/Prompt": {
"title": "$:/language/EditTemplate/Title/Relink/Prompt",
"text": "Use //Relink// to update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' across all other tiddlers"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\" tabindex={{$:/config/EditTabIndex}}/>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[all[relinkable]relink:references<fromTitle>limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$tiddler tiddler=<<fromTitle>> >\n\n<$set\n\tname=\"prompt\"\n\tfilter=\"[all[relinkable]relink:impossible<toTitle>]\"\n\tvalue=\"EditTemplate/Title/Impossibles/Prompt\"\n\temptyValue=\"EditTemplate/Title/References/Prompt\" >\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}}\n<$macrocall $name=lingo title=<<prompt>> />\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}}\n<$macrocall $name=lingo title=<<prompt>> />\n</$button>\n</$reveal>\n</$set>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$list variable=\"listItem\" filter=\"[all[relinkable]!title[$:/StoryList]relink:references<fromTitle>sort[title]]\" template=\"$:/plugins/flibbles/relink/ui/ListItemTemplate\">\n</$list>\n</$reveal>\n</$tiddler>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
},
"$:/plugins/flibbles/relink/readme": {
"title": "$:/plugins/flibbles/relink/readme",
"type": "text/vnd.tiddlywiki",
"text": "When renaming a tiddler, Relink can update the fields, filters, and widgets\nof all other tiddlers. However, it works through whitelisting.\n\nIt's already configured to update tiddler titles for all core widgets, filters,\nand fields, but the whitelists can be customized for each of this in the\nconfiguration panel.\n\nSee [[the tw5-relink website|https://github.com/flibbles/tw5-relink]] for\nmore details and examples.\n"
},
"$:/config/flibbles/relink/settings/default-type": {
"title": "$:/config/flibbles/relink/settings/default-type",
"text": "title"
},
"$:/plugins/flibbles/relink/ui/ListItemTemplate": {
"title": "$:/plugins/flibbles/relink/ui/ListItemTemplate",
"text": "<$set\n\tname=\"classes\"\n\tfilter=\"[<listItem>relink:impossible<toTitle>]\"\n\tvalue=\"tc-menu-list-item tc-relink-impossible\"\n\temptyValue=\"tc-menu-list-item\">\n<div class=<<classes>>>\n<$link to=<<listItem>>><$text text=<<listItem>> /></$link>\n</div>\n</$set>\n"
},
"$:/plugins/flibbles/relink/ui/TiddlerInfo/References": {
"title": "$:/plugins/flibbles/relink/ui/TiddlerInfo/References",
"caption": "{{$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption}}",
"tags": "$:/tags/TiddlerInfo",
"text": "\\define lingo-base() $:/plugins/flibbles/relink/language/TiddlerInfo/\n\\define filter() [relink:references<currentTiddler>!title[$:/StoryList]!prefix[$:/temp/]sort[title]]\n<$list filter=\"[subfilter<filter>first[]]\">\n\n<<lingo References/Description>>\n</$list>\n\n<table class=\"tc-relink-references-table\">\n<tbody>\n<$list filter=<<filter>> emptyMessage=<<lingo References/Empty>> variable=\"listItem\" template=\"$:/plugins/flibbles/relink/ui/TiddlerInfo/ReferencesTemplate\" />\n</tbody>\n</table>\n"
},
"$:/plugins/flibbles/relink/ui/TiddlerInfo/ReferencesTemplate": {
"title": "$:/plugins/flibbles/relink/ui/TiddlerInfo/ReferencesTemplate",
"text": "<tr class=\"tc-relink-references\">\n<td class=\"tc-relink-references-title\">\n<$link to=<<listItem>>/>\n</td>\n<td class=\"tc-relink-references-report\">\n<$list filter=\"[<listItem>relink:report<currentTiddler>]\">\n\n<$text text=<<currentTiddler>> />\n</$list>\n\n</td>\n</tr>\n"
},
"$:/plugins/flibbles/relink/ui/components/button-delete": {
"title": "$:/plugins/flibbles/relink/ui/components/button-delete",
"text": "\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\n\\define prefix() $:/config/flibbles/relink/\n\n<$list filter=\"[all[current]prefix<prefix>]\" >\n<$button class=\"tc-btn-invisible\" tooltip={{$:/plugins/flibbles/relink/language/Buttons/Delete/Hint}}><$list filter=\"[all[current]is[tiddler]]\">\n<$action-deletetiddler $tiddler=<<currentTiddler>> />\n</$list><$list filter=\"[all[current]is[shadow]]\">\n<$action-setfield $tiddler=<<tiddlerName>> text=\"\" />\n</$list>\n{{$:/core/images/delete-button}}\n</$button>\n</$list><$list filter=\"[all[current]!prefix<prefix>]\">\n<$link><$button class=\"tc-btn-invisible\" tooltip={{$:/plugins/flibbles/relink/language/Buttons/LinkToInline/Hint}}>{{$:/core/images/link}}</$button></$link>\n</$list>\n"
},
"$:/plugins/flibbles/relink/ui/components/select-fieldtype": {
"title": "$:/plugins/flibbles/relink/ui/components/select-fieldtype",
"text": "\\define prefix() $:/config/flibbles/relink/\n\n<$vars type={{{ [<signature>relink:type[]] }}} >\n<$list filter=\"[all[current]prefix<prefix>]\" >\n<$select tiddler=<<currentTiddler>> >\n<$list variable=\"option\" filter=\"[relink:types[]]\">\n<option><$text text=<<option>> /></option>\n</$list>\n</$select>\n</$list><$list filter=\"[all[current]!prefix<prefix>]\">\n<$text text=<<type>> />\n</$list>\n</$vars>\n"
},
"$:/plugins/flibbles/relink/ui/components/tables": {
"title": "$:/plugins/flibbles/relink/ui/components/tables",
"text": "\\define .make-table(title, plugin, default-table-state:yes)\n\n<$list variable=\"render\" filter=\"[relink:signatures<__plugin__>prefix<__category__>first[]]\">\n<$set name=\"table-state\" value=<<qualify \"\"\"$:/state/flibbles/relink/tables/$title$\"\"\">>>\n<tr><th class=\"tc-relink-header-plugin\" colspan=<<column-count>> >\n<$reveal type=\"nomatch\" state=<<table-state>> text=\"yes\" default=\"\"\"$default-table-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<table-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} ''$title$''\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<table-state>> text=\"yes\" default=\"\"\"$default-table-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<table-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}} ''$title$''\n</$button>\n</$reveal>\n</th></tr>\n<$list\n\tvariable=\"signature\"\n\tfilter=\"[relink:signatures<__plugin__>prefix<__category__>sort[]]\">\n<$vars key={{{ [<signature>removeprefix<__category__>removeprefix[/]] }}} >\n<$tiddler tiddler={{{[<signature>relink:source[]]}}} >\n<$reveal tag=\"tr\" type=\"match\" state=<<table-state>> text=\"yes\" default=\"\"\"$default-table-state$\"\"\">\n<$macrocall $name=<<__list-row-macro__>> signature=<<signature>> />\n<td class=\"tc-relink-column-type\">{{||$:/plugins/flibbles/relink/ui/components/select-fieldtype}}</td>\n<td class=\"tc-relink-column-delete\">{{||$:/plugins/flibbles/relink/ui/components/button-delete}}</td>\n</$reveal>\n</$tiddler>\n</$vars>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define tables(category, list-row-macro, header-list)\n<$vars\n\tcolumn-count={{{[enlist<__header-list__>] [[DeleteColumn]] +[count[]]}}}>\n\n<table class=\"tc-relink-whitelist\"><tbody>\n<tr>\n<$list variable=\"header\" filter=\"[enlist<__header-list__>butlast[]]\"><th><<header>></th></$list>\n<!-- We have the last column extend into the delete/link column, which is unlabeled. -->\n<th colspan=2><$text text={{{ [enlist<__header-list__>last[]] }}} /></th>\n</tr>\n\n<<.make-table Custom \"\" yes>>\n\n<<.make-table Core \"$:/plugins/flibbles/relink\">>\n\n<$list\n\tfilter=\"[plugin-type[plugin]![$:/core]![$:/plugins/flibbles/relink]]\">\n<$set name=\"subtitle\" value={{!!description}} emptyValue={{!!title}} >\n<$macrocall $name=\".make-table\" title=<<subtitle>> plugin=<<currentTiddler>> />\n</$set>\n</$list>\n\n</tbody></table>\n</$vars>\n\\end\n"
},
"$:/plugins/flibbles/relink/ui/configuration/Attributes": {
"title": "$:/plugins/flibbles/relink/ui/configuration/Attributes",
"caption": "{{$:/plugins/flibbles/relink/language/ui/Attributes/Caption}}",
"tags": "$:/tags/flibbles/relink/Configuration",
"text": "\\import $:/plugins/flibbles/relink/ui/components/tables\n\\define prefix-attr() $:/config/flibbles/relink/attributes/\n\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\n\\define element-name-tiddler() $:/state/flibbles/relink/element-name\n\\define attribute-name-tiddler() $:/state/flibbles/relink/attribute-name\n\n\\define row()\n<$set name=\"element\"\n filter=\"[<key>splitbefore[/]removesuffix[/]]\">\n<$set name=\"attribute\"\n filter=\"[<key>removeprefix<element>removeprefix[/]]\">\n<td><$text text=<<element>> /></td>\n<td><$text text=<<attribute>> /></td>\n</$set></$set>\n\\end\n\\define body()\n\n{{$:/plugins/flibbles/relink/language/Help/Attributes}}\n\n<em class=\"tc-edit\">Add a new attribute:</em>\n<$edit-text\n\ttiddler=<<element-name-tiddler>>\n\ttag=\"input\"\n\tdefault=\"\"\n\tplaceholder=\"widget/element\" />\n<$edit-text\n\ttiddler=<<attribute-name-tiddler>>\n\ttag=\"input\"\n\tdefault=\"\"\n\tplaceholder=\"attribute\" />\n<$reveal type=\"nomatch\" text=\"\" state=<<element-name-tiddler>> >\n<$reveal type=\"nomatch\" text=\"\" state=<<attribute-name-tiddler>> >\n<$relinkmangler>\n<$button\n\ttooltip={{$(lingo-base)$NewAttribute/Hint}}\n\taria-label={{$(lingo-base)$NewAttribute/Caption}}>\n<$action-sendmessage\n\t$message=\"relink-add-attribute\"\n\telement={{$(element-name-tiddler)$}}\n\tattribute={{$(attribute-name-tiddler)$}} />\n<$action-deletetiddler $tiddler=<<attribute-name-tiddler>> />\n<$action-deletetiddler $tiddler=<<element-name-tiddler>> />\n<$text text={{$(lingo-base)$NewAttribute/Caption}}/>\n</$button>\n</$relinkmangler>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=<<attribute-name-tiddler>> >\n<$button>\n<$text text={{$(lingo-base)$NewAttribute/Caption}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=<<element-name-tiddler>> >\n<$button>\n<$text text={{$(lingo-base)$NewAttribute/Caption}}/>\n</$button>\n</$reveal>\n\n<$macrocall\n\t$name=tables\n\tcategory=\"attributes\"\n\theader-list=\"[[Widget/HTML Element]] Attribute Type\"\n\tlist-row-macro=\"row\" />\n\\end\n\n<<body>>\n"
},
"$:/plugins/flibbles/relink/ui/configuration/Fields": {
"title": "$:/plugins/flibbles/relink/ui/configuration/Fields",
"caption": "{{$:/plugins/flibbles/relink/language/ui/Fields/Caption}}",
"tags": "$:/tags/flibbles/relink/Configuration",
"text": "\\import $:/plugins/flibbles/relink/ui/components/tables\n\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\n\\define field-name-tiddler() $:/state/flibbles/relink/field-name\n\n\\define row()\n<td><$text text=<<key>> /></td>\n\\end\n\\define body()\n\n{{$:/plugins/flibbles/relink/language/Help/Fields}}\n\n<em class=\"tc-edit\">Add a new field:</em>\n<$edit-text\n\ttiddler=<<field-name-tiddler>>\n\ttag=\"input\"\n\tdefault=\"\"\n\tplaceholder=\"field name\" />\n<$reveal type=\"nomatch\" text=\"\" state=<<field-name-tiddler>> >\n<$relinkmangler>\n<$button\n\ttooltip={{$(lingo-base)$NewField/Hint}}\n\taria-label={{$(lingo-base)$NewField/Caption}}>\n<$action-sendmessage\n\t$message=\"relink-add-field\"\n\tfield={{$(field-name-tiddler)$}} />\n<$action-deletetiddler $tiddler=<<field-name-tiddler>> />\n<$text text={{$(lingo-base)$NewField/Caption}}/>\n</$button>\n</$relinkmangler>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=<<field-name-tiddler>> >\n<$button>\n<$text text={{$(lingo-base)$NewField/Caption}}/>\n</$button>\n</$reveal>\n\n\n<$macrocall\n\t$name=tables\n\tcategory=\"fields\"\n\theader-list=\"[[Field Name]] [[Field Type]]\"\n\tlist-row-macro=\"row\" />\n\\end\n\n<<body>>\n"
},
"$:/plugins/flibbles/relink/ui/configuration/Macros": {
"title": "$:/plugins/flibbles/relink/ui/configuration/Macros",
"caption": "{{$:/plugins/flibbles/relink/language/ui/Macros/Caption}}",
"tags": "$:/tags/flibbles/relink/Configuration",
"text": "\\import $:/plugins/flibbles/relink/ui/components/tables\n\\define prefix-macro() $:/config/flibbles/relink/macros/\n\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\n\\define macro-name-tiddler() $:/state/flibbles/relink/macro-name\n\\define parameter-name-tiddler() $:/state/flibbles/relink/parameter-name\n\n\\define row()\n<$set name=\"parameter\"\n filter=\"[<key>relink:splitafter[/]]\">\n<$set name=\"macro\"\n filter=\"[<key>removesuffix<parameter>removesuffix[/]]\">\n<td><$text text=<<macro>> /></td>\n<td><$text text=<<parameter>> /></td>\n</$set></$set>\n\\end\n\\define body()\n\n{{$:/plugins/flibbles/relink/language/Help/Macros}}\n\n<em class=\"tc-edit\">Add a new macro parameter:</em>\n<$edit-text\n\ttiddler=<<macro-name-tiddler>>\n\ttag=\"input\"\n\tdefault=\"\"\n\tplaceholder=\"macro\" />\n<$edit-text\n\ttiddler=<<parameter-name-tiddler>>\n\ttag=\"input\"\n\tdefault=\"\"\n\tplaceholder=\"parameter\" />\n<$reveal type=\"nomatch\" text=\"\" state=<<macro-name-tiddler>> >\n<$reveal type=\"nomatch\" text=\"\" state=<<parameter-name-tiddler>> >\n<$relinkmangler>\n<$button\n\ttooltip={{$(lingo-base)$NewParameter/Hint}}\n\taria-label={{$(lingo-base)$NewParameter/Caption}}>\n<$action-sendmessage\n\t$message=\"relink-add-parameter\"\n\tmacro={{$(macro-name-tiddler)$}}\n\tparameter={{$(parameter-name-tiddler)$}} />\n<$action-deletetiddler $tiddler=<<parameter-name-tiddler>> />\n<$action-deletetiddler $tiddler=<<macro-name-tiddler>> />\n<$text text={{$(lingo-base)$NewParameter/Caption}}/>\n</$button>\n</$relinkmangler>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=<<parameter-name-tiddler>> >\n<$button>\n<$text text={{$(lingo-base)$NewParameter/Caption}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=<<macro-name-tiddler>> >\n<$button>\n<$text text={{$(lingo-base)$NewParameter/Caption}}/>\n</$button>\n</$reveal>\n\n\n<$macrocall\n\t$name=tables\n\tcategory=\"macros\"\n\theader-list=\"Macro Parameter Type\"\n\tlist-row-macro=\"row\" />\n\\end\n\n<<body>>\n"
},
"$:/plugins/flibbles/relink/ui/configuration/Operators": {
"title": "$:/plugins/flibbles/relink/ui/configuration/Operators",
"caption": "{{$:/plugins/flibbles/relink/language/ui/Operators/Caption}}",
"tags": "$:/tags/flibbles/relink/Configuration",
"text": "\\import $:/plugins/flibbles/relink/ui/components/tables\n\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\n\\define operator-name-tiddler() $:/state/flibbles/relink/operator-name\n\n\\define row()\n<td><$text text=<<key>> /></td>\n\\end\n\\define body()\n\n{{$:/plugins/flibbles/relink/language/Help/Operators}}\n\n<em class=\"tc-edit\">Add a new filter operator:</em>\n<$edit-text\n\ttiddler=<<operator-name-tiddler>>\n\ttag=\"input\"\n\tdefault=\"\"\n\tplaceholder=\"operator name\" />\n<$reveal type=\"nomatch\" text=\"\" state=<<operator-name-tiddler>>>\n<$relinkmangler>\n<$button\n\ttooltip={{$(lingo-base)$NewOperator/Hint}}\n\taria-label={{$(lingo-base)$NewOperator/Caption}}>\n<$action-sendmessage\n\t$message=\"relink-add-operator\"\n\toperator={{$(operator-name-tiddler)$}} />\n<$action-deletetiddler $tiddler=<<operator-name-tiddler>> />\n<$text text={{$(lingo-base)$NewOperator/Caption}}/>\n</$button>\n</$relinkmangler>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=<<operator-name-tiddler>>>\n<$button>\n<$text text={{$(lingo-base)$NewOperator/Caption}}/>\n</$button>\n</$reveal>\n\n<$macrocall\n\t$name=tables\n\tcategory=\"operators\"\n\theader-list=\"[[Filter Operator]] [[Operand Type]]\"\n\tlist-row-macro=\"row\" />\n\\end\n\n<<body>>\n"
},
"$:/plugins/flibbles/relink/ui/stylesheet.css": {
"title": "$:/plugins/flibbles/relink/ui/stylesheet.css",
"text": ".tc-relink-references {\n}\n\n.tc-relink-references-table {\n\twidth: 100%;\n\tborder: none;\n}\n\n.tc-relink-references-table td {\n\tborder-left: none;\n}\n\n.tc-relink-references-table tr:first-child td {\n\tborder-top: none;\n}\n\n.tc-relink-references-title {\n\ttext-align: left;\n\tvertical-align: top;\n}\n\n.tc-relink-references-occurrence {\n\tfont-style: italic;\n\ttext-align: left;\n\tfont-weight: 200;\n\tpadding-left: 25px;\n\tvertical-align: top;\n}\n\n.tc-relink-header-plugin {\n\ttext-align: left;\n}\n\n.tc-relink-header-plugin button {\n\twidth: 100%\n}\n\n.tc-relink-column-type {\n\twidth: 8em;\n}\n\n.tc-relink-column-type select {\n\twidth: 100%;\n}\n\n.tc-relink-column-delete {\n\tborder-left: none;\n\ttext-align: left;\n}\n\n.tc-relink-column-delete button {\n\tpadding-left: 1em;\n}\n\n.tc-relink-impossible a.tc-tiddlylink {\n\tcolor: red;\n}\n",
"tags": "$:/tags/Stylesheet",
"type": "text/css"
}
}
}
{
"tiddlers": {
"$:/plugins/snowgoon88/edit-comptext/config": {
"title": "$:/plugins/snowgoon88/edit-comptext/config",
"type": "application/json",
"text": "{\n \"configuration\": {\n \"caseSensitive\" : false,\n \"maxMatch\" : 8,\n \"minPatLength\" : 2,\n \"triggerKeyCombination\" : \"^ \"\n },\n \"template\": [{\n \"pattern\": \"[[\",\n \"filter\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n }\n ]\n}\n"
},
"$:/plugins/snowgoon88/edit-comptext/edit-comptext.js": {
"title": "$:/plugins/snowgoon88/edit-comptext/edit-comptext.js",
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/edit-comptext.js\ntype: application/javascript\nmodule-type: widget\n\nTaken from original Edit-text widget\nVersion 5.1.13 of TW5\nAdd link-to-tiddler completion in framed.js and simple.js\n\nTODO : CHECK usefull, and particularly save_changes after every input ??\nTODO : where should popupNode be created in the DOM ?\nTODO : check that options are valid (numeric ?)\nvar isNumeric = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedCompEngine = require(\"$:/plugins/snowgoon88/edit-comptext/framed.js\").FramedCompEngine,\n\tSimpleCompEngine = require(\"$:/plugins/snowgoon88/edit-comptext/simple.js\").SimpleCompEngine;\n\nexports[\"edit-comptext\"] = editTextWidgetFactory(FramedCompEngine,SimpleCompEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/snowgoon88/edit-comptext/examples": {
"title": "$:/plugins/snowgoon88/edit-comptext/examples",
"text": "The configuration file [[$:/plugins/snowgoon88/edit-comptext/config]] allow you to use the completion plugin for various usages. Here are some examples...\n\n!! Link Completion\nThe basic and default usage. Completion is triggered by `[[`, the search is among all non-system tiddlers. When selected, the `title` of the tiddler is inserted in the text, surrounded by `[[` and `]]`. This gives the following Completion Template.\n\n\n```\n{\n \"pattern\": \"[[\",\n \"title\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n}\t \n```\n\n\n!! Special macro completion\nI have a 'pnjin' macro that is invoked by `<<pnjin \"TiddlerPNJName\">>` where 'TiddlerPNJName is a tiddler that hold data about a PNJ. I use tiddlywiki to organise my Role Playing Games campaigns. So, I want `<p` to trigger the completion. The search is among all non-system tiddlers tagged `PNJ` and, once selected, the title of the tiddler must be inserted surrouned by `<<pnjin \\\"` and `\\\">>`. So...\n\n```\n{\n\t\"pattern\": \"<p\",\n \t\"title\": \"[tag[PNJ]!is[system]]\",\n \t\"start\": \"<<pnjin \\\"\",\n \t\"end\": \"\\\">>\"\n}\n```\n\n!! Insert some templates or stamp or snippets into text.\nI frequently use some text pattern and I want to insert them easily. So, I could create several tiddlers, tagged '$:stamp' and in their body are the piece of texte I want to insert. The titles of these tiddlers always start with `$:/config/stamp/` (i.e. $:/config/stamp/macro, $:/config/stamp/list1, $:/config/stamp/list2). I want to trigger the completion by using `<<`, then I only want to chose among the last part of the titles of tiddlers tagged `$:stamp` so I use a mask (`$:/config/stamp/`) to only display the last part of the tiddlers title. When selectected, the `body` of the tiddler is inserted, with no surrounding strings. As a results, the Completion Template is (notice the `body` field):\n\n```\n{\n \"pattern\": \"<<\",\n \"body\": \"[tag[$:stamp]]\",\n \"mask\" : \"$:/config/stamp/\",\n \"start\": \"\",\n \"end\": \"\"\n}\n```\n\n!! And you ?\nIf you have funny usages of completion, let me know. If you'd like to do something that is not yet possible, let me know...\n\nmail : snowgoon88(AT)gmail(DOT)com"
},
"$:/plugins/snowgoon88/edit-comptext/framed.js": {
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/framed.js\ntype: application/javascript\nmodule-type: library\n\nTaken from $:/core/modules/editor/engines/framed.js\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\n// Configuration tiddler\nvar COMPLETION_OPTIONS = \"$:/plugins/snowgoon88/edit-comptext/config\";\nvar Completion = require(\"$:/plugins/snowgoon88/edit-comptext/completion.js\").Completion;\n\t\nfunction FramedCompEngine(options) {\n //DEBUG console.log( \"==FramedCompEngine::creation\" );\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\n\t// Completion\n\t// Load Completion configuration as JSON\n this._configOptions = $tw.wiki.getTiddlerData( COMPLETION_OPTIONS, {} );\n\t\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create dummy popup for reading its styles\n\t//this._dummyCompletion = new Completion( this.widget, this.dummyTextArea, this._configOptions);\n\t//REMOVEthis._dummyCompletion.setAttribute(\"hidden\",\"true\");\n\t\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n\n\t// add Completion popup\n this._completion = new Completion( this.widget, this.domNode, this._configOptions, this.dummyTextArea, this.iframeNode.offsetTop, this.iframeNode.offsetLeft );\n\t// print iframe offset\n\t//DEBUG console.log( \" __iframe.offsetLeft: \"+this.iframeNode.offsetLeft );\n //DEBUG console.log( \" __iframe.offsetTop: \"+this.iframeNode.offsetTop );\n \n\t// Copy all styles from dummyCompletion\n\t//$tw.utils.copyStyles(this._dummyCompletion._popNode, this._completion._popNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\t//this._completion._popNode.style.display = \"block\";\n\t//this._completion._popNode.style.width = \"100%\";\n\t//this._completion._popNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\t//this._completion._popNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n \n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedCompEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedCompEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedCompEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedCompEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedCompEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedCompEngine.prototype.handleInputEvent = function(event) {\n //DEBUG console.log( \"__framed.js::handleInputEvent\");\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedCompEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedCompEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedCompEngine = FramedCompEngine;\n\n})();\n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/framed.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/simple.js": {
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/simple.js\ntype: application/javascript\nmodule-type: library\n\nTaken from $:/core/modules/editor/engines/simple.js\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\n// Configuration tiddler\nvar COMPLETION_OPTIONS = \"$:/plugins/snowgoon88/edit-comptext/config\";\nvar Completion = require(\"$:/plugins/snowgoon88/edit-comptext/completion.js\").Completion;\n\nfunction SimpleCompEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\n // Completion\n\t// Load Completion configuration as JSON\n this._configOptions = $tw.wiki.getTiddlerData( COMPLETION_OPTIONS, {} );\n\t\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n\n\t// add Completion popup\n this._completion = new Completion( this.widget, this.domNode, this._configOptions );\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleCompEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleCompEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleCompEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleCompEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleCompEngine.prototype.handleInputEvent = function(event) {\n\tconsole.log( \"__simple.js::handleInputEvent\");\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleCompEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleCompEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleCompEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleCompEngine = SimpleCompEngine;\n\n})();\n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/simple.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/cursor-position.js": {
"text": "/*\\\nModule that compute the pixel position of the cursor of a text\nements.\n\nTaken from https://github.com/component/textarea-caret-position\n\n(as https://github.com/kir/js_cursor_position is not updated any more)\n\\*/\n// Fonction anonyme executée immediatement\n( function(){\n \n// The properties that we copy into a mirrored div.\n// Note that some browsers, such as Firefox,\n// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n// so we have to do every single property specifically.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\nvar isFirefox = false;\nif($tw.browser) {\n isFirefox = window.mozInnerScreenX != null;\n}\n\nfunction getCaretCoordinates(element, position, options) {\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if ( el ) { el.parentNode.removeChild(el); }\n }\n\n // mirrored div\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed;\n if($tw.browser) {\n computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n } \n else {\n computed = element.currentStyle;\n }\n \n\n // default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT')\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // transfer the element's properties to the div\n properties.forEach(function (prop) {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (element.nodeName === 'INPUT')\n div.textContent = div.textContent.replace(/\\s/g, \"\\u00a0\");\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // for inputs, just '.' would be enough, but why bother?\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\n// Exporte as a module of node.js otherwise set as global\nif (typeof module != \"undefined\" && typeof module.exports != \"undefined\") {\n module.exports = getCaretCoordinates;\n} else {\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n})();\n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/cursor-position.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/completion.js": {
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/completion.js\ntype: application/javascript\nmodule-type: library\n\nTry to make self-contained completion module.\n\nTo use this 'module', you need a `widget` with a kind of `editarea` node.\nI do not know the exacte prerequisites of this editarea node for the module to\nwork, but mostly one should be able to attach the following `eventHandler` to\nit:\n - input\n - keydown\n - keypress\n - keyup\nThe `widget` is needed because I use:\n - widget.document\n - widget.wiki.filterTiddlers(...)\n\nFrom the Widget, once you have a proper editarea, you just have to call\n - var completion = new Completion( theWidget, theEditAreaNode, configObject);\nwhere `configObject` is expected to have the following fields. if a field is missing, a default value will be given.\nOne can have many `elements' in the template array.\n\n{\n \"configuration\": {\n \"caseSensitive\" : false,\n \"maxMatch\" : 8,\n \"minPatLength\" : 2,\n \"triggerKeyCombination\" : \"^ \"\n },\n \"template\": [{\n \"pattern\": \"[[\",\n \"filter\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n }\n ]\n}\n\nTODO : CHECK if needed\n\\*/\n\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// To compute pixel coordinates of cursor\nvar getCaretCoordinates = require(\"$:/plugins/snowgoon88/edit-comptext/cursor-position.js\");\n\n/** Default Completion Attributes */\nvar DEFATT = { maxMatch: 5, minPatLength: 2, caseSensitive: false, triggerKeyCombination: \"^ \" };\n\n/** \n * Struct for generic Completion Templates.\n * <ul>\n * <li>pat : pattern searched for.</li>\n * <li>filter : filter operation used to find the list of completion options</li>\n * <li>mask: replaced by \"\" when presenting completion options</li>\n * </ul>\n */\nvar Template = function( pat, filter, mask, field, start, end ) {\n this.pat = pat;\n this.filter = filter;\n this.mask = \"^\"+regExpEscape(mask);\n this.field = field;\n this.start = start;\n this.end = end;\n this.pos = 0;\n};\n/**\n * Struct for storing completion options, as we need to memorise \n * the titles of the tiddlers when masked and when body must be displayed.\n */\nvar OptCompletion = function( title, str ) {\n this.title = title;\n this.str = str;\n};\n\nvar keyMatchGenerator = function(combination) {\n\tlet singleMatchGenerator = function(character) {\n\t\tif (character === '^') {\n\t\t\treturn event => event.ctrlKey;\n\t\t}\n\t\telse if (character === '+') {\n\t\t\treturn event => event.shiftKey;\n\t\t}\n\t\telse if (character === '!') {\n\t\t\treturn event => event.altKey;\n\t\t}\n\t\telse {\n\t\t\treturn event => (event.keyCode || event.which) === character.charCodeAt(0);\n\t\t}\n\t};\n\n\tlet matchers = [];\n\tfor (let i = 0; i < combination.length; i++) {\n\t\tmatchers.push(singleMatchGenerator(combination[i]));\n\t}\n\n\treturn event => {\n\t\tfor (let i = 0; i < matchers.length; i++) {\n\t\t\tif (!matchers[i](event)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n};\n\n/**\n * Widget is needed in creating popupNode.\n * - widget.document\n * - widget.wiki.filterTiddlers(...)\n * - sibling : where to create the popup in the DOM.\n */\n\tvar Completion = function( editWidget, areaNode, param, sibling, offTop, offLeft ) {\n\tconsole.log( \"==Completion::creation\" );\n\n // About underlying Widget\n this._widget = editWidget;\n\tthis._areaNode = areaNode;\n\tthis._sibling = (typeof sibling !== 'undefined') ? sibling : this._areaNode;\n\tthis._offTop = (typeof offTop !== 'undefined') ? offTop : 0;\n\tthis._offLeft = (typeof offLeft !== 'undefined') ? offLeft : 0;\t\n\t\t\n // Completions attributes\n /** State */\n this._state = \"VOID\";\n this._template = undefined;\n /** Best matches */\n this._bestMatches = []; // An array of OptCompletion\n this._idxChoice = -1;\n /** Param */\n // maximum nb of match displayed\n this._maxMatch = param.configuration.maxMatch || DEFATT.maxMatch; \n this._minPatLength = param.configuration.minPatLength || DEFATT.minPatLength;\n this._caseSensitive= param.configuration.caseSensitive || DEFATT.caseSensitive;\n this._triggerKeyMatcher = keyMatchGenerator(param.configuration.triggerKeyCombination || DEFATT.triggerKeyCombination);\n /** Input information */\n this._lastChar = \"\";\n this._hasInput = false;\n /** List of Completion Templates */\n this._listTemp = [];\n \n // Read templates from Param\n if( param.template ) {\n \tvar idT;\n \tfor( idT=0; idT<param.template.length; idT++ ) {\n \t var temp = param.template[idT];\n\t // field 'body' ou 'title' (default)\n\t if( temp.body ) {\t\t\n \t\tthis._listTemp.push( \n \t\t new Template( temp.pattern, temp.body,\n\t\t\t\t temp.mask ? temp.mask : \"\",\n\t\t\t\t \"body\",\n \t\t\t\t temp.start, temp.end )\n \t\t);\n\t }\n\t else {\n \t\tthis._listTemp.push( \n \t\t new Template( temp.pattern, \n\t\t\t\t temp.title ? temp.title : temp.filter,\n\t\t\t\t temp.mask ? temp.mask : \"\",\n\t\t\t\t \"title\",\n \t\t\t\t temp.start, temp.end )\n \t\t);\n\t }\n\t //DEBUG temp = this._listTemp[this._listTemp.length-1];\n\t //DEBUG console.log( \"__CONF : \"+temp.pattern+\":\"+temp.filter+\":\"+temp.mask+\":\"+temp.field+\":\"+temp.start+\":\"+temp.end );\n \t}\n }\n // or defaut template\n else {\n \tthis._listTemp = [\n \t new Template( \"[[\", \"[all[tiddlers]!is[system]]\", \n\t\t\t \"\", \"title\",\n\t\t\t \"[[\", \"]]\" )\n \t];\n }\n // Create Popup\n\t//this._popNode = createPopup(this._widget, this._areaNode );\n\tthis._popNode = createPopup(this._widget, this._sibling );\t\n \n // Listen to the Keyboard\n $tw.utils.addEventListeners( this._areaNode,[\n\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInput\"},\n\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydown\"},\n\t{name: \"keypress\", handlerObject: this, handlerMethod: \"handleKeypress\"},\n \t{name: \"keyup\", handlerObject: this, handlerMethod: \"handleKeyup\"}\n ]);\n \n /** \n * Find the bestMatches among listChoice with given pattern\n * @param listChoice : array of String\n * @change : this._bestMatches => array of OptCompletion\n */\n this._findBestMatches = function( listChoice, pattern, nbMax) {\n\t// regexp search pattern, case sensitive\n\tvar flagSearch = this._caseSensitive ? \"\" : \"i\" ;\n\tvar regpat = RegExp( regExpEscape(pattern), flagSearch );\n\tvar regpat_start = RegExp( \"^\"+regExpEscape(pattern), flagSearch );\n\tvar regMask = RegExp( this._template.mask ? this._template.mask : \"\",\"\");\n\tvar nbMatch = 0;\n\t// nbMax set to _maxMatch if no value given\n\tnbMax = nbMax !== undefined ? nbMax : this._maxMatch;\n\n\t//DEBUG console.log( \"__FIND masked=\"+regMask+\" regPat=\"+regpat);\n\n\tthis._bestMatches= [];\n\tvar otherMatches = [];\n\t// We test every possible choice\n\tfor( var i=0; i< listChoice.length; i++ ) {\n\t // apply mask over potential choice\n\t var maskedChoice = listChoice[i].replace( regMask, \"\");\n\t // Test first if pattern is found at START of the maskedChoice\n\t // THEN added to BestMatches\n \t if( regpat_start.test( maskedChoice )) {\n\t\tif (nbMatch >= nbMax) {\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"...\") );\n\t\t return;\n\t\t} else {\n\t\t this._bestMatches.push( new OptCompletion(listChoice[i],maskedChoice) );\n\t\t nbMatch += 1;\n\t\t}\n\t }\n\t // then if pattern is found WITHIN the maskedChoice\n\t // added AFTER the choices that starts with pattern\n\t else if( regpat.test( maskedChoice ) ) {\n\t\tif (nbMatch >= nbMax) {\n\t\t // add all otherMatches to _bestMatches\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"<hr>\") ) ; //separator\n\t\t this._bestMatches = this._bestMatches.concat( otherMatches );\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"...\") );\n\t\t return;\n\t\t} else {\n\t\t otherMatches.push( new OptCompletion(listChoice[i],maskedChoice) );\n\t\t nbMatch += 1;\n\t\t}\n\t }\n\t}\n\t// Here, must add the otherMatches\n\tthis._bestMatches.push( new OptCompletion(\"\",\"<hr>\") ) ; //separator\n\tthis._bestMatches = this._bestMatches.concat( otherMatches );\n };\n /**\n * Change Selected Status of Items\n */\n this._next = function (node) {\n\tvar count = node.children.length;\n\t//DEBUG console.log( \"__NEXT: co=\"+count+\" nbMatch=\"+this._bestMatches.length);\n\tif( this._bestMatches.length > 0 ) \n\t this._goto( node, this._idxChoice < count - 1 ? this._idxChoice + 1 : -1);\n\t//DEBUG this._logStatus( \"NexT\" );\n };\n this._previous = function (node) {\n\tvar count = node.children.length;\n\tvar selected = this._idxChoice > -1;\n\t//DEBUG console.log( \"__PREV: co=\"+count+\" nbMatch=\"+this._bestMatches.length);\n\tif( this._bestMatches.length > 0 ) \n\t this._goto( node, selected ? this._idxChoice - 1 : count - 1);\n\t//DEBUG this._logStatus( \"PreV\" );\n };\n // Should not be used, highlights specific item without any checks!\n this._goto = function (node, idx) {\n\tvar lis = node.children;\n\tvar selected = this._idxChoice > -1;\n\tif (selected) {\n\t lis[this._idxChoice].setAttribute(\"patt-selected\", \"false\");\n\t}\n\n\tthis._idxChoice = idx;\n \n\tif (idx > -1 && lis.length > 0) {\n\t lis[idx].setAttribute(\"patt-selected\", \"true\");\n\t}\n };\n /**\n * Abort pattern and undisplay.\n */\n this._abortPattern = function (displayNode) {\n\tthis._state = \"VOID\";\n\tthis._bestChoices = [];\n\tthis._idxChoice = -1;\n\tthis._undisplay( displayNode );\n\tthis._template = undefined;\n };\n /**\n * Display popupNode at the cursor position in areaNode.\n */\n this._display = function( areaNode, popupNode ) {\n\tif ( popupNode.style.display == 'none' ) {\n\t // Must get coordinate\n\t // Cursor coordinates within area + area coordinates + scroll\n var coord = getCaretCoordinates(areaNode, areaNode.selectionEnd);\n var styleSize = getComputedStyle(areaNode).getPropertyValue('font-size');\n var fontSize = parseFloat(styleSize); \n\t\t\n\t popupNode.style.left = (this._offLeft+areaNode.offsetLeft-areaNode.scrollLeft+coord.left) + 'px';\n\t popupNode.style.top = (this._offTop+areaNode.offsetTop-areaNode.scrollTop+coord.top+fontSize*2) + 'px';\n\t popupNode.style.display = 'block';\n\t}\n };\n /**\n * Undisplay someNode\n */\n this._undisplay = function( displayNode ) {\n\tif ( displayNode.style.display != 'none' ) {\n\t displayNode.style.display = 'none';\n\t}\n };\n\n /**\n * Used for debug\n */\n this._logStatus = function(msg) {\n\tconsole.log( \"__STATUS: \"+this._state+\":-\"+msg+\"- idx=\"+this._idxChoice );\n };\n\n};\n// **************************************************************************\n// ******************************************************************eventCbk\n// **************************************************************************\n/**\n * Disable the *effects* of ENTER / UP / DOWN / ESC when needed.\n * Set _hasInput to false.\n */\nCompletion.prototype.handleKeydown = function(event) {\n // key \n var key = event.keyCode;\n this._hasInput = false;\n \n //DEBUG console.log( \"__KEYDOWN (\"+key+\") hasI=\"+this._hasInput);\n \n // ENTER while selecting\n if( (this._state === \"PATTERN\" || this._state === \"SELECT\") && key === 13 ) {\n \tevent.preventDefault();\n \tevent.stopPropagation();\n }\n // ESC while selecting\n if( (this._state === \"PATTERN\" || this._state === \"SELECT\") && key === 27 ) {\n \tevent.preventDefault();\n \tevent.stopPropagation();\n }\n // UP/DOWN while a pattern is extracted\n if( (key===38 || key===40) && \n\t(this._state === \"PATTERN\" || this._state === \"SELECT\") ) {\n\tevent.preventDefault();\n }\n};\n/**\n * Means that something has been added/deleted => set _hasInput\n */\nCompletion.prototype.handleInput = function(event) {\n this._hasInput = true;\n //DEBUG console.log( \"__INPUT hasI=\"+this._hasInput );\n};\n\t\n/**\n * Set _lastChar, detects CTRL+SPACE.\n */\nCompletion.prototype.handleKeypress = function(event) {\n var curPos = this._areaNode.selectionStart; // cursor position\n var val = this._areaNode.value; // text in the area\n // key \n var key = event.keyCode || event.which;\n\t\n this._lastChar = String.fromCharCode(key);\n //DEBUG console.log( \"__KEYPRESS (\"+key+\") hasI=\"+this._hasInput+\" char=\"+this._lastChar );\n //DEBUG this._logStatus( \"KEYPRESS\" );\n \n // Detect Ctrl+Space\n if( this._triggerKeyMatcher(event) && this._state === \"VOID\" ) {\n\t//Find a proper Template\n\t// first from which we can extract a pattern\n\tif( this._template === undefined ) {\n\t //DEBUG console.log(\"__SPACE : find a Template\" );\n\t var idT, res;\n\t for( idT=0; idT < this._listTemp.length; idT++ ) {\n\t\tres = extractPattern( val, curPos, this._listTemp[idT] );\n\t\t//DEBUG console.log(\" t=\"+this._listTemp[idT].pat+\" res=\"+res);\n\t\t// res is not undefined => good template candidate\n\t\tif( res ) {\n\t\t this._template = this._listTemp[idT];\n\t\t this._state = \"PATTERN\";\n\t\t break;\n\t\t}\n\t }\n\t}\n\telse {\n\t //DEBUG console.log(\"__SPACE : already a template\" );\n\t this._state = \"PATTERN\";\n\t}\n }\n};\n/**\n * ESC -> abort; \n * Detect [ -> VOID switch to _state=PATTERN\n * PATTERN || SELECT : ENTER -> insertText\n * UP/DOWN -> previous/next\n * pattern.length > _minPatternLength -> display \n */\nCompletion.prototype.handleKeyup = function(event) {\n var curPos = this._areaNode.selectionStart; // cursor position\n var val = this._areaNode.value; // text in the area\n // key a\n var key = event.keyCode;\n \n //DEBUG console.log( \"__KEYUP (\"+key+\") hasI=\"+this._hasInput );\n \n // ESC\n if( key === 27 ) {\n\tthis._abortPattern( this._popNode );\n\t//DEBUG this._logStatus( \"\" );\n }\n // Check for every template\n if( this._hasInput && this._state === \"VOID\" ) {\n\t// check every template's pattern\n\tvar idT, template;\n\tfor( idT=0; idT < this._listTemp.length; idT++ ) {\n\t template = this._listTemp[idT];\n\t if( this._lastChar === template.pat[template.pos] ) {\n\t\ttemplate.pos += 1;\n\t\t//DEBUG console.log( \"__CHECK : pat=\"+template.pat+\" pos=\"+template.pos );\n\t\t// Pattern totaly matched ?\n\t\tif( template.pos === template.pat.length ) {\n\t\t //DEBUG console.log( \"__CHECK => found \"+template.pat );\n\t\t this._state = \"PATTERN\";\n\t\t this._template = template;\n\t\t \n\t\t break; // get out of loop\n\t\t}\n\t }\n\t else {\n\t\ttemplate.pos = 0;\n\t\t//DEBUG console.log( \"__CHECK : pat=\"+template.pat+\" pos=\"+template.pos );\n\t }\n\t}\n }\n // a pattern\n else if( this._state === \"PATTERN\" || this._state === \"SELECT\" ) {\n\t// Pattern below cursor : undefined if no pattern\n\tvar pattern = extractPattern( val, curPos, this._template );\n\tif( key === 13 ) { // ENTER\n\t //DEBUG console.log( \"KEY : Enter\" );\n \t // Choice made in the displayNode ?\n \t var selected = this._idxChoice > -1 && this._idxChoice !== this._maxMatch;\n \t //DEBUG console.log( \" > sel=\"+selected+\" len=\"+this._bestChoices.length );\n \t if( selected ) {\n \t\t//DEBUG console.log( \" > selected\" );\n\t\tvar temp = this._bestMatches[this._idxChoice];\n\t\tvar str = temp.str;\n\t\tif( this._template.field === \"body\" ) {\n\t\t str = $tw.wiki.getTiddlerText( temp.title );\n\t\t}\n \t\tinsertInto( this._areaNode,\n\t\t\t str,\n\t\t\t pattern.start, curPos, this._template );\n\t\t// save this new content\n\t\tthis._widget.saveChanges( this._areaNode.value );\n\t }\n\t // otherwise take the first choice (if exists)\n\t else if( this._bestMatches.length > 0 ) {\n \t\t//DEBUG console.log( \" > take first one\" );\n\t\tvar temp = this._bestMatches[0];\n\t\tvar str = temp.str;\n\t\tif( this._template.field === \"body\" ) {\n\t\t str = $tw.wiki.getTiddlerText( temp.title );\n\t\t}\n \t\tinsertInto( this._areaNode,\n\t\t\t str,\n\t\t\t pattern.start, curPos, this._template );\n\t\t// save this new content\n\t\tthis._widget.saveChanges( this._areaNode.value );\n\t }\n\t this._abortPattern( this._popNode );\n\t\t//DEBUG this._logStatus( \"\" );\n \t }\n\t else if( key === 38 && this._hasInput === false) { // up\n\t\tthis._state = \"SELECT\";\n \t\tevent.preventDefault();\n \t\tthis._previous( this._popNode );\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t//event.stopPropagation();\n \t }\n \t else if( key === 40 && this._hasInput === false) { // down\n\t\tthis._state = \"SELECT\";\n \t\tevent.preventDefault();\n \t\tthis._next( this._popNode );\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t//event.stopPropagation();\n \t }\n \t else if( pattern ) { // pattern changed by keypressed\n\t\tthis._idxChoice = -1;\n \t\t// log\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t// Popup with choices if pattern at least minPatLength letters long\n\t\tif( pattern.text.length > (this._minPatLength-1) ) {\n\t\t // compute listOptions from templateFilter\n\t\t var allOptions;\n\t\t if( this._template )\n\t\t\tallOptions = this._widget.wiki.filterTiddlers( this._template.filter );\n\t\t else\n\t\t\tallOptions = this._widget.wiki.filterTiddlers(\"[all[tiddlers]]\");\n\t\t this._findBestMatches( allOptions, pattern.text );\n \t\t this._popNode.innerHTML = \"\";\n \t\t //console.log( \"BC \"+ this._pattern + \" => \" + choice );\n \t\t if (this._bestMatches.length > 0) {\n\t\t\tfor( var i=0; i<this._bestMatches.length; i++) {\n \t\t\t this._popNode.appendChild( \n\t\t\t\titemHTML(this._bestMatches[i].str,\n\t\t\t\t\t pattern.text));\n \t\t\t}\n\t\t\tthis._display( this._areaNode, this._popNode );\t\t\t\n \t\t }\n\t\t else { // no matches\n\t\t\tthis._state = \"PATTERN\";\n\t\t\tthis._undisplay( this._popNode );\n\t\t }\n\t\t}\n \t }\n\t else { // no pattern detected\n\t\tthis._abortPattern( this._popNode );\n\t }\n\t}\n\t// to ensure that one MUST add an input (through onInput())\n\tthis._hasInput = false;\n};\n// **************************************************************************\n// ******************************************************** private functions\n// **************************************************************************\n/**\n * Create popup element.\n */\nvar createPopup = function( widget, node ) {\n // Insert a special \"div\" element for poping up\n // Its 'display' property in 'style' control its visibility\n var popupNode = widget.document.createElement(\"div\");\n popupNode.setAttribute( \"style\", \"display:none; position: absolute;\");\n popupNode.className = \"tc-block-dropdown ect-block-dropdown\";\n // Insert the element into the DOM\n node.parentNode.insertBefore(popupNode,node.nextSibling);\n //CHECK the domNodes is a attribute of Widget [widget.js]\n //CHECK this.domNodes.push(popupNode);\n \n return popupNode;\n};\n/**\n * Extract Pattern from text at a given position.\n *\n * Between previous template.pat (or '[[') and pos\n * \n * If no pattern -> undefined\n */\nvar extractPattern = function( text, pos, template ) {\n // Detect previous and next ]]=>STOP or [[=>START\n var sPat = template.pat ? template.pat : '[[';\n var pos_prevOpen = text.lastIndexOf( sPat, pos );\n var ePat = template.end ? template.end : ']]';\n var pos_prevClosed = text.lastIndexOf( ePat, pos );\n var pos_nextClosed = text.indexOf( ePat, pos );\n //DEBUG console.log(\"__CALC st=\"+sPat+\" -> en=\"+ePat );\n //DEBUG console.log(\"__CALC po=\"+pos_prevOpen+\" pc=\"+pos_prevClosed+\" nc=\"+pos_nextClosed+\" pos=\"+pos);\n pos_nextClosed = (pos_nextClosed >= 0) ? pos_nextClosed : pos;\n \n if( (pos_prevOpen >= 0) && // must be opened\n\t((pos_prevOpen > pos_prevClosed ) || // not closed yet\n\t (pos_prevClosed === pos))) { // closed at cursor\n\t//DEBUG console.log(\" pat=\"+text.slice( pos_prevOpen+sPat.length, pos) );\n\treturn { text: text.slice( pos_prevOpen+sPat.length, pos ),\n\t\t start: pos_prevOpen,\n\t\t end: pos_nextClosed\n\t };\n }\n};\n/**\n * Controls how list items are generated.\n * Function that takes two parameters :\n * - text : suggestion text\n * - input : the user’s input\n * Returns : list item. \n * Generates list items with the user’s input highlighted via <mark>.\n */\nvar itemHTML = function (text, input ) {\n // text si input === ''\n // otherwise, build RegExp that is global (g) and case insensitive (i)\n // to replace with <mark>$&</mark> where \"$&\" is the matched pattern\n var html = input === '' ? text : text.replace(RegExp(regExpEscape(input.trim()), \"gi\"), \"<mark>$&</mark>\");\n return create(\"li\", {\n\tinnerHTML: html,\n\t\"patt-selected\": \"false\"\n });\n};\n/**\n * Insert text into a textarea node, \n * enclosing in 'template.start..template.end'\n *\n * - posBefore : where the 'template.pat+pattern' starts\n * - posAfter : where the cursor currently is\n */\nvar insertInto = function(node, text, posBefore, posAfter, template ) {\n //DEBUG console.log( \"__INSERT : \"+template.pattern+\":\"+template.filter+\":\"+template.mask+\":\"+template.field+\":\"+template.start+\":\"+template.end );\n var val = node.value;\n var sStart = template.start !== undefined ? template.start : '[[';\n var sEnd = template.end !== undefined ? template.end : ']]';\n var newVal = val.slice(0, posBefore) + sStart + text + sEnd + val.slice(posAfter);\n //console.log(\"__INSERT s=\"+sStart+\" e=\"+sEnd);\n //console.log (\"__INSERT pb=\"+posBefore+\" pa=\"+posAfter+\" txt=\"+text);\n //console.log( \"NEW VAL = \"+newVal );\n // WARN : Directly modifie domNode.value.\n // Not sure it does not short-circuit other update methods of the domNode....\n // i.e. could use widget.updateEditor(newVal) from edit-comptext widget.\n // but how to be sure that cursor is well positionned ?\n node.value = newVal;\n node.setSelectionRange(posBefore+text.length+sStart.length+sEnd.length, posBefore+text.length+sStart.length+sEnd.length );\n};\n/**\n * Add an '\\' in front of -\\^$*+?.()|[]{}\n */\nvar regExpEscape = function (s) {\n return s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n/**\n * Add an element in the DOM.\n */\nvar create = function(tag, o) {\n var element = document.createElement(tag);\n \n for (var i in o) {\n\tvar val = o[i];\n\t\n\tif (i === \"inside\") {\n\t $(val).appendChild(element);\n\t}\n\telse if (i === \"around\") {\n\t var ref = $(val);\n\t ref.parentNode.insertBefore(element, ref);\n\t element.appendChild(ref);\n\t}\n\telse if (i in element) {\n\t element[i] = val;\n\t}\n\telse {\n\t element.setAttribute(i, val);\n\t}\n }\n \n return element;\n};\n\n\nexports.Completion = Completion;\n\n})();\n\n \n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/completion.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/edit-comptext.css": {
"text": "\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/* The \\rules pragma at the top of the tiddler restricts the WikiText \n * to just allow macros and transclusion. This avoids mistakenly \n * triggering unwanted WikiText processing.\n * \n * MUST not save as text/css for macro to be processed\n*/\n\n.ect-block-dropdown li {\n display: block;\n padding: 4px 14px 4px 14px;\n text-decoration: none;\n color: <<colour tiddler-link-foreground>>; /*#5778d8;*/ \n background: transparent;\n}\n.ect-block-dropdown li[patt-selected=\"true\"] {\n color: <<colour tiddler-link-background>>; /*#ffffff; */\n background-color: <<colour tiddler-link-foreground>>; /*#5778d8; */\n}\n.ect-block-dropdown li[patt-selected=\"true\"] mark {\n background: hsl(86, 100%, 21%);\n color: inherit;\n}\n\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/snowgoon88/edit-comptext/edit-comptext.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/snowgoon88/edit-comptext/readme": {
"title": "$:/plugins/snowgoon88/edit-comptext/readme",
"text": "!! What ?\nThis plugin adds ''completion'' when editing the body of a tiddler.\n\n* Enter completion-mode by typing `[[` or `CTRL+SPACE`\n* A list of tiddlers with a title that matches the pattern between `[[` and cursor appears\n* `UP/DOWN` keys can select a tiddler, `ENTER` to validate\n* If there is only one match, `ENTER` selects it.\n* `NEW` : you can specify you own trigger pattern and the list of possible completions. See [[$:/plugins/snowgoon88/edit-comptext/usage]] for more details.\n\n\n!! To try it or get the latest news\nSee [[http://snowgoon88.github.io/TW5-extendedit]]\n\n!! Install \n\nTo add the plugin to your own TiddlyWiki5, just drag this link to the browser window:\n\n[[$:/plugins/snowgoon88/edit-comptext]]\n\nSometime, a small configuration step is then needed\n\nin `$:/ControlPanel -> Advanced -> Editor Type -> text/vnd.tiddlywiki` you must chose `comptext` instead of `text`.\n\nReload and « voilà »...\n\nThis plugin is quite mature now :o)\n\n!! Old version\n\n* A version compatible with 5.0.8 to 5.1.11 : [[http://snowgoon88.github.io/TW5-extendedit/index_5.1.11.html]]\n\n!! Source code\nOn github [[https://github.com/snowgoon88/TW5-extendedit]]\n\nGet in touch : snowgoon88(AT)gmail(DOT)com\n"
},
"$:/plugins/snowgoon88/edit-comptext/usage": {
"title": "$:/plugins/snowgoon88/edit-comptext/usage",
"text": "''Important'' : be sure that in `$:/ControlPanel -> Advanced -> Editor Type -> text/vnd.tiddlywiki` you have chosen `comptext` instead of `text`.\n\nConfiguration of the edit-comptext plugin can be done through the tiddler [[$:/plugins/snowgoon88/edit-comptext/config]]. Use a JSON tiddler (do not forget to set the type to `application/json`. See some examples at [[$:/plugins/snowgoon88/edit-comptext/examples]]\n\nIn the `configuration` object you can set :\n\n* `caseSensitive`: `true`/`false` (is search case sensitive ?)\n* `maxMatch` : an `integer` (max number of match displayed)\n* `minPatLength` : an `integer` (minimal length of a pattern to trigger completion search)\n* `triggerKeyCombination ` : a `string` representing the key combination that triggers the autocompletion popup. To use modifier keys in your combination, use following conversions : `ctrl` -> `^`, `alt` -> `!`, `shift` -> `+`. Note: ` ` (literally a whitespace) represents the `space` key.\n\nIn the `template` array you can specify the various completion templates that will be used. Every template can have the following members.\n\n* `pattern` : `string` (pattern that triggers a completion, default \"[[\" )\n* `title` or `body`: `string` (the filter operators that gives the list of valid completions, default \"[all[tiddlers]!is[system]]\"). If you specify `body`, then the body of the tiddler will be inserted on selection.\n* `start` : `string` (when completion is chosen, start is put before the completion, default \"[[\")\n* `end` : `string` (when completion is chosen, end is put after the completion, default \"]]\")\n\n!! Current body of Config Tiddler\n\n{{$:/plugins/snowgoon88/edit-comptext/config}}\n\n"
}
}
}
{
"configuration": {
"caseSensitive" : false,
"maxMatch" : 8,
"minPatLength" : 2,
"triggerKeyCombination" : "^ "
},
"template": [{
"pattern": "[[",
"filter": "[all[tiddlers]!is[system]]",
"start": "[[",
"end": "]]"
}
]
}
{
"tiddlers": {
"$:/_sq/Stories/config/openLinkDivert": {
"text": "bottom",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/config/openLinkDivert",
"modified": "20200422063802598",
"created": "20170629173808777"
},
"$:/_sq/Stories/config/showRiverDropZones": {
"text": "disable",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/config/showRiverDropZones",
"modified": "20200417233130361",
"created": "20200417170940547"
},
"$:/_sq/Stories/config/sidebaroverlaybreakpoint": {
"text": "1500px",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/config/sidebaroverlaybreakpoint",
"modified": "20200416182732404",
"created": "20170616192704225"
},
"$:/_sq/Stories/config/snippets/viewswitcher": {
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/_sq/Stories/config/Story2-storyview\">\n<div class=\"tc-chooser\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/_sq/Stories/config/Story2-storyview}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>>\n<$transclude tiddler=<<icon>>/>\n<$text text=<<storyview>>/>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/config/snippets/viewswitcher",
"tags": "",
"modified": "20200416183434009",
"created": "20200416183108721"
},
"$:/_sq/Stories/config/Story2-storyview": {
"text": "classic",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/config/Story2-storyview",
"tags": "",
"modified": "20200417205214764",
"created": "20200415213157946"
},
"$:/_sq/Stories/config/twostorybreakpoint": {
"text": "1100px",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/config/twostorybreakpoint",
"modified": "20200416182753284",
"created": "20170616192701335"
},
"$:/_sq/Stories/CorePatch/ButtonDispatchMessage": {
"text": "var ButtonWidget = require(\"$:/core/modules/widgets/button.js\").button;\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event, navigateFromNode: this});\n};",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/_sq/Stories/CorePatch/ButtonDispatchMessage",
"tags": "",
"module-type": "startup",
"modified": "20200414150813641",
"created": "20170616103202530"
},
"$:/_sq/Stories/divertTiddlerEditMacro": {
"text": "\\define divertTiddlerButton()\n<$set name=\"original\" value={{!!draft.title}}>\n<$set name=\"otherStoryList\" filter=\"[enlist{$:/_sq/Stories/StoriesList!!list}] -[<tv-story-list>]\" select=\"0\">\n\t<$button class=<<tv-config-toolbar-class>> tooltip=\"Divert this tiddler to the other story for viewing\">\n\t\t<$reveal state=\"$:/_sq/Stories/config/openLinkDivert\" type=\"nomatch\" text=\"top\" default=\"top\">\n\t\t\t<$action-listops $tiddler=<<otherStoryList>> $subfilter=\"[<original>]\"/>\n\t\t</$reveal>\n\t\t<$reveal state=\"$:/_sq/Stories/config/openLinkDivert\" type=\"match\" text=\"top\" default=\"top\">\n\t\t\t<$action-listops $tiddler=<<otherStoryList>> $subfilter=\"+[prepend<original>]\"/>\n\t\t</$reveal>\n\t\t<span class=\"sq-button-divert-right sq-button-divert\">{{$:/_sq/Stories/icons/divert-right.svg}}</span><span class=\"sq-button-divert-left sq-button-divert\">{{$:/_sq/Stories/icons/divert-left.svg}}</span>\n\t</$button>\n</$set>\n</$set>\n\\end\n\n<<divertTiddlerButton>>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/divertTiddlerEditMacro",
"tags": "$:/tags/EditToolbar",
"modified": "20200425133731696",
"list-before": "$:/core/ui/Buttons/delete",
"description": "divert right/left",
"created": "20170616074148780",
"caption": "{{$:/_sq/Stories/icons/divert-right.svg}}"
},
"$:/_sq/Stories/divertTiddlerMacro": {
"text": "\\define __me()\n[[$(currentTiddler)$]]\n\\end\n\n\\define divertTiddlerButton()\n<$set name=\"activeStoryList\" value=<<tv-story-list>> >\n<$set name=\"otherStoryList\" filter=\"[enlist{$:/_sq/Stories/StoriesList!!list}] -[<tv-story-list>]\" select=\"0\">\n<$set name=\"otherHistoryList\" filter=\"[enlist{$:/_sq/Stories/HistoriesList!!list}] -[<tv-history-list>]\" select=\"0\">\n\t<$button class=<<tv-config-toolbar-class>> tooltip=\"Divert this tiddler to the other story\">\n\t\t<$action-listops $tiddler=<<activeStoryList>> $subfilter=\"+[remove<__me>]\"/>\n\t\t<$reveal state=\"$:/_sq/Stories/config/openLinkDivert\" type=\"nomatch\" text=\"top\" default=\"top\">\n\t\t\t<$action-listops $tiddler=<<otherStoryList>> $subfilter=<<__me>>/>\n\t\t</$reveal>\n\t\t<$reveal state=\"$:/_sq/Stories/config/openLinkDivert\" type=\"match\" text=\"top\" default=\"top\">\n\t\t\t<$action-listops $tiddler=<<otherStoryList>> $subfilter=\"+[prepend<__me>]\"/>\n\t\t</$reveal>\n\t\t<$action-addtohistory $history=<<otherHistoryList>> $title=<<currentTiddler>> />\n\t\t<span class=\"sq-button-divert-right sq-button-divert\">{{$:/_sq/Stories/icons/divert-right.svg}}</span><span class=\"sq-button-divert-left sq-button-divert\">{{$:/_sq/Stories/icons/divert-left.svg}}</span>\n\t</$button>\n</$set>\n</$set>\n</$set>\n\\end\n\n<<divertTiddlerButton>>\n\n\n",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/divertTiddlerMacro",
"tags": "$:/tags/ViewToolbar",
"modified": "20200425132210151",
"list-before": "",
"description": "Divert left/right",
"created": "20170609055347900",
"caption": "{{$:/_sq/Stories/icons/divert-right.svg}} divert left/right"
},
"$:/_sq/Stories/EditTiddlerHook": {
"text": "$tw.hooks.addHook(\"th-editing-tiddler\", function(event) {\n\tvar targetTitle = event.tiddlerTitle;\n\tvar stories = $tw.wiki.getTiddlerList('$:/_sq/Stories/StoriesList');\n\tvar draftTitle = $tw.wiki.findDraft(targetTitle);\n\tvar shiftKey = event.event.shiftKey;\n\n\t//if !draftTitle, its not open anywhere\n\t//cant be open without existing, but can exist without being opened\n\n\tif(!draftTitle && !shiftKey) {\n\t\treturn true;\n\t}\n\n\tvar node = event.navigateFromNode;\n\tvar thisStory = node.getVariable(\"tv-story-title\");\n\tvar otherStory = (stories[0] == thisStory)? stories[1] : stories[0];\n\tvar otherStoryList = $tw.wiki.getTiddlerList(otherStory);\n\n\tif(otherStoryList.indexOf(draftTitle) > -1) {\n\t\talert(\"This tiddler is already open for editing in the other story\");\n\t\treturn false;\n\t}\n\n\tvar generateDraftTitle = function(title) {\n\t\tvar c = 0,\n\t\tdraftTitle;\n\t\tdo {\n\t\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\";\n\t\t\tc++;\n\t\t} while($tw.wiki.tiddlerExists(draftTitle));\n\t\treturn draftTitle;\n\t};\n\t\n\tif(shiftKey) {\n //open in other story\n\t\tif(!draftTitle) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(targetTitle);\n\t\t\tdraftTitle = generateDraftTitle(targetTitle);\n\t\t\tvar draftTiddler = new $tw.Tiddler(\n\t\t\t\ttiddler,\n\t\t\t\t{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\t\"draft.of\": targetTitle\n\t\t\t\t},\n\t\t\t\t$tw.wiki.getModificationFields()\n\t\t\t);\n\t\t\t$tw.wiki.addTiddler(draftTiddler);\n\t\t}\n\t\tvar otherStoryTiddler = $tw.wiki.getTiddler(otherStory);\n\t\totherStoryList.splice(0 ,0, draftTitle);\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: otherStory},\n\t\t\totherStoryTiddler,\n\t\t\t{list:otherStoryList}\n\t\t));\n\t\treturn false;\n\t}\n\n\treturn true;\n});\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/_sq/Stories/EditTiddlerHook",
"tags": "",
"module-type": "startup",
"modified": "20200415212818072",
"created": "20170616091547338"
},
"$:/_sq/Stories/HistoriesList": {
"text": "",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/HistoriesList",
"tags": "",
"modified": "20200414145004336",
"list": "$:/_sq/Stories/Story2HistoryList $:/HistoryList",
"created": "20170610091606312"
},
"$:/_sq/Stories/icons/bars-empty.svg": {
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 100 100\" version=\"1.1\" x=\"0px\" y=\"0px\" class=\"tc-image-bars-empty tc-image-button\" width=\"40pt\" height=\"40pt\"><title>Single fold</title><desc>Created with Sketch.</desc><g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g stroke=\"#000000\"><rect stroke-width=\"2\" x=\"17\" y=\"17\" width=\"66\" height=\"66\" rx=\"2\"/><path d=\"M50.5,18.5 L50.5,80.789646\" stroke-linecap=\"round\" stroke-dasharray=\"2,3,2,3\"/></g></g></svg>",
"bag": "default",
"revision": "0",
"type": "image/svg+xml",
"title": "$:/_sq/Stories/icons/bars-empty.svg",
"tags": "",
"modified": "20200414145004334",
"created": "20170617203017607"
},
"$:/_sq/Stories/icons/bars.svg": {
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\" class=\"tc-image-bars tc-image-button\" width=\"20\" height=\"20\" ><path d=\"M41.667,0h-37.5C0,0,0,0,0,4.167v91.667C0,100,0,100,4.167,100h37.5c4.167,0,4.167,0,4.167-4.167V4.167 C45.833,0,45.833,0,41.667,0z M95.833,0h-37.5c-4.167,0-4.167,0-4.167,4.167v91.667c0,4.167,0,4.167,4.167,4.167h37.5 C100,100,100,100,100,95.833V4.167C100,0,100,0,95.833,0z\"/></svg>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/icons/bars.svg",
"modified": "20200414145004333",
"created": "20170608202154511"
},
"$:/_sq/Stories/icons/divert-left.svg": {
"text": "<svg class=\"tc-image-button\" x=\"0px\" y=\"0px\" width=\"30pt\" height=\"30pt\" viewBox=\"0 0 100 125\" ><path d=\"M7.197,44.697l27.5-27.5c2.929-2.929,7.678-2.929,10.607,0c2.929,2.929,2.929,7.678,0,10.607L30.607,42.5H70 h0c5.118,0,10.237,1.953,14.142,5.858c7.81,7.81,7.81,20.474,0,28.284c-2.929,2.929-7.678,2.929-10.607,0 c-2.929-2.929-2.929-7.678,0-10.607c1.953-1.953,1.953-5.118,0-7.071C72.559,57.988,71.28,57.5,70,57.5h0v0H30.607l14.697,14.697 c2.929,2.929,2.929,7.678,0,10.607c-2.929,2.929-7.678,2.929-10.607,0L16.036,64.142l-8.839-8.839 C4.268,52.374,4.268,47.626,7.197,44.697z\"/></svg>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/icons/divert-left.svg",
"modified": "20200414145004330",
"created": "20170609061834078"
},
"$:/_sq/Stories/icons/divert-right.svg": {
"text": "<svg class=\"tc-image-button\" x=\"0px\" y=\"0px\" width=\"30pt\" height=\"30pt\" viewBox=\"0 0 100 125\" ><path d=\"M92.803,44.697l-27.5-27.5c-2.929-2.929-7.678-2.929-10.607,0c-2.929,2.929-2.929,7.678,0,10.607 L69.393,42.5H30h0c-5.118,0-10.237,1.953-14.142,5.858c-7.81,7.81-7.81,20.474,0,28.284c2.929,2.929,7.678,2.929,10.607,0 c2.929-2.929,2.929-7.678,0-10.607c-1.953-1.953-1.953-5.118,0-7.071C27.441,57.988,28.72,57.5,30,57.5h0v0h39.393L54.697,72.197 c-2.929,2.929-2.929,7.678,0,10.607s7.678,2.929,10.607,0l18.661-18.661l8.839-8.839C95.732,52.374,95.732,47.626,92.803,44.697z\"/></svg>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/icons/divert-right.svg",
"modified": "20200414145004328",
"created": "20170609061824401"
},
"$:/_sq/Stories/LinkKeybindings": {
"text": "$tw.hooks.addHook('th-navigating', function(event) {\n\t//override core behaviour when shift key was used\n\tif( ((event.event && event.event.shiftKey) || (event.shiftKey && event)) && event.navigateTo) {\n\t\tvar stories = $tw.wiki.getTiddlerList('$:/_sq/Stories/StoriesList');\n\t\tvar node = event.navigateFromNode;\n\t\tvar thisStory = node.getVariable(\"tv-story-list\");\n\t\tvar otherStory = (stories[0] == thisStory)? stories[1] : stories[0];\t\n\t\tvar storyList = $tw.wiki.getTiddlerList(otherStory);\n\t\tvar slot = storyList.indexOf(event.navigateTo);\n\t\t\n\t\tif(slot < 0){\n\t\t\tif($tw.wiki.getTiddlerText(\"$:/config/Navigation/openLinkFromOutsideRiver\") === \"bottom\") {\n\t\t\t\n\t\t\t\tstoryList.splice(storyList.length, 0, event.navigateTo);\n\t\t\t} else {\n\t\t\t\tstoryList.splice(0, 0, event.navigateTo);\n\t\t\t}\n\t\t\tvar storyTiddler =\t$tw.wiki.getTiddler(otherStory);\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t\t{title: otherStory},\n\t\t\t\tstoryTiddler,\n\t\t\t\t{list:storyList}\n\t\t\t));\n\t\t}\n\t\tvar histories = $tw.wiki.getTiddlerList('$:/_sq/Stories/HistoriesList');\n\t\tvar thisHistory = node.getVariable(\"tv-history-list\");\n\t\tvar otherHistory = (histories[0] == thisHistory) ? histories[1] : histories[0];\t\t\n\t\t$tw.wiki.addToHistory(event.navigateTo,event.navigateFromClientRect, otherHistory); \n\t\tif($tw.wiki.getTiddlerText(\"$:/config/_sq/Stories/story2\") === \"no\") {\n\t\t\t$tw.wiki.setText(\"$:/config/_sq/Stories/story2\",undefined,undefined,\"yes\",undefined);\n\t\t}\n\t\tevent.navigateTo = false;\n\t}\n\treturn event;\n});",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/_sq/Stories/LinkKeybindings",
"tags": "",
"module-type": "startup",
"modified": "20200422065240983",
"created": "20170610071940508"
},
"$:/_sq/Stories/startup-actions": {
"text": "<$action-deletetiddler $tiddler=\"$:/_sq/Stories/Story2HistoryList\"/>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/startup-actions",
"tags": "$:/tags/StartupAction/Browser",
"modified": "20200417172054199",
"created": "20200417171756341"
},
"$:/_sq/Stories/Stories.css": {
"created": "20170608102837192",
"text": "\\define if-fluid-fixed(text,disableText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n</$reveal>\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"nomatch\" text=\"fluid-fixed\">\n$disableText$\n</$reveal>\n\\end\n\n\\define if-two-stories(twoStoryCommon, twoStorySidebar twoStoryNoSidebar, oneStoryText)\n<$reveal default=\"yes\" type=\"match\" text={{{[{$:/_sq/Stories/Story2StoryList!!list}length[]match[0]then[no]] ~[{$:/config/_sq/Stories/story2}]}}}>\n$twoStoryCommon$\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n$twoStorySidebar$\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$twoStoryNoSidebar$\n</$reveal>\n</$reveal>\n<$reveal default=\"yes\" type=\"nomatch\" text={{{[{$:/_sq/Stories/Story2StoryList!!list}length[]match[0]then[no]] ~[{$:/config/_sq/Stories/story2}]}}}>\n$oneStoryText$\n</$reveal>\n\\end\n\n\n<pre>\n\n.tc-page-container.tc-page-view-zoomin .tc-storyview-zoomin-tiddler {\n\twidth: 100%;\n\tposition: relative;\n}\n\n.tc-btn-storytwotoggle {\n\tpadding:0px;\n}\n\n.tc-btn-storytwotoggle img {\n\twidth: 30px;\n\theight: 30px;\n}\n\n.tc-sidebar-lists .tc-btn-storytwotoggle-bars {\n\tfont-size: 1.5em;\n}\n\n.tc-sidebar-lists .tc-btn-storytwotoggle-bars svg {\n\tfill: #aaa;\n}\n\n.tc-story-river .sq-button-divert-left{\n\tdisplay: none;\n}\n\n.sq-story-rivertwo-scrollable::-webkit-scrollbar{width:10px}\n\n.sq-story-rivertwo-scrollable::-webkit-scrollbar-thumb{background:#a5a5a5;border-radius:10px}\n\n.sq-story-rivertwo-scrollable::-webkit-scrollbar-thumb:hover{background:#6f6f6f}\n\n.sq-story-rivertwo-scrollable::-webkit-scrollbar-thumb:active{background:#333}\n\n\t.tc-sidebar-tab-open.sq-sidebar-open .tc-btn-invisible.tc-btn-mini {\n\t\tpadding: 0 0.2em;\n\t}\n\n\t.tc-sidebar-tab-open.sq-sidebar-open .tc-sidebar-tab-open-item {\n\t\tpadding: 0.1em;\n\t}\n\t\n\thtml body.tc-body .tc-sidebar-tab-open.sq-sidebar-open a.tc-tiddlylink {\n\t\tfont-weight: 400;\n\t}\n\n.tc-sidebar-tab-open.sq-sidebar-open a.tc-tiddlylink {\n\tcolor:<<color very-muted-foreground>>;\n}\n\n.tc-sidebar-tab-open.sq-sidebar-open a.tc-tiddlylink:hover {\n\tcolor: <<color sidebar-tiddler-link-foreground-hover>>;\n}\n\n<<if-two-stories twoStoryCommon:\"\"\"\n@media (min-width: {{$:/_sq/Stories/config/twostorybreakpoint}}) {\n.sq-story-rivertwo-scrollable {\n\tposition: fixed;\n\ttop: calc(1em + {{$:/themes/tiddlywiki/vanilla/metrics/storytop}});\n\tbottom: 0;\n}\n\n.tc-story-river.sq-story-rivertwo {\n\tmargin-right: 1em !important;\n\tmargin-left: 0;\n}\n\n.tc-story-river {\n\tfloat: left;\n\tmargin-right: 0;\n\tpadding-right: 0em;\n\tpadding-top: 0em;\n}\n\n.tc-story-river .sq-button-divert-right{\n\tdisplay:inline-block;\n}\n\n.tc-story-river .sq-button-divert-left{\n\tdisplay: none;\n}\n\n.tc-story-river.sq-story-rivertwo .sq-button-divert-left{\n\tdisplay:inline-block;\n}\n\n.tc-story-river.sq-story-rivertwo .sq-button-divert-right{\n\tdisplay: none;\n}\n\n.sq-storydropzone {\n\tpadding: 0.5em;\n\tborder:1px solid #bbb;\n\tcolor: #ccc;\n\ttext-align: center;\n\tposition: relative;\n\twidth: calc(100% - 45px);\n\t-moz-box-shadow: inset 0 0 10px #ccc;\n\t-webkit-box-shadow: inset 0 0 10px #ccc;\n\tbox-shadow: inset 0 0 10px #ccc;\n}\n\n.sq-storydropzone-newtiddlerbutton {\n\twidth: 40px;\n\tfloat: right;\n\tpadding: 0.2em 0.5em 0.5em 0.5em;\n\tmargin-top: 0em;\n\tmargin-right: 0.2em;\n}\n\n}\n\"\"\" twoStorySidebar:\"\"\"\n\n@media (min-width: {{$:/_sq/Stories/config/twostorybreakpoint}}) {\n.tc-story-river {\n\twidth: calc((100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}} - {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}})/2);\n}\n\n.sq-storydropzone {\n\tpadding: 0.5em;\n\tborder:1px solid #bbb;\n\tcolor: #ccc;\n\ttext-align: center;\n}\n\n.sq-story-rivertwo-scrollable {\n\twidth: calc((98% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}} - {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}})/2);\n}\n}\n\n@media (min-width: {{$:/_sq/Stories/config/twostorybreakpoint}}) and (max-width: {{$:/_sq/Stories/config/sidebaroverlaybreakpoint}}) {\n\t.tc-story-river {\n\t\twidth:calc((100% - 0px - 60px)/2);\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tz-index:999;\n\t\tbackground:#eee;\n\t\tborder-left: 1px solid #ddd;\n\t}\n\n\t.sq-story-rivertwo-scrollable {\n\t\twidth: 49%;\n\t}\n\n}\n\n\"\"\" twoStoryNoSidebar:\"\"\"\n\n.tc-story-river.sq-story-rivertwo {\n\tpadding-right: 0.5em;\n}\n\n@media (min-width: {{$:/_sq/Stories/config/twostorybreakpoint}}) {\n.tc-story-river {\n\twidth: calc(49% - 1em);\n}\n\n.sq-story-rivertwo-scrollable {\n\twidth:calc((100% - 0px - 60px)/2);\n}\n\n\n\n\n}\n\n@media (min-width: {{$:/_sq/Stories/config/twostorybreakpoint}}) and (max-width: {{$:/_sq/Stories/config/sidebaroverlaybreakpoint}}) {\n\t.tc-sidebar-scrollable {\n\t\tdisplay:none;\n\t}\n}\n\n\"\"\" oneStoryText: \"\"\"\n.sq-twostoriesonly {\n\tdisplay: none;\n}\n\n.tc-story-river {\n\tpadding-top: 15px;\n}\n\n\"\"\"\n>>\n\n@media (max-width: {{$:/_sq/Stories/config/twostorybreakpoint}}) {\n\t.sq-twostoriesonly {\n\t\tdisplay: none;\n\t}\n\n\t.tc-btn-storytwotoggle {\n\t\tdisplay: none;\n\t}\n\n\t.sq-stories-disabled {\n\t\tdisplay: none;\n\t}\n\n<<if-two-stories twoStoryCommon:\"\"\"\n\n\t.tc-storytwo-river {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\twidth: auto;\n\t\tpadding-top: 15px;\n\t}\n\n\t.tc-story-river .sq-button-divert {\n\t\tdisplay: none;\n\t}\n\n\n\t.sq-story-rivertwo-scrollable {\n\t\tdisplay:none;\n\t}\n\n\n\"\"\" twoStorySidebar:\"\"\"\n\t.tc-story-river {\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tborder-left: 0;\n\t\tz-index: inherit;\n\t\tbackground: transparent;\n\t}\n\"\"\" twoStoryNoSidebar: \"\"\"\n\t.tc-story-river {\n\t\tpadding-right: 2em;\n\t}\n\"\"\"\n\n>>\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n.tc-story-river {\nmargin-right: 0;\n}\n}\n\n\n</pre>\n",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/Stories.css",
"tags": "$:/tags/Stylesheet",
"modified": "20200425174509233"
},
"$:/_sq/Stories/StoriesList": {
"text": "",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/StoriesList",
"tags": "",
"modified": "20200414145004320",
"list": "$:/_sq/Stories/Story2StoryList $:/StoryList",
"created": "20170610072420739"
},
"$:/_sq/Stories/Story2StoryList": {
"title": "$:/_sq/Stories/Story2StoryList",
"created": "20170615140314952",
"text": "",
"bag": "default",
"revision": "8",
"type": "text/vnd.tiddlywiki",
"modified": "20200425175456458",
"list": ""
},
"$:/_sq/Stories/Templates/RiverDropZone": {
"text": "\\define drop-actions()\n<$action-listops $tiddler=<<otherStoryList>> $subfilter=\"+[remove<actionTiddler>]\"/> \n<$action-navigate $to=<<actionTiddler>>/>\n\\end\n<$reveal state=\"$:/_sq/Stories/config/showRiverDropZones\" text=\"enable\" type=\"match\" default=\"disable\">\n<div class=\"sq-storydropzone-container sq-twostoriesonly\">\n\t<div class=\"sq-storydropzone-newtiddlerbutton tc-page-controls\">\n\t\t<$transclude tiddler=\"$:/core/ui/Buttons/new-tiddler\"/>\n\t</div>\n\t<div style=\"position: relative; \" class=\"sq-storydropzone sq-twostoriesonly\">\n\t\t<$set name=\"otherStoryList\" filter=\"[enlist{$:/_sq/Stories/StoriesList!!list}] -[<tv-story-list>]\" select=\"0\">\n\t\t<$droppable actions=<<drop-actions>>>\n\t\t\t<div class=\"tc-droppable-placeholder\">\n\t\t\t \n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\tDrop link here to open\n\t\t\t</div>\n\t\t</$droppable>\n\t\t</$set>\n\t</div>\n</div>\n</$reveal>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/Templates/RiverDropZone",
"tags": "$:/tags/AboveStory",
"modified": "20200417170915429",
"list-before": "$:/core/ui/PageTemplate/story",
"created": "20170609191118712"
},
"$:/_sq/Stories/Templates/Story2Template": {
"text": "\\whitespace trim\n<$reveal state=\"$:/config/_sq/Stories/story2\" type=\"match\" text=\"yes\" default=\"no\" retain=\"yes\" animate=\"no\" tag=\"section\" class=\"tc-story-river tc-storytwo-river sq-story-rivertwo\">\n\n<$navigator story=\"$:/_sq/Stories/Story2StoryList\" history=\"$:/_sq/Stories/Story2HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n<$scrollable class=\"sq-story-rivertwo-scrollable\" fallthrough=\"no\">\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/_sq/Stories/Story2StoryList]]\" history=\"$:/_sq/Stories/Story2HistoryList\" template=\"$:/core/ui/ViewTemplate\" editTemplate=\"$:/core/ui/EditTemplate\" storyview={{$:/_sq/Stories/config/Story2-storyview}}>\n\n<div>\n<$transclude/>\n</div>\n\n</$list>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</$scrollable>\n</$navigator>\n\n</$reveal>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/Templates/Story2Template",
"tags": "$:/tags/PageTemplate",
"modified": "20200425140654266",
"list-after": "$:/core/ui/PageTemplate/story",
"created": "20170608171610013"
},
"$:/_sq/Stories/Templates/StoryToggleMenu": {
"text": "<div class=\"sq-twostoriesonly\">\n<$reveal state=\"$:/config/_sq/Stories/story2\" type=\"nomatch\" text=\"no\" default=\"no\">\n<$button set=\"$:/config/_sq/Stories/story2\" setTo=\"no\" tooltip=\"Hide right column\" aria-label=\"\" class=\"tc-btn-invisible tc-btn-storytwotoggle\">{{$:/_sq/Stories/icons/bars-empty.svg}} </$button> Hide right column\n</$reveal>\n</div>\n<$reveal state=\"$:/config/_sq/Stories/story2\" type=\"match\" text=\"no\" default=\"no\">\n<$button set=\"$:/config/_sq/Stories/story2\" setTo=\"yes\" tooltip=\"Show right column\" aria-label=\"\" class=\"tc-btn-invisible tc-btn-storytwotoggle tc-btn-storytwotoggle-bars\">{{$:/_sq/Stories/icons/bars.svg}}</$button> <span class=\"sq-stories-disabled\">Show right column</span>\n</$reveal>\n",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/Templates/StoryToggleMenu",
"modified": "20200425133224298",
"created": "20170608172531552"
},
"$:/_sq/Stories/Templates/StoryTogglePageControl": {
"text": "<span class=\"sq-twostoriesonly\">\n\t<$reveal state=\"$:/config/_sq/Stories/story2\" type=\"nomatch\" text=\"no\" default=\"no\">\n\t\t<$button set=\"$:/config/_sq/Stories/story2\" setTo=\"no\" tooltip=\"Hide right column\" aria-label=\"\" class=\"tc-btn-invisible tc-btn-storytwotoggle\">{{$:/_sq/Stories/icons/bars-empty.svg}} </$button>\n\t</$reveal>\n</span>\n<$reveal state=\"$:/config/_sq/Stories/story2\" type=\"match\" text=\"no\" default=\"no\">\n\t<$button set=\"$:/config/_sq/Stories/story2\" setTo=\"yes\" tooltip=\"Show right column\" aria-label=\"\" class=\"tc-btn-invisible tc-btn-storytwotoggle\">{{$:/_sq/Stories/icons/bars.svg}}</$button>\n</$reveal>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/_sq/Stories/Templates/StoryTogglePageControl",
"tags": "$:/tags/PageControls",
"modified": "20200425133303133",
"description": "Show right column for second story",
"created": "20170617182141154",
"caption": "{{$:/_sq/Stories/icons/bars.svg}} Show right column"
},
"$:/_sq/Stories/widgets/action-addtohistory": {
"text": "/*\\\ntype: application/javascript\nmodule-type: widget\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar AddToHistoryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nAddToHistoryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nAddToHistoryWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nAddToHistoryWidget.prototype.execute = function() {\n\tthis.historyTitle = this.getAttribute(\"$history\",this.getVariable(\"tv-history-title\"));\n\tthis.newTitle = this.getAttribute(\"$title\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nAddToHistoryWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$historyTitle\"] || changedAttributes[\"$title\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nAddToHistoryWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.wiki.addToHistory(this.newTitle,{},this.historyTitle);\t\n\treturn true; // Action was invoked\n};\n\nexports[\"action-addtohistory\"] = AddToHistoryWidget;\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/_sq/Stories/widgets/action-addtohistory",
"tags": "",
"module-type": "widget",
"modified": "20200416234746904",
"created": "20200416232452797"
},
"$:/_sq/Stories/Story2HistoryList": {
"created": "20200425131030296",
"current-tiddler": "$:/plugins/sq/Stories",
"title": "$:/_sq/Stories/Story2HistoryList",
"type": "application/json",
"text": "[\n {\n \"title\": \"$:/config/Tiddlers/TitleLinks\",\n \"fromPageRect\": {\n \"top\": 249.296875,\n \"left\": 1230,\n \"width\": 183.515625,\n \"right\": 1413.515625,\n \"bottom\": 269.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerMacro\",\n \"fromPageRect\": {\n \"top\": 623.296875,\n \"left\": 1230,\n \"width\": 220.390625,\n \"right\": 1450.390625,\n \"bottom\": 643.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerMacro\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerMacro\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerEditMacro\",\n \"fromPageRect\": {\n \"top\": 319.296875,\n \"left\": 1230,\n \"width\": 245.53125,\n \"right\": 1475.53125,\n \"bottom\": 339.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerEditMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerEditMacro\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryToggleMenu\",\n \"fromPageRect\": {\n \"top\": 537.296875,\n \"left\": 1230,\n \"width\": 283.546875,\n \"right\": 1513.546875,\n \"bottom\": 557.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\",\n \"fromPageRect\": {\n \"top\": 297.296875,\n \"left\": 1230,\n \"width\": 326.734375,\n \"right\": 1556.734375,\n \"bottom\": 317.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryToggleMenu'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryToggleMenu\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryToggleMenu'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryToggleMenu\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerEditMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerEditMacro\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryToggleMenu'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryToggleMenu\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryToggleMenu'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryToggleMenu\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/Templates/StoryTogglePageControl'\"\n },\n {\n \"title\": \"$:/_sq/Stories/Templates/StoryTogglePageControl\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerEditMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerEditMacro\"\n },\n {\n \"title\": \"$:/core/ui/SideBar/Open\",\n \"fromPageRect\": {\n \"top\": 337.296875,\n \"left\": 1230,\n \"width\": 161.8125,\n \"right\": 1391.8125,\n \"bottom\": 357.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"Draft of '$:/core/ui/SideBar/Open'\"\n },\n {\n \"title\": \"$:/core/ui/SideBar/Open\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerEditMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerEditMacro\"\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/divertTiddlerEditMacro'\"\n },\n {\n \"title\": \"$:/_sq/Stories/divertTiddlerEditMacro\"\n },\n {\n \"title\": \"TiddlyBlink\"\n },\n {\n \"title\": \"Stories-overview\",\n \"fromPageRect\": {\n \"top\": 1035.921875,\n \"left\": 1190,\n \"width\": 101.6875,\n \"right\": 1291.6875,\n \"bottom\": 1054.921875,\n \"height\": 19\n }\n },\n {\n \"title\": \"$:/.giffmex/Customize.TiddlyBlink\",\n \"fromPageRect\": {\n \"top\": 735.625,\n \"left\": 107.5,\n \"width\": 145.171875,\n \"right\": 252.671875,\n \"bottom\": 755.625,\n \"height\": 20\n }\n },\n {\n \"title\": \"$:/.giffmex/meta/hack.tiddlyblink\",\n \"fromPageRect\": {\n \"top\": 757.625,\n \"left\": 107.5,\n \"width\": 129.59375,\n \"right\": 237.09375,\n \"bottom\": 777.625,\n \"height\": 20\n }\n },\n {\n \"title\": \"TiddlyBlink\",\n \"fromPageRect\": {\n \"top\": 161.296875,\n \"left\": 221.953125,\n \"width\": 71.859375,\n \"right\": 293.8125,\n \"bottom\": 181.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"TiddlyBlink\",\n \"fromPageRect\": {\n \"top\": 161.296875,\n \"left\": 221.953125,\n \"width\": 71.859375,\n \"right\": 293.8125,\n \"bottom\": 181.296875,\n \"height\": 20\n }\n },\n {\n \"title\": \"Stories-overview\",\n \"fromPageRect\": {}\n },\n {\n \"title\": \"Draft of 'Stories-overview'\"\n },\n {\n \"title\": \"Stories-overview\"\n },\n {\n \"title\": \"Draft of 'Stories-overview'\"\n },\n {\n \"title\": \"Stories-overview\"\n },\n {\n \"title\": \"Draft of 'Stories'\"\n },\n {\n \"title\": \"Plugin maker\",\n \"fromPageRect\": {\n \"top\": 481.34375,\n \"left\": 2259,\n \"width\": 80.890625,\n \"right\": 2339.890625,\n \"bottom\": 500.34375,\n \"height\": 19\n }\n },\n {\n \"title\": \"Draft of 'Plugin maker'\"\n },\n {\n \"title\": \"Plugin maker\"\n },\n {\n \"title\": \"Stories\",\n \"fromPageRect\": {\n \"top\": 296.84375,\n \"left\": 2259,\n \"width\": 41.453125,\n \"right\": 2300.453125,\n \"bottom\": 315.84375,\n \"height\": 19\n }\n },\n {\n \"title\": \"Plugin maker\",\n \"fromPageRect\": {\n \"top\": 501.34375,\n \"left\": 2259,\n \"width\": 80.890625,\n \"right\": 2339.890625,\n \"bottom\": 520.34375,\n \"height\": 19\n }\n },\n {\n \"title\": \"Draft of 'Plugin maker'\"\n },\n {\n \"title\": \"Plugin maker\"\n },\n {\n \"title\": \"Draft of 'Stories'\"\n },\n {\n \"title\": \"Stories\"\n },\n {\n \"title\": \"$:/_sq/Stories/config/Settings\",\n \"fromPageRect\": {\n \"top\": 360.171875,\n \"left\": 1245,\n \"width\": 182.21875,\n \"right\": 1427.21875,\n \"bottom\": 379.171875,\n \"height\": 19\n }\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/config/Settings'\"\n },\n {\n \"title\": \"$:/_sq/Stories/config/Settings\"\n },\n {\n \"title\": \"$:/_sq/Stories/config/Settings\",\n \"fromPageRect\": {\n \"top\": 360.171875,\n \"left\": 1245,\n \"width\": 182.21875,\n \"right\": 1427.21875,\n \"bottom\": 379.171875,\n \"height\": 19\n }\n },\n {\n \"title\": \"Draft of '$:/_sq/Stories/config/Settings'\"\n },\n {\n \"title\": \"$:/_sq/Stories/config/Settings\"\n },\n {\n \"title\": \"Draft of 'Stories'\"\n },\n {\n \"title\": \"Stories\"\n },\n {\n \"title\": \"Draft of 'Stories'\"\n },\n {\n \"title\": \"Stories\"\n },\n {\n \"title\": \"Draft of 'Stories'\"\n },\n {\n \"title\": \"$:/plugins/sq/Stories\",\n \"fromPageRect\": {\n \"top\": 463.734375,\n \"left\": 2321.1875,\n \"width\": 476.734375,\n \"right\": 2797.921875,\n \"bottom\": 482.734375,\n \"height\": 19\n }\n }\n]",
"modified": "20200425180934241"
},
"$:/core/ui/SideBar/Open": {
"text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n<$action-listops $tiddler=<<_otherStory>> $subfilter=\"-[<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n\\define open-tiddler-list()\n<div class=\"tc-sidebar-tab-open sq-sidebar-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n\\end\n\n\n''Left Column''\n<$set name=\"_otherStory\" filter=\"[enlist{$:/_sq/Stories/StoriesList!!list}] -[<tv-story-list>]\" select=\"0\">\n<<open-tiddler-list>>\n</$set>\n<div class=\"sq-twostoriesonly\">\n\n---\n\n''Right Column''\n<$set name=\"_otherStory\" value=<<tv-story-list>> >\n<$set name=\"tv-story-list\" filter=\"[enlist{$:/_sq/Stories/StoriesList!!list}] -[<tv-story-list>]\" select=\"0\">\n<$set name=\"tv-history-list\" filter=\"[enlist{$:/_sq/Stories/HistoriesList!!list}] -[<tv-history-list>]\" select=\"0\">\n<$navigator story=<<tv-story-list>> history=<<tv-history-list>> >\n<<open-tiddler-list>>\n</$navigator>\n</$set>\n</$set>\n</$set>\n\n</div>\n\n---\n\n<$transclude tiddler=\"$:/_sq/Stories/Templates/StoryToggleMenu\"/>",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"modified": "20200425133519499",
"created": "20170609174945253",
"caption": "{{$:/language/SideBar/Open/Caption}}"
},
"$:/config/_sq/Stories/story2": {
"text": "yes",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/config/_sq/Stories/story2",
"modified": "20200425145103899",
"created": "20170615081040584"
},
"$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
"text": "fluid-fixed",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
"tags": "tb",
"modified": "20200416185419828",
"created": "20200127172539001"
},
"$:/plugins/sq/Stories/settings": {
"created": "20170616185336118",
"text": "|[[Minimum width to show the second story|$:/_sq/Stories/config/twostorybreakpoint]] |<$edit-text tiddler=\"$:/_sq/Stories/config/twostorybreakpoint\" default=\"\" tag=\"input\"/> |\n|[[Minimum width to show non-overlapping sidebar|$:/_sq/Stories/config/sidebaroverlaybreakpoint]] |<$edit-text tiddler=\"$:/_sq/Stories/config/sidebaroverlaybreakpoint\" default=\"\" tag=\"input\"/> |\n|[[Open tiddlers at top or bottom of story when using divert button|$:/_sq/Stories/config/openLinkDivert]] | <$select tiddler=\"$:/_sq/Stories/config/openLinkDivert\" default=\"top\"><option value=\"top\">top</option><option value=\"bottom\">bottom</option></$select>|\n|<$link to=\"$:/_sq/Stories/config/showRiverDropZones\">Show dropzones above each story</$link>|<$checkbox tiddler=\"$:/_sq/Stories/config/showRiverDropZones\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"disable\"></$checkbox>|\n|[[Story view for second story|$:/_sq/Stories/config/Story2-storyview]]:|{{$:/_sq/Stories/config/snippets/viewswitcher}}|\n\n\n",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/sq/Stories/settings",
"tags": "$:/tags/ControlPanel/Appearance",
"modified": "20200425181057952",
"caption": "Two Story Layout"
}
}
}
{"tiddlers":{"$:/plugins/TheDiveO/FontAwesome/fonts/Font Awesome 5 Free Brands.css":{"title":"$:/plugins/TheDiveO/FontAwesome/fonts/Font Awesome 5 Free Brands.css","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* auto-imported from 'node_modules/@fortawesome/fontawesome-free' version 5.14.0 */\n@font-face {\n font-family: 'Font Awesome 5 Brands';\n font-style: normal;\n font-weight: normal;\n src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff');\n}\n\n.fab {\n font-family: 'Font Awesome 5 Brands';\n font-style: normal;\n font-weight: normal;\n}\n"},"$:/plugins/TheDiveO/FontAwesome/fonts/Font Awesome 5 Free Regular.css":{"title":"$:/plugins/TheDiveO/FontAwesome/fonts/Font Awesome 5 Free Regular.css","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* auto-imported from 'node_modules/@fortawesome/fontawesome-free' version 5.14.0 */\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 400;\n src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff');\n}\n\n.far {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 400;\n}\n"},"$:/plugins/TheDiveO/FontAwesome/fonts/Font Awesome 5 Free Solid.css":{"title":"$:/plugins/TheDiveO/FontAwesome/fonts/Font Awesome 5 Free Solid.css","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* auto-imported from 'node_modules/@fortawesome/fontawesome-free' version 5.14.0 */\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 900;\n src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff');\n}\n\n.fa, .fas {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 900;\n}\n"},"$:/plugins/TheDiveO/FontAwesome/history":{"title":"$:/plugins/TheDiveO/FontAwesome/history","created":"20140901110931199","modified":"20200718121750640","type":"text/vnd.tiddlywiki","text":"* ''1.2.21'' -- fixes font files not having been updated correctly.\n\n* ''1.2.20''\n** updates to Font Awesome Free 5.13.1.\n** refactors update mechanism to finally rely on the @fortawesome/fontawesome-free npm module, as the module finally contains the required meta information.\n\n* ''1.2.18'' -- updates to Font Awesome Free 5.8.2.\n\n* ''1.2.17'' -- updates to Font Awesome Free 5.8.1, adding several new categories, such as \"alert\", \"beverage\", \"energy\", et cetera. However, most of these new categories simply rehash existing icons, so there are only few really new icons to be found in this release.\n\n* ''1.2.16'' -- updates to Font Awesome Free 5.7.2.\n\n* ''1.2.15'' -- updates to Font Awesome Free 5.6.3. This adds new categories, such as \"autumn\", \"holliday\" and \"halloween\" with new icons, as well as updating existing categories with additional icons.\n\n* ''1.2.14''\n** updates to Font Awesome Free 5.3.1.\n** fixes crash in `--update` command when glyph in icons.json lacks a search terms property.\n\n* ''1.2.13''\n** switches to fetching the most recent Font Awesome Free download URL via GitHub API; this way, we can get rid of the (fine!) Puppeteer package and a truckload of update overhead.\n** npm package maintenance update: move development dependencies out of the general dependencies.\n\n* ''1.2.12'' -- updates to Font Awesome Free 5.2.0. This adds new category packs for \"automotive\", \"medical\", \"education\", and \"maps\".\n\n* ''1.2.11'' -- updates to Font Awesome Free 5.1.11.\n\n* ''1.2.10'' (1.2.9)\n** updates to Font Awesome 5.1.0, which brings new categories \"design\", \"emoji\" and \"travel\", and their icons -- as well as some updates and icon additions.\n** updates the update mechanism to work with the new 5.1.x packaging.\n\n* ''1.2.8'' -- updates to Font Awesome Free 5.0.13. This brings three new catogies: animals, buildings, and mathematics.\n\n* ''1.2.7'' -- updates to Font Awesome Free 5.0.12 -- they really do rapid updates, do they?! Glad that updating this plugin is automated...\n\n* ''1.2.6'' -- updates to Font Awesome Free 5.0.11.\n\n* ''1.2.5'' -- updates to Font Awesome Free 5.0.10.\n\n* ''1.2.4''\n** adds unicode code point info to the cheatsheet.\n\n* ''1.2.3''\n** makes TW5FontAwesome plugin available as npm package `tw5-fontawesome`.\n** adds ~ThirdFlow plugin as npm dependency `tw5-thirdflow`.\n\n* ''1.2.2''\n** updates to Font Awesome Free 5.0.9.\n** adds new categories //Charity//, //Chat//, and //Moving//.\n** adds new \"Font Awesome 5\" tab to the [[Control Panel|$:/ControlPanel]] that allows customizing the plugin: enable/disable internal and external link styling.\n\n* ''1.2.1''\n** adds missing category information.\n** adds automated update of category information from the Font Awesome 5 web site, as part of the normal update process:\n*** `npm run update` updates only if there is a newer version of Font Awesome 5 Free available from https://fontawesome.com/\n*** `npm run forceupdate` updates unconditionally.\n\n* ''1.2.0''\n** updates to Font Awesome Free 5.0.8.\n** adds category filtering to the cheatsheet.\n** adds Font Awesome 5 category meta data.\n** brings a new (fully) automatic update and release mechanism:\n*** use `$ npm run update-fontawesome` to update the development files to the newest Font Awesome version that is available online.\n*** use `$ npm run release` to create the plugin release file(s).\n** upgrades to most recent version of the [[ThirdFlow|http://thediveo.github.io/ThirdFlow/]] plugin: this comes with a new automated release mechanism.\n** refactors development command `--update-fontawesome` to directly download the most recent Font Awesome 5 Free package .zip from https://fontawesome.com. The only optional parameter to this command is `force` which forces re-updating, even if the font currently installed in the dev wiki is the same version as the one downloaded.\n** upgrades ThirdFlow plugin and now uses the new automated release file generation mechanism.\n\n* ''1.1.2''\n** fixes ~TiddlyWiki-internal links to system tiddlers not showing the gear symbol in the tiddler editor preview pane.\n\n* ''1.1.1''\n** upgrades to Font Awesome 5.0.4.\n** adds update/import command to ~FontAwesome 5 demo ~TiddlyWiki to update ~~from a Font Awesome zip package~~ [//online//]. Use `--update-fontawesome` when running the plugin development ~TiddlyWiki under Node.js.\n*** The `--update-fontawesome` command ~~expects the (path and) name of a Font Awesome zip package from which it will then update itself~~ [//has no parameters, or alternatively a single parameter `force`//]. ~~There is no need to unpack the zip package.~~ For instance:<div><strike>\n\n```bash\n$ tiddlywiki editions/develop --verbose --update-fontawesome ~/Downloads/fontawesome-free-5.0.2-zip --server 8080 $:/core/save/all text/plain text/html\n```\n\n</strike></div>\n*** If for some reason you need to re-update from the same Font Awesome zip package, specify an additional `force` parameter after the zip package file name parameter. For instance:<div><strike>\n\n```bash\n$ tiddlywiki editions/develop --verbose --update-fontawesome ~/Downloads/fontawesome-free-5.0.2-zip force --server 8080 $:/core/save/all text/plain text/html\n```\n</strike></div>\n* ''1.1.0''\n** upgrades to Font Awesome 5.0.2.\n** upgrades user macros to allow to specify the Font Awesome font family: `fas` (//Font Awesome Solid//), `far` (//Font Awesome Regular//), and `fab` (//Font Awesome Brands//).\n** upgrades stylesheets to new Font Awesome font mess, introduces [[$:/plugins/TheDiveO/FontAwesome/macros/css settings]] shorthand macros to avoid lengthy CSS properties assignments in CSS rules using Font Awesome.\n* ''1.0.7''\n** fix overly greedy image URL adornments, so that they don't apply to TW5-internal images. Now, an internal [[tree.jpeg]] doesn't get adornment, while [[http://thediveo.github.io/TW5FontAwesome/fa-flag.png]] still does, so the type of document can be glanced quickly.\n** small visual improvement to `fa-lbadge` which adds a small right margin to the badge, so that the adjacent text doesn't seem to visually collide with the badge anymore.\n* ''1.0.6''\n** link adornments for image URLs (`.jpg`/`.jpeg`, `.png`, `.gif`, `.tif`/`.tiff`)\n* ''1.0.5''\n** maintenance: upgrade ThirdFlow plugin to 1.1.11.\n* ''1.0.4''\n** improved display of link adornments by removing the link underlining from the adornments.\n** fixed CSS class name bug in `fa-lbox` macro. Also added new `fa-lbadge` macro. Added documentation.\n** oh, the magic of the `list-after` field, when applied to CSS tiddlers, avoids overuse of CSS `!important` declarations.\n\n* ''1.0.3''\n** fixed CSS to ensure that our embedded Font Awesome font always takes precendence over any system-installed Font Awesome font. This ensures a consistent user experience, especially when the local Font Awesome would be an older version.\n\n* ''1.0.2''\n** fixes base64 encoding of the embedded Font Awesome woff.\n** updated documentation with a warning about system-installed fonts taking precedence.\n** updated instructions on how to update the embedded font yourself.\n\n* ''1.0.1''\n** incorporates recent Font Awesome 4.7.0.\n** CSS updated to 4.7.0 too.\n** development version contains updated Third Flow plugin.\n\n* ''1.0.0''\n** never released.\n\n* ''0.9.2-beta''\n** stable beta release with Font Awesome 4.2.0.\n\n* ''v0.0.1-beta1''\n** initial plugin release.\n"},"$:/plugins/TheDiveO/FontAwesome/icon":{"title":"$:/plugins/TheDiveO/FontAwesome/icon","created":"20140901103643546","modified":"20140901123044951","tags":"$:/tags/Image","type":"text/vnd.tiddlywiki","text":"<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path \n d=\"m 13.75,0 -11.71875,6.875 0,13.75 11.71875,6.875 11.71875,-6.875 0,-13.75 L 13.75,0 z M 6.28125,5.78125 c 0.3579097,1.42e-5 0.6530496,0.1218163 0.90625,0.375 0.2531946,0.2532114 0.4062468,0.5796012 0.40625,0.9375 -3.2e-6,0.4864625 -0.2240993,0.8370553 -0.65625,1.09375 l 0,12.84375 c -2.6e-6,0.08791 -0.029668,0.15448 -0.09375,0.21875 -0.064087,0.06427 -0.1620941,0.09375 -0.25,0.09375 l -0.625,0 c -0.08791,-1e-6 -0.1859173,-0.02948 -0.25,-0.09375 C 5.6546643,21.18573 5.6249987,21.119157 5.625,21.03125 l 0,-12.84375 C 5.1924761,7.9308053 4.9999994,7.5802125 5,7.09375 4.9999994,6.7358512 5.1216167,6.4094614 5.375,6.15625 5.6283811,5.9030663 5.9233364,5.7812642 6.28125,5.78125 z m 6.6875,1.3125 c 0.722833,1.29e-5 1.403139,0.085316 2.03125,0.28125 0.628089,0.1959592 1.367727,0.4764702 2.21875,0.875 0.256694,0.1281803 0.53739,0.2187616 0.875,0.21875 0.364546,1.16e-5 0.758471,-0.076903 1.1875,-0.21875 0.428999,-0.1418231 0.811026,-0.2931062 1.125,-0.46875 0.313942,-0.1756193 0.594637,-0.3581524 0.875,-0.5 0.28033,-0.1418222 0.474573,-0.1874871 0.5625,-0.1875 0.175429,1.29e-5 0.340379,0.059159 0.46875,0.1875 0.128335,0.1283659 0.187481,0.2616962 0.1875,0.4375 l 0,7.75 c -1.9e-5,0.168803 -0.04062,0.283957 -0.125,0.375 -0.08442,0.09105 -0.223803,0.186697 -0.40625,0.28125 -1.45198,0.78379 -2.709891,1.187503 -3.75,1.1875 -0.412222,3e-6 -0.828017,-0.07008 -1.25,-0.21875 -0.422009,-0.148665 -0.782943,-0.324365 -1.09375,-0.5 -0.310829,-0.175628 -0.686986,-0.351512 -1.15625,-0.5 C 14.249466,15.94527 13.743089,15.875004 13.25,15.875 c -1.296838,4e-6 -2.850298,0.514176 -4.6875,1.5 -0.1148759,0.06095 -0.2359002,0.09375 -0.34375,0.09375 -0.1758202,3e-6 -0.3091502,-0.09039 -0.4375,-0.21875 -0.1283567,-0.12835 -0.1875032,-0.26205 -0.1875,-0.4375 l 0,-7.53125 c -3.2e-6,-0.2164353 0.1030684,-0.4073566 0.3125,-0.5625 0.1418315,-0.094545 0.3893527,-0.2417266 0.78125,-0.4375 1.593792,-0.8107376 3.03169,-1.1874871 4.28125,-1.1875 z m 4.4375,1.9375 c -0.342706,0.1226406 -0.355438,0.656233 -0.5,1.375 -0.223336,-0.06073 -0.456025,-0.114193 -0.6875,-0.125 -0.319018,-0.021 -0.822172,0.073 -1.1875,0.0625 -0.365324,-0.0105 -1.089266,-0.319558 -1.6875,-0.25 -0.240525,0.02958 -0.495457,0.05507 -0.71875,0.15625 -0.136605,0.0619 -0.307097,0.253524 -0.40625,0.28125 -0.999033,0.2793 -2.6450261,0.290617 -2.3125,-1.21875 0.02589,-0.1159319 0.051471,-0.2239389 0,-0.25 -0.06413,-0.032479 -0.11842,0.018948 -0.15625,0.09375 -0.5817319,1.263211 0.450231,2.090082 1.625,2.09375 0.368882,-0.02847 0.188339,-0.02825 0.53125,-0.09375 l 0,0.0625 c -0.02423,0.418425 0.151498,0.773091 0.5,1 -0.159883,0.455791 -0.470574,0.831401 -0.6875,1.25 0.08154,0.520418 0.625493,1.213538 0.84375,1.3125 0.19213,0.08713 0.590499,0.108967 0.6875,-0.03125 0.03464,-0.06594 0.03819,-0.208665 0,-0.28125 0.164063,0.181767 0.379948,0.409467 0.59375,0.53125 0.128025,0.06105 0.26257,0.120068 0.40625,0.125 l 0.15625,-0.03125 c 0.09128,-0.01967 0.220122,-0.01257 0.28125,-0.09375 0.06906,-0.117457 0.0042,-0.445257 -0.28125,-0.46875 -0.285459,-0.02351 -0.487565,-0.141306 -0.75,-0.53125 -0.216207,-0.376982 0.06825,-0.879067 0.15625,-1.25 0.451569,0.07267 0.885787,0.123856 1.34375,0.125 0.198682,-0.0101 0.397908,-0.02487 0.59375,-0.0625 0.06247,0.159574 0.248509,0.592654 0.25,0.71875 0.0042,0.355223 -0.119979,0.738597 -0.0625,1.09375 0.03593,0.104625 -0.01675,0.27314 0.1875,0.28125 0.122159,0.0062 0.03564,0.02295 0.21875,0.03125 l 0.1875,0 c 0.201842,0.338685 0.353672,0.332318 0.75,0.34375 L 17.375,15.25 c 0.06687,-0.02489 0.146577,-0.02959 0.1875,-0.09375 0.133768,-0.194285 -0.220263,-0.284732 -0.34375,-0.5 -0.123507,-0.215248 -0.635898,-1.387969 -0.25,-1.71875 0.385924,-0.330776 0.809257,-0.471475 0.96875,-0.78125 0.06907,-0.139714 0.138021,-0.279525 0.15625,-0.4375 0.09397,0.07799 0.154815,0.152169 0.28125,0.15625 0.334451,0.02101 0.632038,-0.392722 0.78125,-0.78125 0.07973,-0.238471 0.140218,-0.485838 0.125,-0.71875 -0.04092,-0.4488514 0.01685,-0.9204038 0.375,-1.21875 C 19.302812,9.334652 18.96272,9.5357952 18.5625,9.59375 18.341438,9.5266203 18.109109,9.4905105 17.875,9.5 17.760279,9.3505649 17.607384,9.0636657 17.40625,9.03125 z m -4.75,4.34375 c -0.01157,0.166727 -0.02255,0.305428 0.03125,0.46875 0.163898,0.134904 0.380252,0.35428 0.53125,0.5 -0.082,-0.02263 -0.235596,-0.0612 -0.3125,-0.03125 L 12.84375,14.28125 12.8125,14.25 c -0.108862,-0.1172 -0.395316,-0.310466 -0.34375,-0.5 0.04127,-0.131581 0.125136,-0.250383 0.1875,-0.375 z\" transform=\"scale(4.6545455,4.6545455)\"\n/>\n </g>\n</svg>"},"$:/plugins/TheDiveO/FontAwesome/license":{"title":"$:/plugins/TheDiveO/FontAwesome/license","created":"20140901105404058","modified":"20170223103858754","type":"text/vnd.tiddlywiki","text":"This plugin is licensed as follows:\n\n* Font Awesome font license: [[SIL OFL 1.1|http://scripts.sil.org/OFL]].\n* Font Awesome CSS and LESS files licenses: [[MIT License|http://opensource.org/licenses/mit-license.html]].\n* everything else in this plugin is (c) by TheDiveO and licensed under the [[MIT License|http://opensource.org/licenses/mit-license.html]]."},"$:/plugins/TheDiveO/FontAwesome/macros/css settings":{"title":"$:/plugins/TheDiveO/FontAwesome/macros/css settings","created":"20171230210524160","modified":"20171230211107336","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define fa-plugin-font-solid()\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 900; \n\\end\n\n\\define fa-plugin-font-regular()\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 400; \n\\end\n\n\\define fa-plugin-font-brands()\n font-family: 'Font Awesome 5 Brands';\n font-style: normal;\n font-weight: normal; \n\\end\n"},"$:/plugins/TheDiveO/FontAwesome/macros/fa/doc":{"title":"$:/plugins/TheDiveO/FontAwesome/macros/fa/doc","created":"20140831145557569","modified":"20171230205047837","type":"text/vnd.tiddlywiki","text":"Convenience macros to typeset symbols from Font Awesome.\n\n;`fa-lbox` //glyph//:\"fa-flag\" //fam//:\"fas\"\n: typesets the Font Awesome glyp (defaults to `fa-flag` glyph) in a gray box, and pulls it to the left.\n: As Font Awesome 5.0 has broken up the single 4.x font into multiple fonts, this macro now sports a second optional parameter for setting the font family. Allowed values are `fas` (for //Font Awesome Solid//), `far` (for //Font Awesome Regular//), and finally `fab` (for //Font Awesome Brands//).\n\n;`fa-lbadge` //glyph//:\"fa-flag\"\n: typesets the Font Awesome glyph (defaults to `fa-flag` glyph) in inverse, on a round badge. Also pulls the badge with the icon to the left.\n: As Font Awesome 5.0 has broken up the single 4.x font into multiple fonts, this macro now sports a second optional parameter for setting the font family. Allowed values are `fas` (for //Font Awesome Solid//), `far` (for //Font Awesome Regular//), and finally `fab` (for //Font Awesome Brands//).\n\n;`fa-clear`\n: convenience macro that inserts an empty HTML `div` element with styling `clear:both`. Use this before multiple `fa-lbox` and `fa-lbadge` macros to avoid them piling up from left to right."},"$:/plugins/TheDiveO/FontAwesome/macros/fa":{"title":"$:/plugins/TheDiveO/FontAwesome/macros/fa","created":"20140831145445334","modified":"20171230204202514","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define fa-lbox(glyph:\"fa-flag\",fam:\"fas\")\n<i class=\"$fam$ fa-2x pull-left fa-border $glyph$\"></i>\n\\end\n\n\\define fa-lbadge(glyph:\"fa-flag\",fam:\"fas\")\n<span class=\"fa-stack fa-lg fa-pull-left\" style=\"margin-right: .3em;\"><i class=\"fas fa-circle fa-stack-2x\"></i><i class=\"$fam$ fa-stack-1x fa-inverse $glyph$\"></i></span>\n\\end\n\n\\define fa-clear()\n<div style=\"clear:both;\"/>\n\\end\n"},"$:/plugins/TheDiveO/FontAwesome/macros/global-macros":{"title":"$:/plugins/TheDiveO/FontAwesome/macros/global-macros","created":"20180328184036630","modified":"20180328191101221","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define fa5-cfgpath(cfg) $:/config/fa5/$cfg$\n\n\\define fa5-cfgfilterexpr() [<cfg>get[text]] [[yes]] +[first[]prefix[yes]]"},"$:/plugins/TheDiveO/FontAwesome/readme":{"title":"$:/plugins/TheDiveO/FontAwesome/readme","created":"20140901105307611","modified":"20180112190527729","type":"text/vnd.tiddlywiki","text":"This plugin adds support for Font Awesome to your ~TiddlyWiki 5. It embeds the [[Font Awesome|http://fontawesome.io/]] within this plugin, so you don't need to install this font in your operating system. You may, but the //embedded// Font Awesome will take precedence to ensure a consistent user experience.\n\nTo install this plugin in your own ~TiddlyWiki(s), simply drop this [[FontAwesome plugin|$:/plugins/TheDiveO/FontAwesome]] onto your own ~TiddlyWiki(s): this will then import it."},"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/FontAwesome":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/FontAwesome","created":"20170227162302202","list-after":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks","modified":"20180328191153542","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<$set name=\"cfg\" value=<<fa5-cfgpath \"decorate-wk-extlinks\">> >\n<$list filter=<<fa5-cfgfilterexpr>> >\n\na[href^=\"http://fontawesome.io/\"].tc-tiddlylink-external:before,\na[href^=\"http://fontawesome.com/\"].tc-tiddlylink-external:before,\na[href^=\"https://fontawesome.io/\"].tc-tiddlylink-external:before,\na[href^=\"https://fontawesome.com/\"].tc-tiddlylink-external:before {\n <<fa-plugin-font-brands>>\n content: '\\f425\\202f' !important;\n display: inline-block;\n}\n\n</$list>\n</$set>"},"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/GitHub":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/GitHub","created":"20170223102202986","list-after":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks","modified":"20180328191203844","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<$set name=\"cfg\" value=<<fa5-cfgpath \"decorate-wk-extlinks\">> >\n<$list filter=<<fa5-cfgfilterexpr>> >\n\na[href^=\"http://\"][href*=\"github.com\"]:before {\n <<fa-plugin-font-brands>>\n font-size: 90%;\n content: '\\f09b\\202f';\n}\n\n</$list>\n</$set>"},"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/Wikipedia":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/Wikipedia","created":"20170223100306336","modified":"20180328191215033","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<$set name=\"cfg\" value=<<fa5-cfgpath \"decorate-wk-extlinks\">> >\n<$list filter=<<fa5-cfgfilterexpr>> >\n\na[href^=\"http://\"][href*=\".wikipedia.org\"]:before {\n <<fa-plugin-font-brands>>\n font-size: 90%;\n content: '[\\f266]\\202f';\n}\n\n</$list>\n</$set>"},"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/doctypes":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks/doctypes","created":"20170301201914393","list-after":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks","modified":"20180328191142557","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<$set name=\"cfg\" value=<<fa5-cfgpath \"decorate-extdoclinks\">> >\n<$list filter=<<fa5-cfgfilterexpr>> >\n\na[href$=\".pdf\"].tc-tiddlylink-external:before {\n <<fa-plugin-font-regular>>\n content: '\\f1c1\\202f';\n display: inline-block;\n}\n\na[href$=\".gz\"].tc-tiddlylink-external:before, \na[href$=\".zip\"].tc-tiddlylink-external:before,\na[href$=\".7z\"].tc-tiddlylink-external:before {\n <<fa-plugin-font-regular>>\n content: '\\f1c6\\202f';\n display: inline-block;\n}\n\na[href$=\".jpg\"].tc-tiddlylink-external:before,\na[href$=\".jpeg\"].tc-tiddlylink-external:before,\na[href$=\".png\"].tc-tiddlylink-external:before,\na[href$=\".gif\"].tc-tiddlylink-external:before,\na[href$=\".tif\"].tc-tiddlylink-external:before,\na[href$=\".tiff\"].tc-tiddlylink-external:before {\n <<fa-plugin-font-regular>>\n content: '\\f1c5\\202f';\n display: inline-block;\n}\n\n</$list>\n</$set>"},"$:/plugins/TheDiveO/FontAwesome/styles/extlinks":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/extlinks","created":"20170223100043117","modified":"20180328191133975","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<$set name=\"cfg\" value=<<fa5-cfgpath \"decorate-extlinks\">> >\n<$list filter=<<fa5-cfgfilterexpr>> >\n\na[href^=\"http://\"]:before {\n <<fa-plugin-font-solid>>\n font-size: 80%;\n content: '\\f35d\\202f';\n display: inline-block;\n}\n\na[href^=\"https://\"]:before {\n <<fa-plugin-font-solid>>\n font-size: 80%;\n content: '\\f023\\202f';\n display: inline-block;\n}\n\n</$list>\n</$set>"},"$:/plugins/TheDiveO/FontAwesome/styles/fontawesome 5.css":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/fontawesome 5.css","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* autoimported from 'node_modules/@fortawesome/fontawesome-free' */\n/*!\n * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\n.fa,\n.fas,\n.far,\n.fal,\n.fad,\n.fab {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n line-height: 1; }\n\n.fa-lg {\n font-size: 1.33333em;\n line-height: 0.75em;\n vertical-align: -.0667em; }\n\n.fa-xs {\n font-size: .75em; }\n\n.fa-sm {\n font-size: .875em; }\n\n.fa-1x {\n font-size: 1em; }\n\n.fa-2x {\n font-size: 2em; }\n\n.fa-3x {\n font-size: 3em; }\n\n.fa-4x {\n font-size: 4em; }\n\n.fa-5x {\n font-size: 5em; }\n\n.fa-6x {\n font-size: 6em; }\n\n.fa-7x {\n font-size: 7em; }\n\n.fa-8x {\n font-size: 8em; }\n\n.fa-9x {\n font-size: 9em; }\n\n.fa-10x {\n font-size: 10em; }\n\n.fa-fw {\n text-align: center;\n width: 1.25em; }\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0; }\n .fa-ul > li {\n position: relative; }\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit; }\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: .1em;\n padding: .2em .25em .15em; }\n\n.fa-pull-left {\n float: left; }\n\n.fa-pull-right {\n float: right; }\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: .3em; }\n\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: .3em; }\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg); }\n\n.fa-rotate-180 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg); }\n\n.fa-rotate-270 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1); }\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none; }\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n left: 0;\n position: absolute;\n text-align: center;\n width: 100%; }\n\n.fa-stack-1x {\n line-height: inherit; }\n\n.fa-stack-2x {\n font-size: 2em; }\n\n.fa-inverse {\n color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n.fa-500px:before {\n content: \"\\f26e\"; }\n\n.fa-accessible-icon:before {\n content: \"\\f368\"; }\n\n.fa-accusoft:before {\n content: \"\\f369\"; }\n\n.fa-acquisitions-incorporated:before {\n content: \"\\f6af\"; }\n\n.fa-ad:before {\n content: \"\\f641\"; }\n\n.fa-address-book:before {\n content: \"\\f2b9\"; }\n\n.fa-address-card:before {\n content: \"\\f2bb\"; }\n\n.fa-adjust:before {\n content: \"\\f042\"; }\n\n.fa-adn:before {\n content: \"\\f170\"; }\n\n.fa-adobe:before {\n content: \"\\f778\"; }\n\n.fa-adversal:before {\n content: \"\\f36a\"; }\n\n.fa-affiliatetheme:before {\n content: \"\\f36b\"; }\n\n.fa-air-freshener:before {\n content: \"\\f5d0\"; }\n\n.fa-airbnb:before {\n content: \"\\f834\"; }\n\n.fa-algolia:before {\n content: \"\\f36c\"; }\n\n.fa-align-center:before {\n content: \"\\f037\"; }\n\n.fa-align-justify:before {\n content: \"\\f039\"; }\n\n.fa-align-left:before {\n content: \"\\f036\"; }\n\n.fa-align-right:before {\n content: \"\\f038\"; }\n\n.fa-alipay:before {\n content: \"\\f642\"; }\n\n.fa-allergies:before {\n content: \"\\f461\"; }\n\n.fa-amazon:before {\n content: \"\\f270\"; }\n\n.fa-amazon-pay:before {\n content: \"\\f42c\"; }\n\n.fa-ambulance:before {\n content: \"\\f0f9\"; }\n\n.fa-american-sign-language-interpreting:before {\n content: \"\\f2a3\"; }\n\n.fa-amilia:before {\n content: \"\\f36d\"; }\n\n.fa-anchor:before {\n content: \"\\f13d\"; }\n\n.fa-android:before {\n content: \"\\f17b\"; }\n\n.fa-angellist:before {\n content: \"\\f209\"; }\n\n.fa-angle-double-down:before {\n content: \"\\f103\"; }\n\n.fa-angle-double-left:before {\n content: \"\\f100\"; }\n\n.fa-angle-double-right:before {\n content: \"\\f101\"; }\n\n.fa-angle-double-up:before {\n content: \"\\f102\"; }\n\n.fa-angle-down:before {\n content: \"\\f107\"; }\n\n.fa-angle-left:before {\n content: \"\\f104\"; }\n\n.fa-angle-right:before {\n content: \"\\f105\"; }\n\n.fa-angle-up:before {\n content: \"\\f106\"; }\n\n.fa-angry:before {\n content: \"\\f556\"; }\n\n.fa-angrycreative:before {\n content: \"\\f36e\"; }\n\n.fa-angular:before {\n content: \"\\f420\"; }\n\n.fa-ankh:before {\n content: \"\\f644\"; }\n\n.fa-app-store:before {\n content: \"\\f36f\"; }\n\n.fa-app-store-ios:before {\n content: \"\\f370\"; }\n\n.fa-apper:before {\n content: \"\\f371\"; }\n\n.fa-apple:before {\n content: \"\\f179\"; }\n\n.fa-apple-alt:before {\n content: \"\\f5d1\"; }\n\n.fa-apple-pay:before {\n content: \"\\f415\"; }\n\n.fa-archive:before {\n content: \"\\f187\"; }\n\n.fa-archway:before {\n content: \"\\f557\"; }\n\n.fa-arrow-alt-circle-down:before {\n content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-left:before {\n content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-right:before {\n content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-up:before {\n content: \"\\f35b\"; }\n\n.fa-arrow-circle-down:before {\n content: \"\\f0ab\"; }\n\n.fa-arrow-circle-left:before {\n content: \"\\f0a8\"; }\n\n.fa-arrow-circle-right:before {\n content: \"\\f0a9\"; }\n\n.fa-arrow-circle-up:before {\n content: \"\\f0aa\"; }\n\n.fa-arrow-down:before {\n content: \"\\f063\"; }\n\n.fa-arrow-left:before {\n content: \"\\f060\"; }\n\n.fa-arrow-right:before {\n content: \"\\f061\"; }\n\n.fa-arrow-up:before {\n content: \"\\f062\"; }\n\n.fa-arrows-alt:before {\n content: \"\\f0b2\"; }\n\n.fa-arrows-alt-h:before {\n content: \"\\f337\"; }\n\n.fa-arrows-alt-v:before {\n content: \"\\f338\"; }\n\n.fa-artstation:before {\n content: \"\\f77a\"; }\n\n.fa-assistive-listening-systems:before {\n content: \"\\f2a2\"; }\n\n.fa-asterisk:before {\n content: \"\\f069\"; }\n\n.fa-asymmetrik:before {\n content: \"\\f372\"; }\n\n.fa-at:before {\n content: \"\\f1fa\"; }\n\n.fa-atlas:before {\n content: \"\\f558\"; }\n\n.fa-atlassian:before {\n content: \"\\f77b\"; }\n\n.fa-atom:before {\n content: \"\\f5d2\"; }\n\n.fa-audible:before {\n content: \"\\f373\"; }\n\n.fa-audio-description:before {\n content: \"\\f29e\"; }\n\n.fa-autoprefixer:before {\n content: \"\\f41c\"; }\n\n.fa-avianex:before {\n content: \"\\f374\"; }\n\n.fa-aviato:before {\n content: \"\\f421\"; }\n\n.fa-award:before {\n content: \"\\f559\"; }\n\n.fa-aws:before {\n content: \"\\f375\"; }\n\n.fa-baby:before {\n content: \"\\f77c\"; }\n\n.fa-baby-carriage:before {\n content: \"\\f77d\"; }\n\n.fa-backspace:before {\n content: \"\\f55a\"; }\n\n.fa-backward:before {\n content: \"\\f04a\"; }\n\n.fa-bacon:before {\n content: \"\\f7e5\"; }\n\n.fa-bacteria:before {\n content: \"\\e059\"; }\n\n.fa-bacterium:before {\n content: \"\\e05a\"; }\n\n.fa-bahai:before {\n content: \"\\f666\"; }\n\n.fa-balance-scale:before {\n content: \"\\f24e\"; }\n\n.fa-balance-scale-left:before {\n content: \"\\f515\"; }\n\n.fa-balance-scale-right:before {\n content: \"\\f516\"; }\n\n.fa-ban:before {\n content: \"\\f05e\"; }\n\n.fa-band-aid:before {\n content: \"\\f462\"; }\n\n.fa-bandcamp:before {\n content: \"\\f2d5\"; }\n\n.fa-barcode:before {\n content: \"\\f02a\"; }\n\n.fa-bars:before {\n content: \"\\f0c9\"; }\n\n.fa-baseball-ball:before {\n content: \"\\f433\"; }\n\n.fa-basketball-ball:before {\n content: \"\\f434\"; }\n\n.fa-bath:before {\n content: \"\\f2cd\"; }\n\n.fa-battery-empty:before {\n content: \"\\f244\"; }\n\n.fa-battery-full:before {\n content: \"\\f240\"; }\n\n.fa-battery-half:before {\n content: \"\\f242\"; }\n\n.fa-battery-quarter:before {\n content: \"\\f243\"; }\n\n.fa-battery-three-quarters:before {\n content: \"\\f241\"; }\n\n.fa-battle-net:before {\n content: \"\\f835\"; }\n\n.fa-bed:before {\n content: \"\\f236\"; }\n\n.fa-beer:before {\n content: \"\\f0fc\"; }\n\n.fa-behance:before {\n content: \"\\f1b4\"; }\n\n.fa-behance-square:before {\n content: \"\\f1b5\"; }\n\n.fa-bell:before {\n content: \"\\f0f3\"; }\n\n.fa-bell-slash:before {\n content: \"\\f1f6\"; }\n\n.fa-bezier-curve:before {\n content: \"\\f55b\"; }\n\n.fa-bible:before {\n content: \"\\f647\"; }\n\n.fa-bicycle:before {\n content: \"\\f206\"; }\n\n.fa-biking:before {\n content: \"\\f84a\"; }\n\n.fa-bimobject:before {\n content: \"\\f378\"; }\n\n.fa-binoculars:before {\n content: \"\\f1e5\"; }\n\n.fa-biohazard:before {\n content: \"\\f780\"; }\n\n.fa-birthday-cake:before {\n content: \"\\f1fd\"; }\n\n.fa-bitbucket:before {\n content: \"\\f171\"; }\n\n.fa-bitcoin:before {\n content: \"\\f379\"; }\n\n.fa-bity:before {\n content: \"\\f37a\"; }\n\n.fa-black-tie:before {\n content: \"\\f27e\"; }\n\n.fa-blackberry:before {\n content: \"\\f37b\"; }\n\n.fa-blender:before {\n content: \"\\f517\"; }\n\n.fa-blender-phone:before {\n content: \"\\f6b6\"; }\n\n.fa-blind:before {\n content: \"\\f29d\"; }\n\n.fa-blog:before {\n content: \"\\f781\"; }\n\n.fa-blogger:before {\n content: \"\\f37c\"; }\n\n.fa-blogger-b:before {\n content: \"\\f37d\"; }\n\n.fa-bluetooth:before {\n content: \"\\f293\"; }\n\n.fa-bluetooth-b:before {\n content: \"\\f294\"; }\n\n.fa-bold:before {\n content: \"\\f032\"; }\n\n.fa-bolt:before {\n content: \"\\f0e7\"; }\n\n.fa-bomb:before {\n content: \"\\f1e2\"; }\n\n.fa-bone:before {\n content: \"\\f5d7\"; }\n\n.fa-bong:before {\n content: \"\\f55c\"; }\n\n.fa-book:before {\n content: \"\\f02d\"; }\n\n.fa-book-dead:before {\n content: \"\\f6b7\"; }\n\n.fa-book-medical:before {\n content: \"\\f7e6\"; }\n\n.fa-book-open:before {\n content: \"\\f518\"; }\n\n.fa-book-reader:before {\n content: \"\\f5da\"; }\n\n.fa-bookmark:before {\n content: \"\\f02e\"; }\n\n.fa-bootstrap:before {\n content: \"\\f836\"; }\n\n.fa-border-all:before {\n content: \"\\f84c\"; }\n\n.fa-border-none:before {\n content: \"\\f850\"; }\n\n.fa-border-style:before {\n content: \"\\f853\"; }\n\n.fa-bowling-ball:before {\n content: \"\\f436\"; }\n\n.fa-box:before {\n content: \"\\f466\"; }\n\n.fa-box-open:before {\n content: \"\\f49e\"; }\n\n.fa-box-tissue:before {\n content: \"\\e05b\"; }\n\n.fa-boxes:before {\n content: \"\\f468\"; }\n\n.fa-braille:before {\n content: \"\\f2a1\"; }\n\n.fa-brain:before {\n content: \"\\f5dc\"; }\n\n.fa-bread-slice:before {\n content: \"\\f7ec\"; }\n\n.fa-briefcase:before {\n content: \"\\f0b1\"; }\n\n.fa-briefcase-medical:before {\n content: \"\\f469\"; }\n\n.fa-broadcast-tower:before {\n content: \"\\f519\"; }\n\n.fa-broom:before {\n content: \"\\f51a\"; }\n\n.fa-brush:before {\n content: \"\\f55d\"; }\n\n.fa-btc:before {\n content: \"\\f15a\"; }\n\n.fa-buffer:before {\n content: \"\\f837\"; }\n\n.fa-bug:before {\n content: \"\\f188\"; }\n\n.fa-building:before {\n content: \"\\f1ad\"; }\n\n.fa-bullhorn:before {\n content: \"\\f0a1\"; }\n\n.fa-bullseye:before {\n content: \"\\f140\"; }\n\n.fa-burn:before {\n content: \"\\f46a\"; }\n\n.fa-buromobelexperte:before {\n content: \"\\f37f\"; }\n\n.fa-bus:before {\n content: \"\\f207\"; }\n\n.fa-bus-alt:before {\n content: \"\\f55e\"; }\n\n.fa-business-time:before {\n content: \"\\f64a\"; }\n\n.fa-buy-n-large:before {\n content: \"\\f8a6\"; }\n\n.fa-buysellads:before {\n content: \"\\f20d\"; }\n\n.fa-calculator:before {\n content: \"\\f1ec\"; }\n\n.fa-calendar:before {\n content: \"\\f133\"; }\n\n.fa-calendar-alt:before {\n content: \"\\f073\"; }\n\n.fa-calendar-check:before {\n content: \"\\f274\"; }\n\n.fa-calendar-day:before {\n content: \"\\f783\"; }\n\n.fa-calendar-minus:before {\n content: \"\\f272\"; }\n\n.fa-calendar-plus:before {\n content: \"\\f271\"; }\n\n.fa-calendar-times:before {\n content: \"\\f273\"; }\n\n.fa-calendar-week:before {\n content: \"\\f784\"; }\n\n.fa-camera:before {\n content: \"\\f030\"; }\n\n.fa-camera-retro:before {\n content: \"\\f083\"; }\n\n.fa-campground:before {\n content: \"\\f6bb\"; }\n\n.fa-canadian-maple-leaf:before {\n content: \"\\f785\"; }\n\n.fa-candy-cane:before {\n content: \"\\f786\"; }\n\n.fa-cannabis:before {\n content: \"\\f55f\"; }\n\n.fa-capsules:before {\n content: \"\\f46b\"; }\n\n.fa-car:before {\n content: \"\\f1b9\"; }\n\n.fa-car-alt:before {\n content: \"\\f5de\"; }\n\n.fa-car-battery:before {\n content: \"\\f5df\"; }\n\n.fa-car-crash:before {\n content: \"\\f5e1\"; }\n\n.fa-car-side:before {\n content: \"\\f5e4\"; }\n\n.fa-caravan:before {\n content: \"\\f8ff\"; }\n\n.fa-caret-down:before {\n content: \"\\f0d7\"; }\n\n.fa-caret-left:before {\n content: \"\\f0d9\"; }\n\n.fa-caret-right:before {\n content: \"\\f0da\"; }\n\n.fa-caret-square-down:before {\n content: \"\\f150\"; }\n\n.fa-caret-square-left:before {\n content: \"\\f191\"; }\n\n.fa-caret-square-right:before {\n content: \"\\f152\"; }\n\n.fa-caret-square-up:before {\n content: \"\\f151\"; }\n\n.fa-caret-up:before {\n content: \"\\f0d8\"; }\n\n.fa-carrot:before {\n content: \"\\f787\"; }\n\n.fa-cart-arrow-down:before {\n content: \"\\f218\"; }\n\n.fa-cart-plus:before {\n content: \"\\f217\"; }\n\n.fa-cash-register:before {\n content: \"\\f788\"; }\n\n.fa-cat:before {\n content: \"\\f6be\"; }\n\n.fa-cc-amazon-pay:before {\n content: \"\\f42d\"; }\n\n.fa-cc-amex:before {\n content: \"\\f1f3\"; }\n\n.fa-cc-apple-pay:before {\n content: \"\\f416\"; }\n\n.fa-cc-diners-club:before {\n content: \"\\f24c\"; }\n\n.fa-cc-discover:before {\n content: \"\\f1f2\"; }\n\n.fa-cc-jcb:before {\n content: \"\\f24b\"; }\n\n.fa-cc-mastercard:before {\n content: \"\\f1f1\"; }\n\n.fa-cc-paypal:before {\n content: \"\\f1f4\"; }\n\n.fa-cc-stripe:before {\n content: \"\\f1f5\"; }\n\n.fa-cc-visa:before {\n content: \"\\f1f0\"; }\n\n.fa-centercode:before {\n content: \"\\f380\"; }\n\n.fa-centos:before {\n content: \"\\f789\"; }\n\n.fa-certificate:before {\n content: \"\\f0a3\"; }\n\n.fa-chair:before {\n content: \"\\f6c0\"; }\n\n.fa-chalkboard:before {\n content: \"\\f51b\"; }\n\n.fa-chalkboard-teacher:before {\n content: \"\\f51c\"; }\n\n.fa-charging-station:before {\n content: \"\\f5e7\"; }\n\n.fa-chart-area:before {\n content: \"\\f1fe\"; }\n\n.fa-chart-bar:before {\n content: \"\\f080\"; }\n\n.fa-chart-line:before {\n content: \"\\f201\"; }\n\n.fa-chart-pie:before {\n content: \"\\f200\"; }\n\n.fa-check:before {\n content: \"\\f00c\"; }\n\n.fa-check-circle:before {\n content: \"\\f058\"; }\n\n.fa-check-double:before {\n content: \"\\f560\"; }\n\n.fa-check-square:before {\n content: \"\\f14a\"; }\n\n.fa-cheese:before {\n content: \"\\f7ef\"; }\n\n.fa-chess:before {\n content: \"\\f439\"; }\n\n.fa-chess-bishop:before {\n content: \"\\f43a\"; }\n\n.fa-chess-board:before {\n content: \"\\f43c\"; }\n\n.fa-chess-king:before {\n content: \"\\f43f\"; }\n\n.fa-chess-knight:before {\n content: \"\\f441\"; }\n\n.fa-chess-pawn:before {\n content: \"\\f443\"; }\n\n.fa-chess-queen:before {\n content: \"\\f445\"; }\n\n.fa-chess-rook:before {\n content: \"\\f447\"; }\n\n.fa-chevron-circle-down:before {\n content: \"\\f13a\"; }\n\n.fa-chevron-circle-left:before {\n content: \"\\f137\"; }\n\n.fa-chevron-circle-right:before {\n content: \"\\f138\"; }\n\n.fa-chevron-circle-up:before {\n content: \"\\f139\"; }\n\n.fa-chevron-down:before {\n content: \"\\f078\"; }\n\n.fa-chevron-left:before {\n content: \"\\f053\"; }\n\n.fa-chevron-right:before {\n content: \"\\f054\"; }\n\n.fa-chevron-up:before {\n content: \"\\f077\"; }\n\n.fa-child:before {\n content: \"\\f1ae\"; }\n\n.fa-chrome:before {\n content: \"\\f268\"; }\n\n.fa-chromecast:before {\n content: \"\\f838\"; }\n\n.fa-church:before {\n content: \"\\f51d\"; }\n\n.fa-circle:before {\n content: \"\\f111\"; }\n\n.fa-circle-notch:before {\n content: \"\\f1ce\"; }\n\n.fa-city:before {\n content: \"\\f64f\"; }\n\n.fa-clinic-medical:before {\n content: \"\\f7f2\"; }\n\n.fa-clipboard:before {\n content: \"\\f328\"; }\n\n.fa-clipboard-check:before {\n content: \"\\f46c\"; }\n\n.fa-clipboard-list:before {\n content: \"\\f46d\"; }\n\n.fa-clock:before {\n content: \"\\f017\"; }\n\n.fa-clone:before {\n content: \"\\f24d\"; }\n\n.fa-closed-captioning:before {\n content: \"\\f20a\"; }\n\n.fa-cloud:before {\n content: \"\\f0c2\"; }\n\n.fa-cloud-download-alt:before {\n content: \"\\f381\"; }\n\n.fa-cloud-meatball:before {\n content: \"\\f73b\"; }\n\n.fa-cloud-moon:before {\n content: \"\\f6c3\"; }\n\n.fa-cloud-moon-rain:before {\n content: \"\\f73c\"; }\n\n.fa-cloud-rain:before {\n content: \"\\f73d\"; }\n\n.fa-cloud-showers-heavy:before {\n content: \"\\f740\"; }\n\n.fa-cloud-sun:before {\n content: \"\\f6c4\"; }\n\n.fa-cloud-sun-rain:before {\n content: \"\\f743\"; }\n\n.fa-cloud-upload-alt:before {\n content: \"\\f382\"; }\n\n.fa-cloudscale:before {\n content: \"\\f383\"; }\n\n.fa-cloudsmith:before {\n content: \"\\f384\"; }\n\n.fa-cloudversify:before {\n content: \"\\f385\"; }\n\n.fa-cocktail:before {\n content: \"\\f561\"; }\n\n.fa-code:before {\n content: \"\\f121\"; }\n\n.fa-code-branch:before {\n content: \"\\f126\"; }\n\n.fa-codepen:before {\n content: \"\\f1cb\"; }\n\n.fa-codiepie:before {\n content: \"\\f284\"; }\n\n.fa-coffee:before {\n content: \"\\f0f4\"; }\n\n.fa-cog:before {\n content: \"\\f013\"; }\n\n.fa-cogs:before {\n content: \"\\f085\"; }\n\n.fa-coins:before {\n content: \"\\f51e\"; }\n\n.fa-columns:before {\n content: \"\\f0db\"; }\n\n.fa-comment:before {\n content: \"\\f075\"; }\n\n.fa-comment-alt:before {\n content: \"\\f27a\"; }\n\n.fa-comment-dollar:before {\n content: \"\\f651\"; }\n\n.fa-comment-dots:before {\n content: \"\\f4ad\"; }\n\n.fa-comment-medical:before {\n content: \"\\f7f5\"; }\n\n.fa-comment-slash:before {\n content: \"\\f4b3\"; }\n\n.fa-comments:before {\n content: \"\\f086\"; }\n\n.fa-comments-dollar:before {\n content: \"\\f653\"; }\n\n.fa-compact-disc:before {\n content: \"\\f51f\"; }\n\n.fa-compass:before {\n content: \"\\f14e\"; }\n\n.fa-compress:before {\n content: \"\\f066\"; }\n\n.fa-compress-alt:before {\n content: \"\\f422\"; }\n\n.fa-compress-arrows-alt:before {\n content: \"\\f78c\"; }\n\n.fa-concierge-bell:before {\n content: \"\\f562\"; }\n\n.fa-confluence:before {\n content: \"\\f78d\"; }\n\n.fa-connectdevelop:before {\n content: \"\\f20e\"; }\n\n.fa-contao:before {\n content: \"\\f26d\"; }\n\n.fa-cookie:before {\n content: \"\\f563\"; }\n\n.fa-cookie-bite:before {\n content: \"\\f564\"; }\n\n.fa-copy:before {\n content: \"\\f0c5\"; }\n\n.fa-copyright:before {\n content: \"\\f1f9\"; }\n\n.fa-cotton-bureau:before {\n content: \"\\f89e\"; }\n\n.fa-couch:before {\n content: \"\\f4b8\"; }\n\n.fa-cpanel:before {\n content: \"\\f388\"; }\n\n.fa-creative-commons:before {\n content: \"\\f25e\"; }\n\n.fa-creative-commons-by:before {\n content: \"\\f4e7\"; }\n\n.fa-creative-commons-nc:before {\n content: \"\\f4e8\"; }\n\n.fa-creative-commons-nc-eu:before {\n content: \"\\f4e9\"; }\n\n.fa-creative-commons-nc-jp:before {\n content: \"\\f4ea\"; }\n\n.fa-creative-commons-nd:before {\n content: \"\\f4eb\"; }\n\n.fa-creative-commons-pd:before {\n content: \"\\f4ec\"; }\n\n.fa-creative-commons-pd-alt:before {\n content: \"\\f4ed\"; }\n\n.fa-creative-commons-remix:before {\n content: \"\\f4ee\"; }\n\n.fa-creative-commons-sa:before {\n content: \"\\f4ef\"; }\n\n.fa-creative-commons-sampling:before {\n content: \"\\f4f0\"; }\n\n.fa-creative-commons-sampling-plus:before {\n content: \"\\f4f1\"; }\n\n.fa-creative-commons-share:before {\n content: \"\\f4f2\"; }\n\n.fa-creative-commons-zero:before {\n content: \"\\f4f3\"; }\n\n.fa-credit-card:before {\n content: \"\\f09d\"; }\n\n.fa-critical-role:before {\n content: \"\\f6c9\"; }\n\n.fa-crop:before {\n content: \"\\f125\"; }\n\n.fa-crop-alt:before {\n content: \"\\f565\"; }\n\n.fa-cross:before {\n content: \"\\f654\"; }\n\n.fa-crosshairs:before {\n content: \"\\f05b\"; }\n\n.fa-crow:before {\n content: \"\\f520\"; }\n\n.fa-crown:before {\n content: \"\\f521\"; }\n\n.fa-crutch:before {\n content: \"\\f7f7\"; }\n\n.fa-css3:before {\n content: \"\\f13c\"; }\n\n.fa-css3-alt:before {\n content: \"\\f38b\"; }\n\n.fa-cube:before {\n content: \"\\f1b2\"; }\n\n.fa-cubes:before {\n content: \"\\f1b3\"; }\n\n.fa-cut:before {\n content: \"\\f0c4\"; }\n\n.fa-cuttlefish:before {\n content: \"\\f38c\"; }\n\n.fa-d-and-d:before {\n content: \"\\f38d\"; }\n\n.fa-d-and-d-beyond:before {\n content: \"\\f6ca\"; }\n\n.fa-dailymotion:before {\n content: \"\\e052\"; }\n\n.fa-dashcube:before {\n content: \"\\f210\"; }\n\n.fa-database:before {\n content: \"\\f1c0\"; }\n\n.fa-deaf:before {\n content: \"\\f2a4\"; }\n\n.fa-deezer:before {\n content: \"\\e077\"; }\n\n.fa-delicious:before {\n content: \"\\f1a5\"; }\n\n.fa-democrat:before {\n content: \"\\f747\"; }\n\n.fa-deploydog:before {\n content: \"\\f38e\"; }\n\n.fa-deskpro:before {\n content: \"\\f38f\"; }\n\n.fa-desktop:before {\n content: \"\\f108\"; }\n\n.fa-dev:before {\n content: \"\\f6cc\"; }\n\n.fa-deviantart:before {\n content: \"\\f1bd\"; }\n\n.fa-dharmachakra:before {\n content: \"\\f655\"; }\n\n.fa-dhl:before {\n content: \"\\f790\"; }\n\n.fa-diagnoses:before {\n content: \"\\f470\"; }\n\n.fa-diaspora:before {\n content: \"\\f791\"; }\n\n.fa-dice:before {\n content: \"\\f522\"; }\n\n.fa-dice-d20:before {\n content: \"\\f6cf\"; }\n\n.fa-dice-d6:before {\n content: \"\\f6d1\"; }\n\n.fa-dice-five:before {\n content: \"\\f523\"; }\n\n.fa-dice-four:before {\n content: \"\\f524\"; }\n\n.fa-dice-one:before {\n content: \"\\f525\"; }\n\n.fa-dice-six:before {\n content: \"\\f526\"; }\n\n.fa-dice-three:before {\n content: \"\\f527\"; }\n\n.fa-dice-two:before {\n content: \"\\f528\"; }\n\n.fa-digg:before {\n content: \"\\f1a6\"; }\n\n.fa-digital-ocean:before {\n content: \"\\f391\"; }\n\n.fa-digital-tachograph:before {\n content: \"\\f566\"; }\n\n.fa-directions:before {\n content: \"\\f5eb\"; }\n\n.fa-discord:before {\n content: \"\\f392\"; }\n\n.fa-discourse:before {\n content: \"\\f393\"; }\n\n.fa-disease:before {\n content: \"\\f7fa\"; }\n\n.fa-divide:before {\n content: \"\\f529\"; }\n\n.fa-dizzy:before {\n content: \"\\f567\"; }\n\n.fa-dna:before {\n content: \"\\f471\"; }\n\n.fa-dochub:before {\n content: \"\\f394\"; }\n\n.fa-docker:before {\n content: \"\\f395\"; }\n\n.fa-dog:before {\n content: \"\\f6d3\"; }\n\n.fa-dollar-sign:before {\n content: \"\\f155\"; }\n\n.fa-dolly:before {\n content: \"\\f472\"; }\n\n.fa-dolly-flatbed:before {\n content: \"\\f474\"; }\n\n.fa-donate:before {\n content: \"\\f4b9\"; }\n\n.fa-door-closed:before {\n content: \"\\f52a\"; }\n\n.fa-door-open:before {\n content: \"\\f52b\"; }\n\n.fa-dot-circle:before {\n content: \"\\f192\"; }\n\n.fa-dove:before {\n content: \"\\f4ba\"; }\n\n.fa-download:before {\n content: \"\\f019\"; }\n\n.fa-draft2digital:before {\n content: \"\\f396\"; }\n\n.fa-drafting-compass:before {\n content: \"\\f568\"; }\n\n.fa-dragon:before {\n content: \"\\f6d5\"; }\n\n.fa-draw-polygon:before {\n content: \"\\f5ee\"; }\n\n.fa-dribbble:before {\n content: \"\\f17d\"; }\n\n.fa-dribbble-square:before {\n content: \"\\f397\"; }\n\n.fa-dropbox:before {\n content: \"\\f16b\"; }\n\n.fa-drum:before {\n content: \"\\f569\"; }\n\n.fa-drum-steelpan:before {\n content: \"\\f56a\"; }\n\n.fa-drumstick-bite:before {\n content: \"\\f6d7\"; }\n\n.fa-drupal:before {\n content: \"\\f1a9\"; }\n\n.fa-dumbbell:before {\n content: \"\\f44b\"; }\n\n.fa-dumpster:before {\n content: \"\\f793\"; }\n\n.fa-dumpster-fire:before {\n content: \"\\f794\"; }\n\n.fa-dungeon:before {\n content: \"\\f6d9\"; }\n\n.fa-dyalog:before {\n content: \"\\f399\"; }\n\n.fa-earlybirds:before {\n content: \"\\f39a\"; }\n\n.fa-ebay:before {\n content: \"\\f4f4\"; }\n\n.fa-edge:before {\n content: \"\\f282\"; }\n\n.fa-edge-legacy:before {\n content: \"\\e078\"; }\n\n.fa-edit:before {\n content: \"\\f044\"; }\n\n.fa-egg:before {\n content: \"\\f7fb\"; }\n\n.fa-eject:before {\n content: \"\\f052\"; }\n\n.fa-elementor:before {\n content: \"\\f430\"; }\n\n.fa-ellipsis-h:before {\n content: \"\\f141\"; }\n\n.fa-ellipsis-v:before {\n content: \"\\f142\"; }\n\n.fa-ello:before {\n content: \"\\f5f1\"; }\n\n.fa-ember:before {\n content: \"\\f423\"; }\n\n.fa-empire:before {\n content: \"\\f1d1\"; }\n\n.fa-envelope:before {\n content: \"\\f0e0\"; }\n\n.fa-envelope-open:before {\n content: \"\\f2b6\"; }\n\n.fa-envelope-open-text:before {\n content: \"\\f658\"; }\n\n.fa-envelope-square:before {\n content: \"\\f199\"; }\n\n.fa-envira:before {\n content: \"\\f299\"; }\n\n.fa-equals:before {\n content: \"\\f52c\"; }\n\n.fa-eraser:before {\n content: \"\\f12d\"; }\n\n.fa-erlang:before {\n content: \"\\f39d\"; }\n\n.fa-ethereum:before {\n content: \"\\f42e\"; }\n\n.fa-ethernet:before {\n content: \"\\f796\"; }\n\n.fa-etsy:before {\n content: \"\\f2d7\"; }\n\n.fa-euro-sign:before {\n content: \"\\f153\"; }\n\n.fa-evernote:before {\n content: \"\\f839\"; }\n\n.fa-exchange-alt:before {\n content: \"\\f362\"; }\n\n.fa-exclamation:before {\n content: \"\\f12a\"; }\n\n.fa-exclamation-circle:before {\n content: \"\\f06a\"; }\n\n.fa-exclamation-triangle:before {\n content: \"\\f071\"; }\n\n.fa-expand:before {\n content: \"\\f065\"; }\n\n.fa-expand-alt:before {\n content: \"\\f424\"; }\n\n.fa-expand-arrows-alt:before {\n content: \"\\f31e\"; }\n\n.fa-expeditedssl:before {\n content: \"\\f23e\"; }\n\n.fa-external-link-alt:before {\n content: \"\\f35d\"; }\n\n.fa-external-link-square-alt:before {\n content: \"\\f360\"; }\n\n.fa-eye:before {\n content: \"\\f06e\"; }\n\n.fa-eye-dropper:before {\n content: \"\\f1fb\"; }\n\n.fa-eye-slash:before {\n content: \"\\f070\"; }\n\n.fa-facebook:before {\n content: \"\\f09a\"; }\n\n.fa-facebook-f:before {\n content: \"\\f39e\"; }\n\n.fa-facebook-messenger:before {\n content: \"\\f39f\"; }\n\n.fa-facebook-square:before {\n content: \"\\f082\"; }\n\n.fa-fan:before {\n content: \"\\f863\"; }\n\n.fa-fantasy-flight-games:before {\n content: \"\\f6dc\"; }\n\n.fa-fast-backward:before {\n content: \"\\f049\"; }\n\n.fa-fast-forward:before {\n content: \"\\f050\"; }\n\n.fa-faucet:before {\n content: \"\\e005\"; }\n\n.fa-fax:before {\n content: \"\\f1ac\"; }\n\n.fa-feather:before {\n content: \"\\f52d\"; }\n\n.fa-feather-alt:before {\n content: \"\\f56b\"; }\n\n.fa-fedex:before {\n content: \"\\f797\"; }\n\n.fa-fedora:before {\n content: \"\\f798\"; }\n\n.fa-female:before {\n content: \"\\f182\"; }\n\n.fa-fighter-jet:before {\n content: \"\\f0fb\"; }\n\n.fa-figma:before {\n content: \"\\f799\"; }\n\n.fa-file:before {\n content: \"\\f15b\"; }\n\n.fa-file-alt:before {\n content: \"\\f15c\"; }\n\n.fa-file-archive:before {\n content: \"\\f1c6\"; }\n\n.fa-file-audio:before {\n content: \"\\f1c7\"; }\n\n.fa-file-code:before {\n content: \"\\f1c9\"; }\n\n.fa-file-contract:before {\n content: \"\\f56c\"; }\n\n.fa-file-csv:before {\n content: \"\\f6dd\"; }\n\n.fa-file-download:before {\n content: \"\\f56d\"; }\n\n.fa-file-excel:before {\n content: \"\\f1c3\"; }\n\n.fa-file-export:before {\n content: \"\\f56e\"; }\n\n.fa-file-image:before {\n content: \"\\f1c5\"; }\n\n.fa-file-import:before {\n content: \"\\f56f\"; }\n\n.fa-file-invoice:before {\n content: \"\\f570\"; }\n\n.fa-file-invoice-dollar:before {\n content: \"\\f571\"; }\n\n.fa-file-medical:before {\n content: \"\\f477\"; }\n\n.fa-file-medical-alt:before {\n content: \"\\f478\"; }\n\n.fa-file-pdf:before {\n content: \"\\f1c1\"; }\n\n.fa-file-powerpoint:before {\n content: \"\\f1c4\"; }\n\n.fa-file-prescription:before {\n content: \"\\f572\"; }\n\n.fa-file-signature:before {\n content: \"\\f573\"; }\n\n.fa-file-upload:before {\n content: \"\\f574\"; }\n\n.fa-file-video:before {\n content: \"\\f1c8\"; }\n\n.fa-file-word:before {\n content: \"\\f1c2\"; }\n\n.fa-fill:before {\n content: \"\\f575\"; }\n\n.fa-fill-drip:before {\n content: \"\\f576\"; }\n\n.fa-film:before {\n content: \"\\f008\"; }\n\n.fa-filter:before {\n content: \"\\f0b0\"; }\n\n.fa-fingerprint:before {\n content: \"\\f577\"; }\n\n.fa-fire:before {\n content: \"\\f06d\"; }\n\n.fa-fire-alt:before {\n content: \"\\f7e4\"; }\n\n.fa-fire-extinguisher:before {\n content: \"\\f134\"; }\n\n.fa-firefox:before {\n content: \"\\f269\"; }\n\n.fa-firefox-browser:before {\n content: \"\\e007\"; }\n\n.fa-first-aid:before {\n content: \"\\f479\"; }\n\n.fa-first-order:before {\n content: \"\\f2b0\"; }\n\n.fa-first-order-alt:before {\n content: \"\\f50a\"; }\n\n.fa-firstdraft:before {\n content: \"\\f3a1\"; }\n\n.fa-fish:before {\n content: \"\\f578\"; }\n\n.fa-fist-raised:before {\n content: \"\\f6de\"; }\n\n.fa-flag:before {\n content: \"\\f024\"; }\n\n.fa-flag-checkered:before {\n content: \"\\f11e\"; }\n\n.fa-flag-usa:before {\n content: \"\\f74d\"; }\n\n.fa-flask:before {\n content: \"\\f0c3\"; }\n\n.fa-flickr:before {\n content: \"\\f16e\"; }\n\n.fa-flipboard:before {\n content: \"\\f44d\"; }\n\n.fa-flushed:before {\n content: \"\\f579\"; }\n\n.fa-fly:before {\n content: \"\\f417\"; }\n\n.fa-folder:before {\n content: \"\\f07b\"; }\n\n.fa-folder-minus:before {\n content: \"\\f65d\"; }\n\n.fa-folder-open:before {\n content: \"\\f07c\"; }\n\n.fa-folder-plus:before {\n content: \"\\f65e\"; }\n\n.fa-font:before {\n content: \"\\f031\"; }\n\n.fa-font-awesome:before {\n content: \"\\f2b4\"; }\n\n.fa-font-awesome-alt:before {\n content: \"\\f35c\"; }\n\n.fa-font-awesome-flag:before {\n content: \"\\f425\"; }\n\n.fa-font-awesome-logo-full:before {\n content: \"\\f4e6\"; }\n\n.fa-fonticons:before {\n content: \"\\f280\"; }\n\n.fa-fonticons-fi:before {\n content: \"\\f3a2\"; }\n\n.fa-football-ball:before {\n content: \"\\f44e\"; }\n\n.fa-fort-awesome:before {\n content: \"\\f286\"; }\n\n.fa-fort-awesome-alt:before {\n content: \"\\f3a3\"; }\n\n.fa-forumbee:before {\n content: \"\\f211\"; }\n\n.fa-forward:before {\n content: \"\\f04e\"; }\n\n.fa-foursquare:before {\n content: \"\\f180\"; }\n\n.fa-free-code-camp:before {\n content: \"\\f2c5\"; }\n\n.fa-freebsd:before {\n content: \"\\f3a4\"; }\n\n.fa-frog:before {\n content: \"\\f52e\"; }\n\n.fa-frown:before {\n content: \"\\f119\"; }\n\n.fa-frown-open:before {\n content: \"\\f57a\"; }\n\n.fa-fulcrum:before {\n content: \"\\f50b\"; }\n\n.fa-funnel-dollar:before {\n content: \"\\f662\"; }\n\n.fa-futbol:before {\n content: \"\\f1e3\"; }\n\n.fa-galactic-republic:before {\n content: \"\\f50c\"; }\n\n.fa-galactic-senate:before {\n content: \"\\f50d\"; }\n\n.fa-gamepad:before {\n content: \"\\f11b\"; }\n\n.fa-gas-pump:before {\n content: \"\\f52f\"; }\n\n.fa-gavel:before {\n content: \"\\f0e3\"; }\n\n.fa-gem:before {\n content: \"\\f3a5\"; }\n\n.fa-genderless:before {\n content: \"\\f22d\"; }\n\n.fa-get-pocket:before {\n content: \"\\f265\"; }\n\n.fa-gg:before {\n content: \"\\f260\"; }\n\n.fa-gg-circle:before {\n content: \"\\f261\"; }\n\n.fa-ghost:before {\n content: \"\\f6e2\"; }\n\n.fa-gift:before {\n content: \"\\f06b\"; }\n\n.fa-gifts:before {\n content: \"\\f79c\"; }\n\n.fa-git:before {\n content: \"\\f1d3\"; }\n\n.fa-git-alt:before {\n content: \"\\f841\"; }\n\n.fa-git-square:before {\n content: \"\\f1d2\"; }\n\n.fa-github:before {\n content: \"\\f09b\"; }\n\n.fa-github-alt:before {\n content: \"\\f113\"; }\n\n.fa-github-square:before {\n content: \"\\f092\"; }\n\n.fa-gitkraken:before {\n content: \"\\f3a6\"; }\n\n.fa-gitlab:before {\n content: \"\\f296\"; }\n\n.fa-gitter:before {\n content: \"\\f426\"; }\n\n.fa-glass-cheers:before {\n content: \"\\f79f\"; }\n\n.fa-glass-martini:before {\n content: \"\\f000\"; }\n\n.fa-glass-martini-alt:before {\n content: \"\\f57b\"; }\n\n.fa-glass-whiskey:before {\n content: \"\\f7a0\"; }\n\n.fa-glasses:before {\n content: \"\\f530\"; }\n\n.fa-glide:before {\n content: \"\\f2a5\"; }\n\n.fa-glide-g:before {\n content: \"\\f2a6\"; }\n\n.fa-globe:before {\n content: \"\\f0ac\"; }\n\n.fa-globe-africa:before {\n content: \"\\f57c\"; }\n\n.fa-globe-americas:before {\n content: \"\\f57d\"; }\n\n.fa-globe-asia:before {\n content: \"\\f57e\"; }\n\n.fa-globe-europe:before {\n content: \"\\f7a2\"; }\n\n.fa-gofore:before {\n content: \"\\f3a7\"; }\n\n.fa-golf-ball:before {\n content: \"\\f450\"; }\n\n.fa-goodreads:before {\n content: \"\\f3a8\"; }\n\n.fa-goodreads-g:before {\n content: \"\\f3a9\"; }\n\n.fa-google:before {\n content: \"\\f1a0\"; }\n\n.fa-google-drive:before {\n content: \"\\f3aa\"; }\n\n.fa-google-pay:before {\n content: \"\\e079\"; }\n\n.fa-google-play:before {\n content: \"\\f3ab\"; }\n\n.fa-google-plus:before {\n content: \"\\f2b3\"; }\n\n.fa-google-plus-g:before {\n content: \"\\f0d5\"; }\n\n.fa-google-plus-square:before {\n content: \"\\f0d4\"; }\n\n.fa-google-wallet:before {\n content: \"\\f1ee\"; }\n\n.fa-gopuram:before {\n content: \"\\f664\"; }\n\n.fa-graduation-cap:before {\n content: \"\\f19d\"; }\n\n.fa-gratipay:before {\n content: \"\\f184\"; }\n\n.fa-grav:before {\n content: \"\\f2d6\"; }\n\n.fa-greater-than:before {\n content: \"\\f531\"; }\n\n.fa-greater-than-equal:before {\n content: \"\\f532\"; }\n\n.fa-grimace:before {\n content: \"\\f57f\"; }\n\n.fa-grin:before {\n content: \"\\f580\"; }\n\n.fa-grin-alt:before {\n content: \"\\f581\"; }\n\n.fa-grin-beam:before {\n content: \"\\f582\"; }\n\n.fa-grin-beam-sweat:before {\n content: \"\\f583\"; }\n\n.fa-grin-hearts:before {\n content: \"\\f584\"; }\n\n.fa-grin-squint:before {\n content: \"\\f585\"; }\n\n.fa-grin-squint-tears:before {\n content: \"\\f586\"; }\n\n.fa-grin-stars:before {\n content: \"\\f587\"; }\n\n.fa-grin-tears:before {\n content: \"\\f588\"; }\n\n.fa-grin-tongue:before {\n content: \"\\f589\"; }\n\n.fa-grin-tongue-squint:before {\n content: \"\\f58a\"; }\n\n.fa-grin-tongue-wink:before {\n content: \"\\f58b\"; }\n\n.fa-grin-wink:before {\n content: \"\\f58c\"; }\n\n.fa-grip-horizontal:before {\n content: \"\\f58d\"; }\n\n.fa-grip-lines:before {\n content: \"\\f7a4\"; }\n\n.fa-grip-lines-vertical:before {\n content: \"\\f7a5\"; }\n\n.fa-grip-vertical:before {\n content: \"\\f58e\"; }\n\n.fa-gripfire:before {\n content: \"\\f3ac\"; }\n\n.fa-grunt:before {\n content: \"\\f3ad\"; }\n\n.fa-guitar:before {\n content: \"\\f7a6\"; }\n\n.fa-gulp:before {\n content: \"\\f3ae\"; }\n\n.fa-h-square:before {\n content: \"\\f0fd\"; }\n\n.fa-hacker-news:before {\n content: \"\\f1d4\"; }\n\n.fa-hacker-news-square:before {\n content: \"\\f3af\"; }\n\n.fa-hackerrank:before {\n content: \"\\f5f7\"; }\n\n.fa-hamburger:before {\n content: \"\\f805\"; }\n\n.fa-hammer:before {\n content: \"\\f6e3\"; }\n\n.fa-hamsa:before {\n content: \"\\f665\"; }\n\n.fa-hand-holding:before {\n content: \"\\f4bd\"; }\n\n.fa-hand-holding-heart:before {\n content: \"\\f4be\"; }\n\n.fa-hand-holding-medical:before {\n content: \"\\e05c\"; }\n\n.fa-hand-holding-usd:before {\n content: \"\\f4c0\"; }\n\n.fa-hand-holding-water:before {\n content: \"\\f4c1\"; }\n\n.fa-hand-lizard:before {\n content: \"\\f258\"; }\n\n.fa-hand-middle-finger:before {\n content: \"\\f806\"; }\n\n.fa-hand-paper:before {\n content: \"\\f256\"; }\n\n.fa-hand-peace:before {\n content: \"\\f25b\"; }\n\n.fa-hand-point-down:before {\n content: \"\\f0a7\"; }\n\n.fa-hand-point-left:before {\n content: \"\\f0a5\"; }\n\n.fa-hand-point-right:before {\n content: \"\\f0a4\"; }\n\n.fa-hand-point-up:before {\n content: \"\\f0a6\"; }\n\n.fa-hand-pointer:before {\n content: \"\\f25a\"; }\n\n.fa-hand-rock:before {\n content: \"\\f255\"; }\n\n.fa-hand-scissors:before {\n content: \"\\f257\"; }\n\n.fa-hand-sparkles:before {\n content: \"\\e05d\"; }\n\n.fa-hand-spock:before {\n content: \"\\f259\"; }\n\n.fa-hands:before {\n content: \"\\f4c2\"; }\n\n.fa-hands-helping:before {\n content: \"\\f4c4\"; }\n\n.fa-hands-wash:before {\n content: \"\\e05e\"; }\n\n.fa-handshake:before {\n content: \"\\f2b5\"; }\n\n.fa-handshake-alt-slash:before {\n content: \"\\e05f\"; }\n\n.fa-handshake-slash:before {\n content: \"\\e060\"; }\n\n.fa-hanukiah:before {\n content: \"\\f6e6\"; }\n\n.fa-hard-hat:before {\n content: \"\\f807\"; }\n\n.fa-hashtag:before {\n content: \"\\f292\"; }\n\n.fa-hat-cowboy:before {\n content: \"\\f8c0\"; }\n\n.fa-hat-cowboy-side:before {\n content: \"\\f8c1\"; }\n\n.fa-hat-wizard:before {\n content: \"\\f6e8\"; }\n\n.fa-hdd:before {\n content: \"\\f0a0\"; }\n\n.fa-head-side-cough:before {\n content: \"\\e061\"; }\n\n.fa-head-side-cough-slash:before {\n content: \"\\e062\"; }\n\n.fa-head-side-mask:before {\n content: \"\\e063\"; }\n\n.fa-head-side-virus:before {\n content: \"\\e064\"; }\n\n.fa-heading:before {\n content: \"\\f1dc\"; }\n\n.fa-headphones:before {\n content: \"\\f025\"; }\n\n.fa-headphones-alt:before {\n content: \"\\f58f\"; }\n\n.fa-headset:before {\n content: \"\\f590\"; }\n\n.fa-heart:before {\n content: \"\\f004\"; }\n\n.fa-heart-broken:before {\n content: \"\\f7a9\"; }\n\n.fa-heartbeat:before {\n content: \"\\f21e\"; }\n\n.fa-helicopter:before {\n content: \"\\f533\"; }\n\n.fa-highlighter:before {\n content: \"\\f591\"; }\n\n.fa-hiking:before {\n content: \"\\f6ec\"; }\n\n.fa-hippo:before {\n content: \"\\f6ed\"; }\n\n.fa-hips:before {\n content: \"\\f452\"; }\n\n.fa-hire-a-helper:before {\n content: \"\\f3b0\"; }\n\n.fa-history:before {\n content: \"\\f1da\"; }\n\n.fa-hockey-puck:before {\n content: \"\\f453\"; }\n\n.fa-holly-berry:before {\n content: \"\\f7aa\"; }\n\n.fa-home:before {\n content: \"\\f015\"; }\n\n.fa-hooli:before {\n content: \"\\f427\"; }\n\n.fa-hornbill:before {\n content: \"\\f592\"; }\n\n.fa-horse:before {\n content: \"\\f6f0\"; }\n\n.fa-horse-head:before {\n content: \"\\f7ab\"; }\n\n.fa-hospital:before {\n content: \"\\f0f8\"; }\n\n.fa-hospital-alt:before {\n content: \"\\f47d\"; }\n\n.fa-hospital-symbol:before {\n content: \"\\f47e\"; }\n\n.fa-hospital-user:before {\n content: \"\\f80d\"; }\n\n.fa-hot-tub:before {\n content: \"\\f593\"; }\n\n.fa-hotdog:before {\n content: \"\\f80f\"; }\n\n.fa-hotel:before {\n content: \"\\f594\"; }\n\n.fa-hotjar:before {\n content: \"\\f3b1\"; }\n\n.fa-hourglass:before {\n content: \"\\f254\"; }\n\n.fa-hourglass-end:before {\n content: \"\\f253\"; }\n\n.fa-hourglass-half:before {\n content: \"\\f252\"; }\n\n.fa-hourglass-start:before {\n content: \"\\f251\"; }\n\n.fa-house-damage:before {\n content: \"\\f6f1\"; }\n\n.fa-house-user:before {\n content: \"\\e065\"; }\n\n.fa-houzz:before {\n content: \"\\f27c\"; }\n\n.fa-hryvnia:before {\n content: \"\\f6f2\"; }\n\n.fa-html5:before {\n content: \"\\f13b\"; }\n\n.fa-hubspot:before {\n content: \"\\f3b2\"; }\n\n.fa-i-cursor:before {\n content: \"\\f246\"; }\n\n.fa-ice-cream:before {\n content: \"\\f810\"; }\n\n.fa-icicles:before {\n content: \"\\f7ad\"; }\n\n.fa-icons:before {\n content: \"\\f86d\"; }\n\n.fa-id-badge:before {\n content: \"\\f2c1\"; }\n\n.fa-id-card:before {\n content: \"\\f2c2\"; }\n\n.fa-id-card-alt:before {\n content: \"\\f47f\"; }\n\n.fa-ideal:before {\n content: \"\\e013\"; }\n\n.fa-igloo:before {\n content: \"\\f7ae\"; }\n\n.fa-image:before {\n content: \"\\f03e\"; }\n\n.fa-images:before {\n content: \"\\f302\"; }\n\n.fa-imdb:before {\n content: \"\\f2d8\"; }\n\n.fa-inbox:before {\n content: \"\\f01c\"; }\n\n.fa-indent:before {\n content: \"\\f03c\"; }\n\n.fa-industry:before {\n content: \"\\f275\"; }\n\n.fa-infinity:before {\n content: \"\\f534\"; }\n\n.fa-info:before {\n content: \"\\f129\"; }\n\n.fa-info-circle:before {\n content: \"\\f05a\"; }\n\n.fa-instagram:before {\n content: \"\\f16d\"; }\n\n.fa-instagram-square:before {\n content: \"\\e055\"; }\n\n.fa-intercom:before {\n content: \"\\f7af\"; }\n\n.fa-internet-explorer:before {\n content: \"\\f26b\"; }\n\n.fa-invision:before {\n content: \"\\f7b0\"; }\n\n.fa-ioxhost:before {\n content: \"\\f208\"; }\n\n.fa-italic:before {\n content: \"\\f033\"; }\n\n.fa-itch-io:before {\n content: \"\\f83a\"; }\n\n.fa-itunes:before {\n content: \"\\f3b4\"; }\n\n.fa-itunes-note:before {\n content: \"\\f3b5\"; }\n\n.fa-java:before {\n content: \"\\f4e4\"; }\n\n.fa-jedi:before {\n content: \"\\f669\"; }\n\n.fa-jedi-order:before {\n content: \"\\f50e\"; }\n\n.fa-jenkins:before {\n content: \"\\f3b6\"; }\n\n.fa-jira:before {\n content: \"\\f7b1\"; }\n\n.fa-joget:before {\n content: \"\\f3b7\"; }\n\n.fa-joint:before {\n content: \"\\f595\"; }\n\n.fa-joomla:before {\n content: \"\\f1aa\"; }\n\n.fa-journal-whills:before {\n content: \"\\f66a\"; }\n\n.fa-js:before {\n content: \"\\f3b8\"; }\n\n.fa-js-square:before {\n content: \"\\f3b9\"; }\n\n.fa-jsfiddle:before {\n content: \"\\f1cc\"; }\n\n.fa-kaaba:before {\n content: \"\\f66b\"; }\n\n.fa-kaggle:before {\n content: \"\\f5fa\"; }\n\n.fa-key:before {\n content: \"\\f084\"; }\n\n.fa-keybase:before {\n content: \"\\f4f5\"; }\n\n.fa-keyboard:before {\n content: \"\\f11c\"; }\n\n.fa-keycdn:before {\n content: \"\\f3ba\"; }\n\n.fa-khanda:before {\n content: \"\\f66d\"; }\n\n.fa-kickstarter:before {\n content: \"\\f3bb\"; }\n\n.fa-kickstarter-k:before {\n content: \"\\f3bc\"; }\n\n.fa-kiss:before {\n content: \"\\f596\"; }\n\n.fa-kiss-beam:before {\n content: \"\\f597\"; }\n\n.fa-kiss-wink-heart:before {\n content: \"\\f598\"; }\n\n.fa-kiwi-bird:before {\n content: \"\\f535\"; }\n\n.fa-korvue:before {\n content: \"\\f42f\"; }\n\n.fa-landmark:before {\n content: \"\\f66f\"; }\n\n.fa-language:before {\n content: \"\\f1ab\"; }\n\n.fa-laptop:before {\n content: \"\\f109\"; }\n\n.fa-laptop-code:before {\n content: \"\\f5fc\"; }\n\n.fa-laptop-house:before {\n content: \"\\e066\"; }\n\n.fa-laptop-medical:before {\n content: \"\\f812\"; }\n\n.fa-laravel:before {\n content: \"\\f3bd\"; }\n\n.fa-lastfm:before {\n content: \"\\f202\"; }\n\n.fa-lastfm-square:before {\n content: \"\\f203\"; }\n\n.fa-laugh:before {\n content: \"\\f599\"; }\n\n.fa-laugh-beam:before {\n content: \"\\f59a\"; }\n\n.fa-laugh-squint:before {\n content: \"\\f59b\"; }\n\n.fa-laugh-wink:before {\n content: \"\\f59c\"; }\n\n.fa-layer-group:before {\n content: \"\\f5fd\"; }\n\n.fa-leaf:before {\n content: \"\\f06c\"; }\n\n.fa-leanpub:before {\n content: \"\\f212\"; }\n\n.fa-lemon:before {\n content: \"\\f094\"; }\n\n.fa-less:before {\n content: \"\\f41d\"; }\n\n.fa-less-than:before {\n content: \"\\f536\"; }\n\n.fa-less-than-equal:before {\n content: \"\\f537\"; }\n\n.fa-level-down-alt:before {\n content: \"\\f3be\"; }\n\n.fa-level-up-alt:before {\n content: \"\\f3bf\"; }\n\n.fa-life-ring:before {\n content: \"\\f1cd\"; }\n\n.fa-lightbulb:before {\n content: \"\\f0eb\"; }\n\n.fa-line:before {\n content: \"\\f3c0\"; }\n\n.fa-link:before {\n content: \"\\f0c1\"; }\n\n.fa-linkedin:before {\n content: \"\\f08c\"; }\n\n.fa-linkedin-in:before {\n content: \"\\f0e1\"; }\n\n.fa-linode:before {\n content: \"\\f2b8\"; }\n\n.fa-linux:before {\n content: \"\\f17c\"; }\n\n.fa-lira-sign:before {\n content: \"\\f195\"; }\n\n.fa-list:before {\n content: \"\\f03a\"; }\n\n.fa-list-alt:before {\n content: \"\\f022\"; }\n\n.fa-list-ol:before {\n content: \"\\f0cb\"; }\n\n.fa-list-ul:before {\n content: \"\\f0ca\"; }\n\n.fa-location-arrow:before {\n content: \"\\f124\"; }\n\n.fa-lock:before {\n content: \"\\f023\"; }\n\n.fa-lock-open:before {\n content: \"\\f3c1\"; }\n\n.fa-long-arrow-alt-down:before {\n content: \"\\f309\"; }\n\n.fa-long-arrow-alt-left:before {\n content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-right:before {\n content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-up:before {\n content: \"\\f30c\"; }\n\n.fa-low-vision:before {\n content: \"\\f2a8\"; }\n\n.fa-luggage-cart:before {\n content: \"\\f59d\"; }\n\n.fa-lungs:before {\n content: \"\\f604\"; }\n\n.fa-lungs-virus:before {\n content: \"\\e067\"; }\n\n.fa-lyft:before {\n content: \"\\f3c3\"; }\n\n.fa-magento:before {\n content: \"\\f3c4\"; }\n\n.fa-magic:before {\n content: \"\\f0d0\"; }\n\n.fa-magnet:before {\n content: \"\\f076\"; }\n\n.fa-mail-bulk:before {\n content: \"\\f674\"; }\n\n.fa-mailchimp:before {\n content: \"\\f59e\"; }\n\n.fa-male:before {\n content: \"\\f183\"; }\n\n.fa-mandalorian:before {\n content: \"\\f50f\"; }\n\n.fa-map:before {\n content: \"\\f279\"; }\n\n.fa-map-marked:before {\n content: \"\\f59f\"; }\n\n.fa-map-marked-alt:before {\n content: \"\\f5a0\"; }\n\n.fa-map-marker:before {\n content: \"\\f041\"; }\n\n.fa-map-marker-alt:before {\n content: \"\\f3c5\"; }\n\n.fa-map-pin:before {\n content: \"\\f276\"; }\n\n.fa-map-signs:before {\n content: \"\\f277\"; }\n\n.fa-markdown:before {\n content: \"\\f60f\"; }\n\n.fa-marker:before {\n content: \"\\f5a1\"; }\n\n.fa-mars:before {\n content: \"\\f222\"; }\n\n.fa-mars-double:before {\n content: \"\\f227\"; }\n\n.fa-mars-stroke:before {\n content: \"\\f229\"; }\n\n.fa-mars-stroke-h:before {\n content: \"\\f22b\"; }\n\n.fa-mars-stroke-v:before {\n content: \"\\f22a\"; }\n\n.fa-mask:before {\n content: \"\\f6fa\"; }\n\n.fa-mastodon:before {\n content: \"\\f4f6\"; }\n\n.fa-maxcdn:before {\n content: \"\\f136\"; }\n\n.fa-mdb:before {\n content: \"\\f8ca\"; }\n\n.fa-medal:before {\n content: \"\\f5a2\"; }\n\n.fa-medapps:before {\n content: \"\\f3c6\"; }\n\n.fa-medium:before {\n content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n content: \"\\f3c7\"; }\n\n.fa-medkit:before {\n content: \"\\f0fa\"; }\n\n.fa-medrt:before {\n content: \"\\f3c8\"; }\n\n.fa-meetup:before {\n content: \"\\f2e0\"; }\n\n.fa-megaport:before {\n content: \"\\f5a3\"; }\n\n.fa-meh:before {\n content: \"\\f11a\"; }\n\n.fa-meh-blank:before {\n content: \"\\f5a4\"; }\n\n.fa-meh-rolling-eyes:before {\n content: \"\\f5a5\"; }\n\n.fa-memory:before {\n content: \"\\f538\"; }\n\n.fa-mendeley:before {\n content: \"\\f7b3\"; }\n\n.fa-menorah:before {\n content: \"\\f676\"; }\n\n.fa-mercury:before {\n content: \"\\f223\"; }\n\n.fa-meteor:before {\n content: \"\\f753\"; }\n\n.fa-microblog:before {\n content: \"\\e01a\"; }\n\n.fa-microchip:before {\n content: \"\\f2db\"; }\n\n.fa-microphone:before {\n content: \"\\f130\"; }\n\n.fa-microphone-alt:before {\n content: \"\\f3c9\"; }\n\n.fa-microphone-alt-slash:before {\n content: \"\\f539\"; }\n\n.fa-microphone-slash:before {\n content: \"\\f131\"; }\n\n.fa-microscope:before {\n content: \"\\f610\"; }\n\n.fa-microsoft:before {\n content: \"\\f3ca\"; }\n\n.fa-minus:before {\n content: \"\\f068\"; }\n\n.fa-minus-circle:before {\n content: \"\\f056\"; }\n\n.fa-minus-square:before {\n content: \"\\f146\"; }\n\n.fa-mitten:before {\n content: \"\\f7b5\"; }\n\n.fa-mix:before {\n content: \"\\f3cb\"; }\n\n.fa-mixcloud:before {\n content: \"\\f289\"; }\n\n.fa-mixer:before {\n content: \"\\e056\"; }\n\n.fa-mizuni:before {\n content: \"\\f3cc\"; }\n\n.fa-mobile:before {\n content: \"\\f10b\"; }\n\n.fa-mobile-alt:before {\n content: \"\\f3cd\"; }\n\n.fa-modx:before {\n content: \"\\f285\"; }\n\n.fa-monero:before {\n content: \"\\f3d0\"; }\n\n.fa-money-bill:before {\n content: \"\\f0d6\"; }\n\n.fa-money-bill-alt:before {\n content: \"\\f3d1\"; }\n\n.fa-money-bill-wave:before {\n content: \"\\f53a\"; }\n\n.fa-money-bill-wave-alt:before {\n content: \"\\f53b\"; }\n\n.fa-money-check:before {\n content: \"\\f53c\"; }\n\n.fa-money-check-alt:before {\n content: \"\\f53d\"; }\n\n.fa-monument:before {\n content: \"\\f5a6\"; }\n\n.fa-moon:before {\n content: \"\\f186\"; }\n\n.fa-mortar-pestle:before {\n content: \"\\f5a7\"; }\n\n.fa-mosque:before {\n content: \"\\f678\"; }\n\n.fa-motorcycle:before {\n content: \"\\f21c\"; }\n\n.fa-mountain:before {\n content: \"\\f6fc\"; }\n\n.fa-mouse:before {\n content: \"\\f8cc\"; }\n\n.fa-mouse-pointer:before {\n content: \"\\f245\"; }\n\n.fa-mug-hot:before {\n content: \"\\f7b6\"; }\n\n.fa-music:before {\n content: \"\\f001\"; }\n\n.fa-napster:before {\n content: \"\\f3d2\"; }\n\n.fa-neos:before {\n content: \"\\f612\"; }\n\n.fa-network-wired:before {\n content: \"\\f6ff\"; }\n\n.fa-neuter:before {\n content: \"\\f22c\"; }\n\n.fa-newspaper:before {\n content: \"\\f1ea\"; }\n\n.fa-nimblr:before {\n content: \"\\f5a8\"; }\n\n.fa-node:before {\n content: \"\\f419\"; }\n\n.fa-node-js:before {\n content: \"\\f3d3\"; }\n\n.fa-not-equal:before {\n content: \"\\f53e\"; }\n\n.fa-notes-medical:before {\n content: \"\\f481\"; }\n\n.fa-npm:before {\n content: \"\\f3d4\"; }\n\n.fa-ns8:before {\n content: \"\\f3d5\"; }\n\n.fa-nutritionix:before {\n content: \"\\f3d6\"; }\n\n.fa-object-group:before {\n content: \"\\f247\"; }\n\n.fa-object-ungroup:before {\n content: \"\\f248\"; }\n\n.fa-odnoklassniki:before {\n content: \"\\f263\"; }\n\n.fa-odnoklassniki-square:before {\n content: \"\\f264\"; }\n\n.fa-oil-can:before {\n content: \"\\f613\"; }\n\n.fa-old-republic:before {\n content: \"\\f510\"; }\n\n.fa-om:before {\n content: \"\\f679\"; }\n\n.fa-opencart:before {\n content: \"\\f23d\"; }\n\n.fa-openid:before {\n content: \"\\f19b\"; }\n\n.fa-opera:before {\n content: \"\\f26a\"; }\n\n.fa-optin-monster:before {\n content: \"\\f23c\"; }\n\n.fa-orcid:before {\n content: \"\\f8d2\"; }\n\n.fa-osi:before {\n content: \"\\f41a\"; }\n\n.fa-otter:before {\n content: \"\\f700\"; }\n\n.fa-outdent:before {\n content: \"\\f03b\"; }\n\n.fa-page4:before {\n content: \"\\f3d7\"; }\n\n.fa-pagelines:before {\n content: \"\\f18c\"; }\n\n.fa-pager:before {\n content: \"\\f815\"; }\n\n.fa-paint-brush:before {\n content: \"\\f1fc\"; }\n\n.fa-paint-roller:before {\n content: \"\\f5aa\"; }\n\n.fa-palette:before {\n content: \"\\f53f\"; }\n\n.fa-palfed:before {\n content: \"\\f3d8\"; }\n\n.fa-pallet:before {\n content: \"\\f482\"; }\n\n.fa-paper-plane:before {\n content: \"\\f1d8\"; }\n\n.fa-paperclip:before {\n content: \"\\f0c6\"; }\n\n.fa-parachute-box:before {\n content: \"\\f4cd\"; }\n\n.fa-paragraph:before {\n content: \"\\f1dd\"; }\n\n.fa-parking:before {\n content: \"\\f540\"; }\n\n.fa-passport:before {\n content: \"\\f5ab\"; }\n\n.fa-pastafarianism:before {\n content: \"\\f67b\"; }\n\n.fa-paste:before {\n content: \"\\f0ea\"; }\n\n.fa-patreon:before {\n content: \"\\f3d9\"; }\n\n.fa-pause:before {\n content: \"\\f04c\"; }\n\n.fa-pause-circle:before {\n content: \"\\f28b\"; }\n\n.fa-paw:before {\n content: \"\\f1b0\"; }\n\n.fa-paypal:before {\n content: \"\\f1ed\"; }\n\n.fa-peace:before {\n content: \"\\f67c\"; }\n\n.fa-pen:before {\n content: \"\\f304\"; }\n\n.fa-pen-alt:before {\n content: \"\\f305\"; }\n\n.fa-pen-fancy:before {\n content: \"\\f5ac\"; }\n\n.fa-pen-nib:before {\n content: \"\\f5ad\"; }\n\n.fa-pen-square:before {\n content: \"\\f14b\"; }\n\n.fa-pencil-alt:before {\n content: \"\\f303\"; }\n\n.fa-pencil-ruler:before {\n content: \"\\f5ae\"; }\n\n.fa-penny-arcade:before {\n content: \"\\f704\"; }\n\n.fa-people-arrows:before {\n content: \"\\e068\"; }\n\n.fa-people-carry:before {\n content: \"\\f4ce\"; }\n\n.fa-pepper-hot:before {\n content: \"\\f816\"; }\n\n.fa-percent:before {\n content: \"\\f295\"; }\n\n.fa-percentage:before {\n content: \"\\f541\"; }\n\n.fa-periscope:before {\n content: \"\\f3da\"; }\n\n.fa-person-booth:before {\n content: \"\\f756\"; }\n\n.fa-phabricator:before {\n content: \"\\f3db\"; }\n\n.fa-phoenix-framework:before {\n content: \"\\f3dc\"; }\n\n.fa-phoenix-squadron:before {\n content: \"\\f511\"; }\n\n.fa-phone:before {\n content: \"\\f095\"; }\n\n.fa-phone-alt:before {\n content: \"\\f879\"; }\n\n.fa-phone-slash:before {\n content: \"\\f3dd\"; }\n\n.fa-phone-square:before {\n content: \"\\f098\"; }\n\n.fa-phone-square-alt:before {\n content: \"\\f87b\"; }\n\n.fa-phone-volume:before {\n content: \"\\f2a0\"; }\n\n.fa-photo-video:before {\n content: \"\\f87c\"; }\n\n.fa-php:before {\n content: \"\\f457\"; }\n\n.fa-pied-piper:before {\n content: \"\\f2ae\"; }\n\n.fa-pied-piper-alt:before {\n content: \"\\f1a8\"; }\n\n.fa-pied-piper-hat:before {\n content: \"\\f4e5\"; }\n\n.fa-pied-piper-pp:before {\n content: \"\\f1a7\"; }\n\n.fa-pied-piper-square:before {\n content: \"\\e01e\"; }\n\n.fa-piggy-bank:before {\n content: \"\\f4d3\"; }\n\n.fa-pills:before {\n content: \"\\f484\"; }\n\n.fa-pinterest:before {\n content: \"\\f0d2\"; }\n\n.fa-pinterest-p:before {\n content: \"\\f231\"; }\n\n.fa-pinterest-square:before {\n content: \"\\f0d3\"; }\n\n.fa-pizza-slice:before {\n content: \"\\f818\"; }\n\n.fa-place-of-worship:before {\n content: \"\\f67f\"; }\n\n.fa-plane:before {\n content: \"\\f072\"; }\n\n.fa-plane-arrival:before {\n content: \"\\f5af\"; }\n\n.fa-plane-departure:before {\n content: \"\\f5b0\"; }\n\n.fa-plane-slash:before {\n content: \"\\e069\"; }\n\n.fa-play:before {\n content: \"\\f04b\"; }\n\n.fa-play-circle:before {\n content: \"\\f144\"; }\n\n.fa-playstation:before {\n content: \"\\f3df\"; }\n\n.fa-plug:before {\n content: \"\\f1e6\"; }\n\n.fa-plus:before {\n content: \"\\f067\"; }\n\n.fa-plus-circle:before {\n content: \"\\f055\"; }\n\n.fa-plus-square:before {\n content: \"\\f0fe\"; }\n\n.fa-podcast:before {\n content: \"\\f2ce\"; }\n\n.fa-poll:before {\n content: \"\\f681\"; }\n\n.fa-poll-h:before {\n content: \"\\f682\"; }\n\n.fa-poo:before {\n content: \"\\f2fe\"; }\n\n.fa-poo-storm:before {\n content: \"\\f75a\"; }\n\n.fa-poop:before {\n content: \"\\f619\"; }\n\n.fa-portrait:before {\n content: \"\\f3e0\"; }\n\n.fa-pound-sign:before {\n content: \"\\f154\"; }\n\n.fa-power-off:before {\n content: \"\\f011\"; }\n\n.fa-pray:before {\n content: \"\\f683\"; }\n\n.fa-praying-hands:before {\n content: \"\\f684\"; }\n\n.fa-prescription:before {\n content: \"\\f5b1\"; }\n\n.fa-prescription-bottle:before {\n content: \"\\f485\"; }\n\n.fa-prescription-bottle-alt:before {\n content: \"\\f486\"; }\n\n.fa-print:before {\n content: \"\\f02f\"; }\n\n.fa-procedures:before {\n content: \"\\f487\"; }\n\n.fa-product-hunt:before {\n content: \"\\f288\"; }\n\n.fa-project-diagram:before {\n content: \"\\f542\"; }\n\n.fa-pump-medical:before {\n content: \"\\e06a\"; }\n\n.fa-pump-soap:before {\n content: \"\\e06b\"; }\n\n.fa-pushed:before {\n content: \"\\f3e1\"; }\n\n.fa-puzzle-piece:before {\n content: \"\\f12e\"; }\n\n.fa-python:before {\n content: \"\\f3e2\"; }\n\n.fa-qq:before {\n content: \"\\f1d6\"; }\n\n.fa-qrcode:before {\n content: \"\\f029\"; }\n\n.fa-question:before {\n content: \"\\f128\"; }\n\n.fa-question-circle:before {\n content: \"\\f059\"; }\n\n.fa-quidditch:before {\n content: \"\\f458\"; }\n\n.fa-quinscape:before {\n content: \"\\f459\"; }\n\n.fa-quora:before {\n content: \"\\f2c4\"; }\n\n.fa-quote-left:before {\n content: \"\\f10d\"; }\n\n.fa-quote-right:before {\n content: \"\\f10e\"; }\n\n.fa-quran:before {\n content: \"\\f687\"; }\n\n.fa-r-project:before {\n content: \"\\f4f7\"; }\n\n.fa-radiation:before {\n content: \"\\f7b9\"; }\n\n.fa-radiation-alt:before {\n content: \"\\f7ba\"; }\n\n.fa-rainbow:before {\n content: \"\\f75b\"; }\n\n.fa-random:before {\n content: \"\\f074\"; }\n\n.fa-raspberry-pi:before {\n content: \"\\f7bb\"; }\n\n.fa-ravelry:before {\n content: \"\\f2d9\"; }\n\n.fa-react:before {\n content: \"\\f41b\"; }\n\n.fa-reacteurope:before {\n content: \"\\f75d\"; }\n\n.fa-readme:before {\n content: \"\\f4d5\"; }\n\n.fa-rebel:before {\n content: \"\\f1d0\"; }\n\n.fa-receipt:before {\n content: \"\\f543\"; }\n\n.fa-record-vinyl:before {\n content: \"\\f8d9\"; }\n\n.fa-recycle:before {\n content: \"\\f1b8\"; }\n\n.fa-red-river:before {\n content: \"\\f3e3\"; }\n\n.fa-reddit:before {\n content: \"\\f1a1\"; }\n\n.fa-reddit-alien:before {\n content: \"\\f281\"; }\n\n.fa-reddit-square:before {\n content: \"\\f1a2\"; }\n\n.fa-redhat:before {\n content: \"\\f7bc\"; }\n\n.fa-redo:before {\n content: \"\\f01e\"; }\n\n.fa-redo-alt:before {\n content: \"\\f2f9\"; }\n\n.fa-registered:before {\n content: \"\\f25d\"; }\n\n.fa-remove-format:before {\n content: \"\\f87d\"; }\n\n.fa-renren:before {\n content: \"\\f18b\"; }\n\n.fa-reply:before {\n content: \"\\f3e5\"; }\n\n.fa-reply-all:before {\n content: \"\\f122\"; }\n\n.fa-replyd:before {\n content: \"\\f3e6\"; }\n\n.fa-republican:before {\n content: \"\\f75e\"; }\n\n.fa-researchgate:before {\n content: \"\\f4f8\"; }\n\n.fa-resolving:before {\n content: \"\\f3e7\"; }\n\n.fa-restroom:before {\n content: \"\\f7bd\"; }\n\n.fa-retweet:before {\n content: \"\\f079\"; }\n\n.fa-rev:before {\n content: \"\\f5b2\"; }\n\n.fa-ribbon:before {\n content: \"\\f4d6\"; }\n\n.fa-ring:before {\n content: \"\\f70b\"; }\n\n.fa-road:before {\n content: \"\\f018\"; }\n\n.fa-robot:before {\n content: \"\\f544\"; }\n\n.fa-rocket:before {\n content: \"\\f135\"; }\n\n.fa-rocketchat:before {\n content: \"\\f3e8\"; }\n\n.fa-rockrms:before {\n content: \"\\f3e9\"; }\n\n.fa-route:before {\n content: \"\\f4d7\"; }\n\n.fa-rss:before {\n content: \"\\f09e\"; }\n\n.fa-rss-square:before {\n content: \"\\f143\"; }\n\n.fa-ruble-sign:before {\n content: \"\\f158\"; }\n\n.fa-ruler:before {\n content: \"\\f545\"; }\n\n.fa-ruler-combined:before {\n content: \"\\f546\"; }\n\n.fa-ruler-horizontal:before {\n content: \"\\f547\"; }\n\n.fa-ruler-vertical:before {\n content: \"\\f548\"; }\n\n.fa-running:before {\n content: \"\\f70c\"; }\n\n.fa-rupee-sign:before {\n content: \"\\f156\"; }\n\n.fa-rust:before {\n content: \"\\e07a\"; }\n\n.fa-sad-cry:before {\n content: \"\\f5b3\"; }\n\n.fa-sad-tear:before {\n content: \"\\f5b4\"; }\n\n.fa-safari:before {\n content: \"\\f267\"; }\n\n.fa-salesforce:before {\n content: \"\\f83b\"; }\n\n.fa-sass:before {\n content: \"\\f41e\"; }\n\n.fa-satellite:before {\n content: \"\\f7bf\"; }\n\n.fa-satellite-dish:before {\n content: \"\\f7c0\"; }\n\n.fa-save:before {\n content: \"\\f0c7\"; }\n\n.fa-schlix:before {\n content: \"\\f3ea\"; }\n\n.fa-school:before {\n content: \"\\f549\"; }\n\n.fa-screwdriver:before {\n content: \"\\f54a\"; }\n\n.fa-scribd:before {\n content: \"\\f28a\"; }\n\n.fa-scroll:before {\n content: \"\\f70e\"; }\n\n.fa-sd-card:before {\n content: \"\\f7c2\"; }\n\n.fa-search:before {\n content: \"\\f002\"; }\n\n.fa-search-dollar:before {\n content: \"\\f688\"; }\n\n.fa-search-location:before {\n content: \"\\f689\"; }\n\n.fa-search-minus:before {\n content: \"\\f010\"; }\n\n.fa-search-plus:before {\n content: \"\\f00e\"; }\n\n.fa-searchengin:before {\n content: \"\\f3eb\"; }\n\n.fa-seedling:before {\n content: \"\\f4d8\"; }\n\n.fa-sellcast:before {\n content: \"\\f2da\"; }\n\n.fa-sellsy:before {\n content: \"\\f213\"; }\n\n.fa-server:before {\n content: \"\\f233\"; }\n\n.fa-servicestack:before {\n content: \"\\f3ec\"; }\n\n.fa-shapes:before {\n content: \"\\f61f\"; }\n\n.fa-share:before {\n content: \"\\f064\"; }\n\n.fa-share-alt:before {\n content: \"\\f1e0\"; }\n\n.fa-share-alt-square:before {\n content: \"\\f1e1\"; }\n\n.fa-share-square:before {\n content: \"\\f14d\"; }\n\n.fa-shekel-sign:before {\n content: \"\\f20b\"; }\n\n.fa-shield-alt:before {\n content: \"\\f3ed\"; }\n\n.fa-shield-virus:before {\n content: \"\\e06c\"; }\n\n.fa-ship:before {\n content: \"\\f21a\"; }\n\n.fa-shipping-fast:before {\n content: \"\\f48b\"; }\n\n.fa-shirtsinbulk:before {\n content: \"\\f214\"; }\n\n.fa-shoe-prints:before {\n content: \"\\f54b\"; }\n\n.fa-shopify:before {\n content: \"\\e057\"; }\n\n.fa-shopping-bag:before {\n content: \"\\f290\"; }\n\n.fa-shopping-basket:before {\n content: \"\\f291\"; }\n\n.fa-shopping-cart:before {\n content: \"\\f07a\"; }\n\n.fa-shopware:before {\n content: \"\\f5b5\"; }\n\n.fa-shower:before {\n content: \"\\f2cc\"; }\n\n.fa-shuttle-van:before {\n content: \"\\f5b6\"; }\n\n.fa-sign:before {\n content: \"\\f4d9\"; }\n\n.fa-sign-in-alt:before {\n content: \"\\f2f6\"; }\n\n.fa-sign-language:before {\n content: \"\\f2a7\"; }\n\n.fa-sign-out-alt:before {\n content: \"\\f2f5\"; }\n\n.fa-signal:before {\n content: \"\\f012\"; }\n\n.fa-signature:before {\n content: \"\\f5b7\"; }\n\n.fa-sim-card:before {\n content: \"\\f7c4\"; }\n\n.fa-simplybuilt:before {\n content: \"\\f215\"; }\n\n.fa-sink:before {\n content: \"\\e06d\"; }\n\n.fa-sistrix:before {\n content: \"\\f3ee\"; }\n\n.fa-sitemap:before {\n content: \"\\f0e8\"; }\n\n.fa-sith:before {\n content: \"\\f512\"; }\n\n.fa-skating:before {\n content: \"\\f7c5\"; }\n\n.fa-sketch:before {\n content: \"\\f7c6\"; }\n\n.fa-skiing:before {\n content: \"\\f7c9\"; }\n\n.fa-skiing-nordic:before {\n content: \"\\f7ca\"; }\n\n.fa-skull:before {\n content: \"\\f54c\"; }\n\n.fa-skull-crossbones:before {\n content: \"\\f714\"; }\n\n.fa-skyatlas:before {\n content: \"\\f216\"; }\n\n.fa-skype:before {\n content: \"\\f17e\"; }\n\n.fa-slack:before {\n content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n content: \"\\f3ef\"; }\n\n.fa-slash:before {\n content: \"\\f715\"; }\n\n.fa-sleigh:before {\n content: \"\\f7cc\"; }\n\n.fa-sliders-h:before {\n content: \"\\f1de\"; }\n\n.fa-slideshare:before {\n content: \"\\f1e7\"; }\n\n.fa-smile:before {\n content: \"\\f118\"; }\n\n.fa-smile-beam:before {\n content: \"\\f5b8\"; }\n\n.fa-smile-wink:before {\n content: \"\\f4da\"; }\n\n.fa-smog:before {\n content: \"\\f75f\"; }\n\n.fa-smoking:before {\n content: \"\\f48d\"; }\n\n.fa-smoking-ban:before {\n content: \"\\f54d\"; }\n\n.fa-sms:before {\n content: \"\\f7cd\"; }\n\n.fa-snapchat:before {\n content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n content: \"\\f2ac\"; }\n\n.fa-snapchat-square:before {\n content: \"\\f2ad\"; }\n\n.fa-snowboarding:before {\n content: \"\\f7ce\"; }\n\n.fa-snowflake:before {\n content: \"\\f2dc\"; }\n\n.fa-snowman:before {\n content: \"\\f7d0\"; }\n\n.fa-snowplow:before {\n content: \"\\f7d2\"; }\n\n.fa-soap:before {\n content: \"\\e06e\"; }\n\n.fa-socks:before {\n content: \"\\f696\"; }\n\n.fa-solar-panel:before {\n content: \"\\f5ba\"; }\n\n.fa-sort:before {\n content: \"\\f0dc\"; }\n\n.fa-sort-alpha-down:before {\n content: \"\\f15d\"; }\n\n.fa-sort-alpha-down-alt:before {\n content: \"\\f881\"; }\n\n.fa-sort-alpha-up:before {\n content: \"\\f15e\"; }\n\n.fa-sort-alpha-up-alt:before {\n content: \"\\f882\"; }\n\n.fa-sort-amount-down:before {\n content: \"\\f160\"; }\n\n.fa-sort-amount-down-alt:before {\n content: \"\\f884\"; }\n\n.fa-sort-amount-up:before {\n content: \"\\f161\"; }\n\n.fa-sort-amount-up-alt:before {\n content: \"\\f885\"; }\n\n.fa-sort-down:before {\n content: \"\\f0dd\"; }\n\n.fa-sort-numeric-down:before {\n content: \"\\f162\"; }\n\n.fa-sort-numeric-down-alt:before {\n content: \"\\f886\"; }\n\n.fa-sort-numeric-up:before {\n content: \"\\f163\"; }\n\n.fa-sort-numeric-up-alt:before {\n content: \"\\f887\"; }\n\n.fa-sort-up:before {\n content: \"\\f0de\"; }\n\n.fa-soundcloud:before {\n content: \"\\f1be\"; }\n\n.fa-sourcetree:before {\n content: \"\\f7d3\"; }\n\n.fa-spa:before {\n content: \"\\f5bb\"; }\n\n.fa-space-shuttle:before {\n content: \"\\f197\"; }\n\n.fa-speakap:before {\n content: \"\\f3f3\"; }\n\n.fa-speaker-deck:before {\n content: \"\\f83c\"; }\n\n.fa-spell-check:before {\n content: \"\\f891\"; }\n\n.fa-spider:before {\n content: \"\\f717\"; }\n\n.fa-spinner:before {\n content: \"\\f110\"; }\n\n.fa-splotch:before {\n content: \"\\f5bc\"; }\n\n.fa-spotify:before {\n content: \"\\f1bc\"; }\n\n.fa-spray-can:before {\n content: \"\\f5bd\"; }\n\n.fa-square:before {\n content: \"\\f0c8\"; }\n\n.fa-square-full:before {\n content: \"\\f45c\"; }\n\n.fa-square-root-alt:before {\n content: \"\\f698\"; }\n\n.fa-squarespace:before {\n content: \"\\f5be\"; }\n\n.fa-stack-exchange:before {\n content: \"\\f18d\"; }\n\n.fa-stack-overflow:before {\n content: \"\\f16c\"; }\n\n.fa-stackpath:before {\n content: \"\\f842\"; }\n\n.fa-stamp:before {\n content: \"\\f5bf\"; }\n\n.fa-star:before {\n content: \"\\f005\"; }\n\n.fa-star-and-crescent:before {\n content: \"\\f699\"; }\n\n.fa-star-half:before {\n content: \"\\f089\"; }\n\n.fa-star-half-alt:before {\n content: \"\\f5c0\"; }\n\n.fa-star-of-david:before {\n content: \"\\f69a\"; }\n\n.fa-star-of-life:before {\n content: \"\\f621\"; }\n\n.fa-staylinked:before {\n content: \"\\f3f5\"; }\n\n.fa-steam:before {\n content: \"\\f1b6\"; }\n\n.fa-steam-square:before {\n content: \"\\f1b7\"; }\n\n.fa-steam-symbol:before {\n content: \"\\f3f6\"; }\n\n.fa-step-backward:before {\n content: \"\\f048\"; }\n\n.fa-step-forward:before {\n content: \"\\f051\"; }\n\n.fa-stethoscope:before {\n content: \"\\f0f1\"; }\n\n.fa-sticker-mule:before {\n content: \"\\f3f7\"; }\n\n.fa-sticky-note:before {\n content: \"\\f249\"; }\n\n.fa-stop:before {\n content: \"\\f04d\"; }\n\n.fa-stop-circle:before {\n content: \"\\f28d\"; }\n\n.fa-stopwatch:before {\n content: \"\\f2f2\"; }\n\n.fa-stopwatch-20:before {\n content: \"\\e06f\"; }\n\n.fa-store:before {\n content: \"\\f54e\"; }\n\n.fa-store-alt:before {\n content: \"\\f54f\"; }\n\n.fa-store-alt-slash:before {\n content: \"\\e070\"; }\n\n.fa-store-slash:before {\n content: \"\\e071\"; }\n\n.fa-strava:before {\n content: \"\\f428\"; }\n\n.fa-stream:before {\n content: \"\\f550\"; }\n\n.fa-street-view:before {\n content: \"\\f21d\"; }\n\n.fa-strikethrough:before {\n content: \"\\f0cc\"; }\n\n.fa-stripe:before {\n content: \"\\f429\"; }\n\n.fa-stripe-s:before {\n content: \"\\f42a\"; }\n\n.fa-stroopwafel:before {\n content: \"\\f551\"; }\n\n.fa-studiovinari:before {\n content: \"\\f3f8\"; }\n\n.fa-stumbleupon:before {\n content: \"\\f1a4\"; }\n\n.fa-stumbleupon-circle:before {\n content: \"\\f1a3\"; }\n\n.fa-subscript:before {\n content: \"\\f12c\"; }\n\n.fa-subway:before {\n content: \"\\f239\"; }\n\n.fa-suitcase:before {\n content: \"\\f0f2\"; }\n\n.fa-suitcase-rolling:before {\n content: \"\\f5c1\"; }\n\n.fa-sun:before {\n content: \"\\f185\"; }\n\n.fa-superpowers:before {\n content: \"\\f2dd\"; }\n\n.fa-superscript:before {\n content: \"\\f12b\"; }\n\n.fa-supple:before {\n content: \"\\f3f9\"; }\n\n.fa-surprise:before {\n content: \"\\f5c2\"; }\n\n.fa-suse:before {\n content: \"\\f7d6\"; }\n\n.fa-swatchbook:before {\n content: \"\\f5c3\"; }\n\n.fa-swift:before {\n content: \"\\f8e1\"; }\n\n.fa-swimmer:before {\n content: \"\\f5c4\"; }\n\n.fa-swimming-pool:before {\n content: \"\\f5c5\"; }\n\n.fa-symfony:before {\n content: \"\\f83d\"; }\n\n.fa-synagogue:before {\n content: \"\\f69b\"; }\n\n.fa-sync:before {\n content: \"\\f021\"; }\n\n.fa-sync-alt:before {\n content: \"\\f2f1\"; }\n\n.fa-syringe:before {\n content: \"\\f48e\"; }\n\n.fa-table:before {\n content: \"\\f0ce\"; }\n\n.fa-table-tennis:before {\n content: \"\\f45d\"; }\n\n.fa-tablet:before {\n content: \"\\f10a\"; }\n\n.fa-tablet-alt:before {\n content: \"\\f3fa\"; }\n\n.fa-tablets:before {\n content: \"\\f490\"; }\n\n.fa-tachometer-alt:before {\n content: \"\\f3fd\"; }\n\n.fa-tag:before {\n content: \"\\f02b\"; }\n\n.fa-tags:before {\n content: \"\\f02c\"; }\n\n.fa-tape:before {\n content: \"\\f4db\"; }\n\n.fa-tasks:before {\n content: \"\\f0ae\"; }\n\n.fa-taxi:before {\n content: \"\\f1ba\"; }\n\n.fa-teamspeak:before {\n content: \"\\f4f9\"; }\n\n.fa-teeth:before {\n content: \"\\f62e\"; }\n\n.fa-teeth-open:before {\n content: \"\\f62f\"; }\n\n.fa-telegram:before {\n content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n content: \"\\f3fe\"; }\n\n.fa-temperature-high:before {\n content: \"\\f769\"; }\n\n.fa-temperature-low:before {\n content: \"\\f76b\"; }\n\n.fa-tencent-weibo:before {\n content: \"\\f1d5\"; }\n\n.fa-tenge:before {\n content: \"\\f7d7\"; }\n\n.fa-terminal:before {\n content: \"\\f120\"; }\n\n.fa-text-height:before {\n content: \"\\f034\"; }\n\n.fa-text-width:before {\n content: \"\\f035\"; }\n\n.fa-th:before {\n content: \"\\f00a\"; }\n\n.fa-th-large:before {\n content: \"\\f009\"; }\n\n.fa-th-list:before {\n content: \"\\f00b\"; }\n\n.fa-the-red-yeti:before {\n content: \"\\f69d\"; }\n\n.fa-theater-masks:before {\n content: \"\\f630\"; }\n\n.fa-themeco:before {\n content: \"\\f5c6\"; }\n\n.fa-themeisle:before {\n content: \"\\f2b2\"; }\n\n.fa-thermometer:before {\n content: \"\\f491\"; }\n\n.fa-thermometer-empty:before {\n content: \"\\f2cb\"; }\n\n.fa-thermometer-full:before {\n content: \"\\f2c7\"; }\n\n.fa-thermometer-half:before {\n content: \"\\f2c9\"; }\n\n.fa-thermometer-quarter:before {\n content: \"\\f2ca\"; }\n\n.fa-thermometer-three-quarters:before {\n content: \"\\f2c8\"; }\n\n.fa-think-peaks:before {\n content: \"\\f731\"; }\n\n.fa-thumbs-down:before {\n content: \"\\f165\"; }\n\n.fa-thumbs-up:before {\n content: \"\\f164\"; }\n\n.fa-thumbtack:before {\n content: \"\\f08d\"; }\n\n.fa-ticket-alt:before {\n content: \"\\f3ff\"; }\n\n.fa-tiktok:before {\n content: \"\\e07b\"; }\n\n.fa-times:before {\n content: \"\\f00d\"; }\n\n.fa-times-circle:before {\n content: \"\\f057\"; }\n\n.fa-tint:before {\n content: \"\\f043\"; }\n\n.fa-tint-slash:before {\n content: \"\\f5c7\"; }\n\n.fa-tired:before {\n content: \"\\f5c8\"; }\n\n.fa-toggle-off:before {\n content: \"\\f204\"; }\n\n.fa-toggle-on:before {\n content: \"\\f205\"; }\n\n.fa-toilet:before {\n content: \"\\f7d8\"; }\n\n.fa-toilet-paper:before {\n content: \"\\f71e\"; }\n\n.fa-toilet-paper-slash:before {\n content: \"\\e072\"; }\n\n.fa-toolbox:before {\n content: \"\\f552\"; }\n\n.fa-tools:before {\n content: \"\\f7d9\"; }\n\n.fa-tooth:before {\n content: \"\\f5c9\"; }\n\n.fa-torah:before {\n content: \"\\f6a0\"; }\n\n.fa-torii-gate:before {\n content: \"\\f6a1\"; }\n\n.fa-tractor:before {\n content: \"\\f722\"; }\n\n.fa-trade-federation:before {\n content: \"\\f513\"; }\n\n.fa-trademark:before {\n content: \"\\f25c\"; }\n\n.fa-traffic-light:before {\n content: \"\\f637\"; }\n\n.fa-trailer:before {\n content: \"\\e041\"; }\n\n.fa-train:before {\n content: \"\\f238\"; }\n\n.fa-tram:before {\n content: \"\\f7da\"; }\n\n.fa-transgender:before {\n content: \"\\f224\"; }\n\n.fa-transgender-alt:before {\n content: \"\\f225\"; }\n\n.fa-trash:before {\n content: \"\\f1f8\"; }\n\n.fa-trash-alt:before {\n content: \"\\f2ed\"; }\n\n.fa-trash-restore:before {\n content: \"\\f829\"; }\n\n.fa-trash-restore-alt:before {\n content: \"\\f82a\"; }\n\n.fa-tree:before {\n content: \"\\f1bb\"; }\n\n.fa-trello:before {\n content: \"\\f181\"; }\n\n.fa-tripadvisor:before {\n content: \"\\f262\"; }\n\n.fa-trophy:before {\n content: \"\\f091\"; }\n\n.fa-truck:before {\n content: \"\\f0d1\"; }\n\n.fa-truck-loading:before {\n content: \"\\f4de\"; }\n\n.fa-truck-monster:before {\n content: \"\\f63b\"; }\n\n.fa-truck-moving:before {\n content: \"\\f4df\"; }\n\n.fa-truck-pickup:before {\n content: \"\\f63c\"; }\n\n.fa-tshirt:before {\n content: \"\\f553\"; }\n\n.fa-tty:before {\n content: \"\\f1e4\"; }\n\n.fa-tumblr:before {\n content: \"\\f173\"; }\n\n.fa-tumblr-square:before {\n content: \"\\f174\"; }\n\n.fa-tv:before {\n content: \"\\f26c\"; }\n\n.fa-twitch:before {\n content: \"\\f1e8\"; }\n\n.fa-twitter:before {\n content: \"\\f099\"; }\n\n.fa-twitter-square:before {\n content: \"\\f081\"; }\n\n.fa-typo3:before {\n content: \"\\f42b\"; }\n\n.fa-uber:before {\n content: \"\\f402\"; }\n\n.fa-ubuntu:before {\n content: \"\\f7df\"; }\n\n.fa-uikit:before {\n content: \"\\f403\"; }\n\n.fa-umbraco:before {\n content: \"\\f8e8\"; }\n\n.fa-umbrella:before {\n content: \"\\f0e9\"; }\n\n.fa-umbrella-beach:before {\n content: \"\\f5ca\"; }\n\n.fa-underline:before {\n content: \"\\f0cd\"; }\n\n.fa-undo:before {\n content: \"\\f0e2\"; }\n\n.fa-undo-alt:before {\n content: \"\\f2ea\"; }\n\n.fa-uniregistry:before {\n content: \"\\f404\"; }\n\n.fa-unity:before {\n content: \"\\e049\"; }\n\n.fa-universal-access:before {\n content: \"\\f29a\"; }\n\n.fa-university:before {\n content: \"\\f19c\"; }\n\n.fa-unlink:before {\n content: \"\\f127\"; }\n\n.fa-unlock:before {\n content: \"\\f09c\"; }\n\n.fa-unlock-alt:before {\n content: \"\\f13e\"; }\n\n.fa-unsplash:before {\n content: \"\\e07c\"; }\n\n.fa-untappd:before {\n content: \"\\f405\"; }\n\n.fa-upload:before {\n content: \"\\f093\"; }\n\n.fa-ups:before {\n content: \"\\f7e0\"; }\n\n.fa-usb:before {\n content: \"\\f287\"; }\n\n.fa-user:before {\n content: \"\\f007\"; }\n\n.fa-user-alt:before {\n content: \"\\f406\"; }\n\n.fa-user-alt-slash:before {\n content: \"\\f4fa\"; }\n\n.fa-user-astronaut:before {\n content: \"\\f4fb\"; }\n\n.fa-user-check:before {\n content: \"\\f4fc\"; }\n\n.fa-user-circle:before {\n content: \"\\f2bd\"; }\n\n.fa-user-clock:before {\n content: \"\\f4fd\"; }\n\n.fa-user-cog:before {\n content: \"\\f4fe\"; }\n\n.fa-user-edit:before {\n content: \"\\f4ff\"; }\n\n.fa-user-friends:before {\n content: \"\\f500\"; }\n\n.fa-user-graduate:before {\n content: \"\\f501\"; }\n\n.fa-user-injured:before {\n content: \"\\f728\"; }\n\n.fa-user-lock:before {\n content: \"\\f502\"; }\n\n.fa-user-md:before {\n content: \"\\f0f0\"; }\n\n.fa-user-minus:before {\n content: \"\\f503\"; }\n\n.fa-user-ninja:before {\n content: \"\\f504\"; }\n\n.fa-user-nurse:before {\n content: \"\\f82f\"; }\n\n.fa-user-plus:before {\n content: \"\\f234\"; }\n\n.fa-user-secret:before {\n content: \"\\f21b\"; }\n\n.fa-user-shield:before {\n content: \"\\f505\"; }\n\n.fa-user-slash:before {\n content: \"\\f506\"; }\n\n.fa-user-tag:before {\n content: \"\\f507\"; }\n\n.fa-user-tie:before {\n content: \"\\f508\"; }\n\n.fa-user-times:before {\n content: \"\\f235\"; }\n\n.fa-users:before {\n content: \"\\f0c0\"; }\n\n.fa-users-cog:before {\n content: \"\\f509\"; }\n\n.fa-users-slash:before {\n content: \"\\e073\"; }\n\n.fa-usps:before {\n content: \"\\f7e1\"; }\n\n.fa-ussunnah:before {\n content: \"\\f407\"; }\n\n.fa-utensil-spoon:before {\n content: \"\\f2e5\"; }\n\n.fa-utensils:before {\n content: \"\\f2e7\"; }\n\n.fa-vaadin:before {\n content: \"\\f408\"; }\n\n.fa-vector-square:before {\n content: \"\\f5cb\"; }\n\n.fa-venus:before {\n content: \"\\f221\"; }\n\n.fa-venus-double:before {\n content: \"\\f226\"; }\n\n.fa-venus-mars:before {\n content: \"\\f228\"; }\n\n.fa-viacoin:before {\n content: \"\\f237\"; }\n\n.fa-viadeo:before {\n content: \"\\f2a9\"; }\n\n.fa-viadeo-square:before {\n content: \"\\f2aa\"; }\n\n.fa-vial:before {\n content: \"\\f492\"; }\n\n.fa-vials:before {\n content: \"\\f493\"; }\n\n.fa-viber:before {\n content: \"\\f409\"; }\n\n.fa-video:before {\n content: \"\\f03d\"; }\n\n.fa-video-slash:before {\n content: \"\\f4e2\"; }\n\n.fa-vihara:before {\n content: \"\\f6a7\"; }\n\n.fa-vimeo:before {\n content: \"\\f40a\"; }\n\n.fa-vimeo-square:before {\n content: \"\\f194\"; }\n\n.fa-vimeo-v:before {\n content: \"\\f27d\"; }\n\n.fa-vine:before {\n content: \"\\f1ca\"; }\n\n.fa-virus:before {\n content: \"\\e074\"; }\n\n.fa-virus-slash:before {\n content: \"\\e075\"; }\n\n.fa-viruses:before {\n content: \"\\e076\"; }\n\n.fa-vk:before {\n content: \"\\f189\"; }\n\n.fa-vnv:before {\n content: \"\\f40b\"; }\n\n.fa-voicemail:before {\n content: \"\\f897\"; }\n\n.fa-volleyball-ball:before {\n content: \"\\f45f\"; }\n\n.fa-volume-down:before {\n content: \"\\f027\"; }\n\n.fa-volume-mute:before {\n content: \"\\f6a9\"; }\n\n.fa-volume-off:before {\n content: \"\\f026\"; }\n\n.fa-volume-up:before {\n content: \"\\f028\"; }\n\n.fa-vote-yea:before {\n content: \"\\f772\"; }\n\n.fa-vr-cardboard:before {\n content: \"\\f729\"; }\n\n.fa-vuejs:before {\n content: \"\\f41f\"; }\n\n.fa-walking:before {\n content: \"\\f554\"; }\n\n.fa-wallet:before {\n content: \"\\f555\"; }\n\n.fa-warehouse:before {\n content: \"\\f494\"; }\n\n.fa-water:before {\n content: \"\\f773\"; }\n\n.fa-wave-square:before {\n content: \"\\f83e\"; }\n\n.fa-waze:before {\n content: \"\\f83f\"; }\n\n.fa-weebly:before {\n content: \"\\f5cc\"; }\n\n.fa-weibo:before {\n content: \"\\f18a\"; }\n\n.fa-weight:before {\n content: \"\\f496\"; }\n\n.fa-weight-hanging:before {\n content: \"\\f5cd\"; }\n\n.fa-weixin:before {\n content: \"\\f1d7\"; }\n\n.fa-whatsapp:before {\n content: \"\\f232\"; }\n\n.fa-whatsapp-square:before {\n content: \"\\f40c\"; }\n\n.fa-wheelchair:before {\n content: \"\\f193\"; }\n\n.fa-whmcs:before {\n content: \"\\f40d\"; }\n\n.fa-wifi:before {\n content: \"\\f1eb\"; }\n\n.fa-wikipedia-w:before {\n content: \"\\f266\"; }\n\n.fa-wind:before {\n content: \"\\f72e\"; }\n\n.fa-window-close:before {\n content: \"\\f410\"; }\n\n.fa-window-maximize:before {\n content: \"\\f2d0\"; }\n\n.fa-window-minimize:before {\n content: \"\\f2d1\"; }\n\n.fa-window-restore:before {\n content: \"\\f2d2\"; }\n\n.fa-windows:before {\n content: \"\\f17a\"; }\n\n.fa-wine-bottle:before {\n content: \"\\f72f\"; }\n\n.fa-wine-glass:before {\n content: \"\\f4e3\"; }\n\n.fa-wine-glass-alt:before {\n content: \"\\f5ce\"; }\n\n.fa-wix:before {\n content: \"\\f5cf\"; }\n\n.fa-wizards-of-the-coast:before {\n content: \"\\f730\"; }\n\n.fa-wolf-pack-battalion:before {\n content: \"\\f514\"; }\n\n.fa-won-sign:before {\n content: \"\\f159\"; }\n\n.fa-wordpress:before {\n content: \"\\f19a\"; }\n\n.fa-wordpress-simple:before {\n content: \"\\f411\"; }\n\n.fa-wpbeginner:before {\n content: \"\\f297\"; }\n\n.fa-wpexplorer:before {\n content: \"\\f2de\"; }\n\n.fa-wpforms:before {\n content: \"\\f298\"; }\n\n.fa-wpressr:before {\n content: \"\\f3e4\"; }\n\n.fa-wrench:before {\n content: \"\\f0ad\"; }\n\n.fa-x-ray:before {\n content: \"\\f497\"; }\n\n.fa-xbox:before {\n content: \"\\f412\"; }\n\n.fa-xing:before {\n content: \"\\f168\"; }\n\n.fa-xing-square:before {\n content: \"\\f169\"; }\n\n.fa-y-combinator:before {\n content: \"\\f23b\"; }\n\n.fa-yahoo:before {\n content: \"\\f19e\"; }\n\n.fa-yammer:before {\n content: \"\\f840\"; }\n\n.fa-yandex:before {\n content: \"\\f413\"; }\n\n.fa-yandex-international:before {\n content: \"\\f414\"; }\n\n.fa-yarn:before {\n content: \"\\f7e3\"; }\n\n.fa-yelp:before {\n content: \"\\f1e9\"; }\n\n.fa-yen-sign:before {\n content: \"\\f157\"; }\n\n.fa-yin-yang:before {\n content: \"\\f6ad\"; }\n\n.fa-yoast:before {\n content: \"\\f2b1\"; }\n\n.fa-youtube:before {\n content: \"\\f167\"; }\n\n.fa-youtube-square:before {\n content: \"\\f431\"; }\n\n.fa-zhihu:before {\n content: \"\\f63f\"; }\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto; }\n"},"$:/plugins/TheDiveO/FontAwesome/styles/tiddlylinks/system":{"title":"$:/plugins/TheDiveO/FontAwesome/styles/tiddlylinks/system","created":"20171230212437805","modified":"20180328191223958","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<$set name=\"cfg\" value=<<fa5-cfgpath \"decorate-syslinks\">> >\n<$list filter=<<fa5-cfgfilterexpr>> >\n\n/* system tiddler titles starting with $:/... */\n.tc-tiddler-body a.tc-tiddlylink[href^=\"#%24%3A%2F\"]:before,\n.tc-tiddler-preview-preview a.tc-tiddlylink[href^=\"#%24%3A%2F\"]:before {\n <<fa-plugin-font-solid>>\n font-size: 80%;\n content: '\\f013\\202f';\n display: inline-block;\n}\n\n</$list>\n</$set>"},"$:/plugins/TheDiveO/FontAwesome/ui/ControlPanel/FontAwesome":{"title":"$:/plugins/TheDiveO/FontAwesome/ui/ControlPanel/FontAwesome","caption":"Font Awesome","created":"20180328182555066","modified":"20180328190604063","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"Customize the Font Awesome 5 plugin.\n\n<$checkbox tiddler=<<fa5-cfgpath \"decorate-syslinks\">> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\" > decorate system links: [[$:/ControlPanel]]</$checkbox>\n\n<$checkbox tiddler=<<fa5-cfgpath \"decorate-extlinks\">> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\" > decorate external links: [[TiddlyWiki|http://tiddlywiki.com]] [[Wikipedia|https://en.wikipedia.org/wiki/TiddlyWiki]]</$checkbox>\n\n<$checkbox tiddler=<<fa5-cfgpath \"decorate-extdoclinks\">> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\" > decorate external document links: https://example.org/document.pdf</$checkbox>\n\n<$checkbox tiddler=<<fa5-cfgpath \"decorate-wk-extlinks\">> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\" > decorate external well-known links: http://github.com http://en.wikipedia.org</$checkbox>"}}}
{
"tiddlers": {
"$:/config/EditorTypeMappings/application/javascript": {
"title": "$:/config/EditorTypeMappings/application/javascript",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/json": {
"title": "$:/config/EditorTypeMappings/application/json",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/x-tiddler-dictionary": {
"title": "$:/config/EditorTypeMappings/application/x-tiddler-dictionary",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/css": {
"title": "$:/config/EditorTypeMappings/text/css",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/html": {
"title": "$:/config/EditorTypeMappings/text/html",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/plain": {
"title": "$:/config/EditorTypeMappings/text/plain",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-markdown": {
"title": "$:/config/EditorTypeMappings/text/x-markdown",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/x-tiddlywiki",
"text": "codemirror"
},
"$:/config/codemirror/cursorBlinkRate": {
"title": "$:/config/codemirror/cursorBlinkRate",
"type": "integer",
"text": "530"
},
"$:/config/codemirror/extraKeysTW": {
"title": "$:/config/codemirror/extraKeysTW",
"extend": "extraKeys",
"type": "json",
"text": "{\n\t\"Ctrl-Esc\": \"singleSelection\",\n\t\"Esc\": \"\",\n\t\"Ctrl-S\": \"\",\n\t\"Ctrl-U\": \"\",\n\t\"Ctrl-T\": \"\",\n\t\"Alt-T\": \"transposeChars\",\n\t\"Alt-U\": \"undoSelection\",\n\t\"Shift-Alt-U\": \"redoSelection\",\n\t\"Cmd-U\": \"\",\n\t\"Tab\": \"indentAuto()\",\n\t\"Enter\": \"newLineAndIndent()\"\n}\n"
},
"$:/config/codemirror/indentUnit": {
"title": "$:/config/codemirror/indentUnit",
"type": "integer",
"text": "2"
},
"$:/config/codemirror/indentWithTabs": {
"title": "$:/config/codemirror/indentWithTabs",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/inputStyle": {
"title": "$:/config/codemirror/inputStyle",
"type": "string",
"text": "textarea"
},
"$:/config/codemirror/keyMap": {
"title": "$:/config/codemirror/keyMap",
"type": "string",
"text": "default"
},
"$:/config/codemirror/lineNumbers": {
"title": "$:/config/codemirror/lineNumbers",
"type": "bool",
"text": "false"
},
"$:/config/codemirror/lineWrapping": {
"title": "$:/config/codemirror/lineWrapping",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/showCursorWhenSelecting": {
"title": "$:/config/codemirror/showCursorWhenSelecting",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/smartIndent": {
"title": "$:/config/codemirror/smartIndent",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/styleActiveLine": {
"title": "$:/config/codemirror/styleActiveLine",
"type": "bool",
"text": "false"
},
"$:/config/codemirror/tabSize": {
"title": "$:/config/codemirror/tabSize",
"type": "integer",
"text": "2"
},
"$:/config/codemirror/theme": {
"title": "$:/config/codemirror/theme",
"type": "string",
"text": "default"
},
"$:/language/codemirror/homeUrl": {
"title": "$:/language/codemirror/homeUrl",
"text": "http://codemirror.net"
},
"$:/language/codemirror/addOnUrl": {
"title": "$:/language/codemirror/addOnUrl",
"text": "http://codemirror.net/doc/manual.html#addons"
},
"$:/language/codemirror/configUrl": {
"title": "$:/language/codemirror/configUrl",
"text": "http://codemirror.net/doc/manual.html#config"
},
"$:/language/codemirror/controlPanel/hint": {
"title": "$:/language/codemirror/controlPanel/hint",
"text": "These settings let you customise the behaviour of [[CodeMirror|$:/plugins/tiddlywiki/codemirror]]."
},
"$:/language/codemirror/controlPanel/usage": {
"title": "$:/language/codemirror/controlPanel/usage",
"text": "Usage information"
},
"$:/language/codemirror/editorFont/hint": {
"title": "$:/language/codemirror/editorFont/hint",
"text": "Editor font family"
},
"$:/language/codemirror/editorFont/info": {
"title": "$:/language/codemirror/editorFont/info",
"text": "Set the font family for the ~CodeMirror text-editor"
},
"$:/language/codemirror/controlPanel/keyboard": {
"title": "$:/language/codemirror/controlPanel/keyboard",
"text": "Keyboard shortcuts"
},
"$:/language/codemirror/keyMap/hint": {
"title": "$:/language/codemirror/keyMap/hint",
"text": "~CodeMirror keymap"
},
"$:/language/codemirror/keyMap/info": {
"title": "$:/language/codemirror/keyMap/info",
"text": "~The Keyboard KeyMap used within the ~CodeMirror text-editor"
},
"$:/language/codemirror/lineNumbers/hint": {
"title": "$:/language/codemirror/lineNumbers/hint",
"text": "Enable line numbers"
},
"$:/language/codemirror/lineNumbers/info": {
"title": "$:/language/codemirror/lineNumbers/info",
"text": "Whether to show line numbers to the left of the editor."
},
"$:/language/codemirror/lineWrapping/hint": {
"title": "$:/language/codemirror/lineWrapping/hint",
"text": "Enable line wrapping"
},
"$:/language/codemirror/lineWrapping/info": {
"title": "$:/language/codemirror/lineWrapping/info",
"text": "Whether CodeMirror should scroll or wrap for long lines. Defaults to `false` (scroll)."
},
"$:/language/codemirror/showCursorWhenSelecting/hint": {
"title": "$:/language/codemirror/showCursorWhenSelecting/hint",
"text": "Show cursor, when selecting"
},
"$:/language/codemirror/showCursorWhenSelecting/info": {
"title": "$:/language/codemirror/showCursorWhenSelecting/info",
"text": "Whether the cursor should be drawn when a selection is active."
},
"$:/language/codemirror/styleActiveLine/hint": {
"title": "$:/language/codemirror/styleActiveLine/hint",
"text": "Highlight active line"
},
"$:/language/codemirror/styleActiveLine/info": {
"title": "$:/language/codemirror/styleActiveLine/info",
"text": "Whether or not to highlight the active text-editor line"
},
"$:/language/codemirror/theme/hint": {
"title": "$:/language/codemirror/theme/hint",
"text": "Select a theme"
},
"$:/language/codemirror/theme/info": {
"title": "$:/language/codemirror/theme/info",
"text": "Choose between ~CodeMirror themes"
},
"$:/plugins/tiddlywiki/codemirror/edit-codemirror.js": {
"title": "$:/plugins/tiddlywiki/codemirror/edit-codemirror.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/codemirror/edit-codemirror.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-codemirror widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tCodeMirrorEngine = require(\"$:/plugins/tiddlywiki/codemirror/engine.js\").CodeMirrorEngine;\n\nexports[\"edit-codemirror\"] = editTextWidgetFactory(CodeMirrorEngine,CodeMirrorEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/codemirror/engine.js": {
"title": "$:/plugins/tiddlywiki/codemirror/engine.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/codemirror/engine.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a CodeMirror instance\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CODEMIRROR_OPTIONS = \"$:/config/CodeMirror\",\nHEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\",\nCONFIG_FILTER = \"[all[shadows+tiddlers]prefix[$:/config/codemirror/]]\"\n\t\n// Install CodeMirror\nif($tw.browser && !window.CodeMirror) {\n\n\tvar modules = $tw.modules.types[\"codemirror\"];\n\tvar req = Object.getOwnPropertyNames(modules);\n\n\twindow.CodeMirror = require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js\");\n\t// Install required CodeMirror plugins\n\tif(req) {\n\t\tif($tw.utils.isArray(req)) {\n\t\t\tfor(var index=0; index<req.length; index++) {\n\t\t\t\trequire(req[index]);\n\t\t\t}\n\t\t} else {\n\t\t\trequire(req);\n\t\t}\n\t}\n}\n\nfunction getCmConfig() {\n\tvar type,\n\t\ttest,\n\t\tvalue,\n\t\telement,\n\t\textend,\n\t\ttiddler,\n\t\tconfig = {},\n\t\tconfigTiddlers = $tw.wiki.filterTiddlers(CONFIG_FILTER);\n\n\tif ($tw.utils.isArray(configTiddlers)) {\n\t\tfor (var i=0; i<configTiddlers.length; i++) {\n\t\t\ttiddler = $tw.wiki.getTiddler(configTiddlers[i]);\n\t\t\t\tif (tiddler) {\n\t\t\t\telement = configTiddlers[i].replace(/\\$:\\/config\\/codemirror\\//ig,\"\");\n\t\t\t\t\ttype = (tiddler.fields.type) ? tiddler.fields.type.trim().toLocaleLowerCase() : \"string\";\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase \"bool\":\n\t\t\t\t\ttest = tiddler.fields.text.trim().toLowerCase();\n\t\t\t\t\tvalue = (test === \"true\") ? true : false;\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\tvalue = tiddler.fields.text.trim();\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"integer\":\n\t\t\t\t\tvalue = parseInt(tiddler.fields.text.trim(), 10);\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"json\":\n\t\t\t\t\tvalue = JSON.parse(tiddler.fields.text.trim());\n\t\t\t\t\t\textend = (tiddler.fields.extend) ? tiddler.fields.extend : element;\n\n\t\t\t\t\tif (config[extend]) {\n\t\t\t\t\t\t$tw.utils.extend(config[extend], value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig[extend] = value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn config;\n}\n\nfunction CodeMirrorEngine(options) {\n\n\t// Save our options\n\tvar self = this;\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create the wrapper DIV\n\tthis.domNode = this.widget.document.createElement(\"div\");\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tthis.domNode.style.display = \"inline-block\";\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n\t\n\t// Set all cm-plugin defaults\n\t// Get the configuration options for the CodeMirror object\n\tvar config = getCmConfig();\n\n\tconfig.mode = options.type;\n\tconfig.value = options.value;\n\tif(this.widget.editTabIndex) {\n\t\tconfig[\"tabindex\"] = this.widget.editTabIndex;\n\t}\n\t// Create the CodeMirror instance\n\tthis.cm = window.CodeMirror(function(cmDomNode) {\n\t\t// Note that this is a synchronous callback that is called before the constructor returns\n\t\tif(!self.widget.document.isTiddlyWikiFakeDom) {\n\t\t\tself.domNode.appendChild(cmDomNode);\n\t\t}\n\t},config);\n\n\t// Set up a change event handler\n\tthis.cm.on(\"change\",function() {\n\t\tself.widget.saveChanges(self.getText());\n\t});\n\tthis.cm.on(\"drop\",function(cm,event) {\n\t\tevent.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event\n\t\treturn false;\n\t});\n\tthis.cm.on(\"keydown\",function(cm,event) {\n\t\treturn self.widget.handleKeydownEvent.call(self.widget,event);\n\t});\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nCodeMirrorEngine.prototype.setText = function(text,type) {\n\tvar self = this;\n\tself.cm.setOption(\"mode\",type);\n\tif(!this.cm.hasFocus()) {\n\t\tthis.cm.setValue(text);\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nCodeMirrorEngine.prototype.getText = function() {\n\treturn this.cm.getValue();\n};\n\n/*\nFix the height of textarea to fit content\n*/\nCodeMirrorEngine.prototype.fixHeight = function() {\n\tif(this.widget.editAutoHeight) {\n\t\t// Resize to fit\n\t\tthis.cm.setSize(null,null);\n\t} else {\n\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\tthis.cm.setSize(null,fixedHeight);\n\t}\n};\n\n/*\nFocus the engine node\n*/\nCodeMirrorEngine.prototype.focus = function() {\n\tthis.cm.focus();\n}\n\n/*\nCreate a blank structure representing a text operation\n*/\nCodeMirrorEngine.prototype.createTextOperation = function() {\n\tvar selections = this.cm.listSelections();\n\tif(selections.length > 0) {\n\t\tvar anchorPos = this.cm.indexFromPos(selections[0].anchor),\n\t\theadPos = this.cm.indexFromPos(selections[0].head);\n\t}\n\tvar operation = {\n\t\ttext: this.cm.getValue(),\n\t\tselStart: Math.min(anchorPos,headPos),\n\t\tselEnd: Math.max(anchorPos,headPos),\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nCodeMirrorEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tthis.cm.replaceRange(operation.replacement,this.cm.posFromIndex(operation.cutStart),this.cm.posFromIndex(operation.cutEnd));\n\t\tthis.cm.setSelection(this.cm.posFromIndex(operation.newSelStart),this.cm.posFromIndex(operation.newSelEnd));\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t}\n\tthis.cm.focus();\n\treturn newText;\n};\n\nexports.CodeMirrorEngine = CodeMirrorEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js": {
"text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){\"use strict\";var e=navigator.userAgent,t=navigator.platform,r=/gecko\\/\\d/i.test(e),n=/MSIE \\d/.test(e),i=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(e),o=/Edge\\/(\\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\\//.test(e),u=a&&/Qt\\/\\d+\\.\\d+/.test(e),c=!o&&/Chrome\\//.test(e),h=/Opera\\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\\/\\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\\bCrOS\\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\\/(\\d*\\.\\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp(\"(^|\\\\s)\"+e+\"(?:$|\\\\s)\\\\s*\")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:\"\")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),\"string\"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute(\"role\",\"presentation\"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?\" \":\"\")+t)}function F(e,t){for(var r=e.split(\" \"),n=0;n<r.length;n++)r[n]&&!L(r[n]).test(t)&&(t+=\" \"+r[n]);return t}k=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd(\"character\",r),n.moveStart(\"character\",t),n};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function z(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function I(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\\s\\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf(\"\\t\",o);if(s<0||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null};function B(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}R.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var G=30,U={toString:function(){return\"CodeMirror.Pass\"}},V={scroll:!1},K={origin:\"*mouse\"},j={origin:\"+move\"};function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf(\"\\t\",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[\"\"];function _(e){for(;Y.length<=e;)Y.push(q(Y)+\" \");return Y[e]}function q(e){return e[e.length-1]}function $(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}function Z(){}function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototype=e,r=new Z),t&&z(t,r),r}var J=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;function ee(e){return/\\w/.test(e)||e>\"\"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf(\"\\\\w\")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:t<e.length)&&ie(e.charAt(t));)t+=r;return t}function le(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}function se(e,t){if((t-=e.first)<0||t>=e.size)throw new Error(\"There is no line \"+(t+e.first)+\" in the document.\");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t<o){r=i;break}t-=o}return r.lines[t]}function ae(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function ue(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function ce(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function he(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function fe(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return r+l}function de(e,t){return t>=e.first&&t<e.first+e.size}function pe(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function ge(e,t,r){if(void 0===r&&(r=null),!(this instanceof ge))return new ge(e,t,r);this.line=e,this.ch=t,this.sticky=r}function ve(e,t){return e.line-t.line||e.ch-t.ch}function me(e,t){return e.sticky==t.sticky&&0==ve(e,t)}function ye(e){return ge(e.line,e.ch)}function be(e,t){return ve(e,t)<0?t:e}function we(e,t){return ve(e,t)<0?e:t}function xe(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function Ce(e,t){if(t.line<e.first)return ge(e.first,0);var r,n,i,o=e.first+e.size-1;return t.line>o?ge(o,se(e,o).text.length):(r=t,n=se(e,t.line).text.length,null==(i=r.ch)||i>n?ge(r.line,n):i<0?ge(r.line,0):r)}function Se(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=Ce(e,t[n]);return r}var Le=!1,ke=!1;function Te(e,t,r){this.marker=e,this.from=t,this.to=r}function Me(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function Ne(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function Oe(e,t){if(t.full)return null;var r=de(e,t.from.line)&&se(e,t.from.line).markedSpans,n=de(e,t.to.line)&&se(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==ve(t.from,t.to),s=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)||o.from==t&&\"bookmark\"==l.type&&(!r||!o.marker.insertLeft)){var s=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);(n||(n=[])).push(new Te(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)||o.from==t&&\"bookmark\"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);(n||(n=[])).push(new Te(l,s?null:o.from-t,null==o.to?null:o.to-t))}}return n}(n,o,l),u=1==t.text.length,c=q(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var f=s[h];if(null==f.to){var d=Me(a,f.marker);d?u&&(f.to=null==d.to?null:d.to+c):f.to=i}}if(a)for(var p=0;p<a.length;++p){var g=a[p];if(null!=g.to&&(g.to+=c),null==g.from)Me(s,g.marker)||(g.from=c,u&&(s||(s=[])).push(g));else g.from+=c,u&&(s||(s=[])).push(g)}s&&(s=Ae(s)),a&&a!=s&&(a=Ae(a));var v=[s];if(!u){var m,y=t.text.length-2;if(y>0&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(m||(m=[])).push(new Te(s[b].marker,null,null));for(var w=0;w<y;++w)v.push(m);v.push(a)}return v}function Ae(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function De(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function We(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function He(e){return e.inclusiveLeft?-1:0}function Fe(e){return e.inclusiveRight?1:0}function Pe(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=ve(n.from,i.from)||He(e)-He(t);if(o)return-o;var l=ve(n.to,i.to)||Fe(e)-Fe(t);return l||t.id-e.id}function Ee(e,t){var r,n=ke&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)(i=n[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!r||Pe(r,i.marker)<0)&&(r=i.marker);return r}function ze(e){return Ee(e,!0)}function Ie(e){return Ee(e,!1)}function Re(e,t,r,n,i){var o=se(e,t),l=ke&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=ve(u.from,r)||He(a.marker)-He(i),h=ve(u.to,n)||Fe(a.marker)-Fe(i);if(!(c>=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.to,r)>=0:ve(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.from,n)<=0:ve(u.from,n)<0)))return!0}}}function Be(e){for(var t;t=ze(e);)e=t.find(-1,!0).line;return e}function Ge(e,t){var r=se(e,t),n=Be(r);return r==n?t:he(n)}function Ue(e,t){if(t>e.lastLine())return t;var r,n=se(e,t);if(!Ve(e,n))return t;for(;r=Ie(n);)n=r.find(1,!0).line;return he(n)+1}function Ve(e,t){var r=ke&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.length;++i)if((n=r[i]).marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&Ke(e,t,n))return!0}}function Ke(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ke(e,n.line,Me(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&Ke(e,t,i))return!0}function je(e){for(var t=0,r=(e=Be(e)).parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;o=(r=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function Xe(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=ze(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=Ie(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,r+=(n=o.to.line).text.length-o.to.ch}return r}function Ye(e){var t=e.display,r=e.doc;t.maxLine=se(r,r.first),t.maxLineLength=Xe(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=Xe(e);r>t.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var _e=null;function qe(e,t,r){var n;_e=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&\"before\"==r?n=i:_e=i),o.from==t&&(o.from!=o.to&&\"before\"!=r?n=i:_e=i)}return null!=n?n:_e}var $e=function(){var e=\"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\",t=\"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";var r=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c=\"ltr\"==u?\"L\":\"R\";if(0==a.length||\"ltr\"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p<f;++p)d.push((h=a.charCodeAt(p))<=247?e.charAt(h):1424<=h&&h<=1524?\"R\":1536<=h&&h<=1785?t.charAt(h-1536):1774<=h&&h<=2220?\"r\":8192<=h&&h<=8203?\"w\":8204==h?\"b\":\"L\");for(var g=0,v=c;g<f;++g){var m=d[g];\"m\"==m?d[g]=v:v=m}for(var y=0,b=c;y<f;++y){var w=d[y];\"1\"==w&&\"r\"==b?d[y]=\"n\":i.test(w)&&(b=w,\"r\"==w&&(d[y]=\"R\"))}for(var x=1,C=d[0];x<f-1;++x){var S=d[x];\"+\"==S&&\"1\"==C&&\"1\"==d[x+1]?d[x]=\"1\":\",\"!=S||C!=d[x+1]||\"1\"!=C&&\"n\"!=C||(d[x]=C),C=S}for(var L=0;L<f;++L){var k=d[L];if(\",\"==k)d[L]=\"N\";else if(\"%\"==k){var T=void 0;for(T=L+1;T<f&&\"%\"==d[T];++T);for(var M=L&&\"!\"==d[L-1]||T<f&&\"1\"==d[T]?\"1\":\"N\",N=L;N<T;++N)d[N]=M;L=T-1}}for(var O=0,A=c;O<f;++O){var D=d[O];\"L\"==A&&\"1\"==D?d[O]=\"L\":i.test(D)&&(A=D)}for(var W=0;W<f;++W)if(n.test(d[W])){var H=void 0;for(H=W+1;H<f&&n.test(d[H]);++H);for(var F=\"L\"==(W?d[W-1]:c),P=F==(\"L\"==(H<f?d[H]:c))?F?\"L\":\"R\":c,E=W;E<H;++E)d[E]=P;W=H-1}for(var z,I=[],R=0;R<f;)if(o.test(d[R])){var B=R;for(++R;R<f&&o.test(d[R]);++R);I.push(new s(0,B,R))}else{var G=R,U=I.length;for(++R;R<f&&\"L\"!=d[R];++R);for(var V=G;V<R;)if(l.test(d[V])){G<V&&I.splice(U,0,new s(1,G,V));var K=V;for(++V;V<R&&l.test(d[V]);++V);I.splice(U,0,new s(2,K,V)),G=V}else++V;G<R&&I.splice(U,0,new s(1,G,R))}return\"ltr\"==u&&(1==I[0].level&&(z=a.match(/^\\s+/))&&(I[0].from=z[0].length,I.unshift(new s(0,0,z[0].length))),1==q(I).level&&(z=a.match(/\\s+$/))&&(q(I).to-=z[0].length,I.push(new s(0,f-z[0].length,f)))),\"rtl\"==u?I.reverse():I}}();function Ze(e,t){var r=e.order;return null==r&&(r=e.order=$e(e.text,t)),r}var Qe=[],Je=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent(\"on\"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||Qe).concat(r)}};function et(e,t){return e._handlers&&e._handlers[t]||Qe}function tt(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent(\"on\"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=B(i,r);o>-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function rt(e,t){var r=et(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i<r.length;++i)r[i].apply(null,n)}function nt(e,t,r){return\"string\"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),rt(e,r||t.type,e,t),ut(t)||t.codemirrorIgnore}function it(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==B(r,t[n])&&r.push(t[n])}function ot(e,t){return et(e,t).length>0}function lt(e){e.prototype.on=function(e,t){Je(this,e,t)},e.prototype.off=function(e,t){tt(this,e,t)}}function st(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function at(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function ut(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function ct(e){st(e),at(e)}function ht(e){return e.target||e.srcElement}function ft(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var dt,pt,gt=function(){if(l&&s<9)return!1;var e=O(\"div\");return\"draggable\"in e||\"dragDrop\"in e}();function vt(e){if(null==dt){var t=O(\"span\",\"\");N(e,O(\"span\",[t,document.createTextNode(\"x\")])),0!=e.firstChild.offsetHeight&&(dt=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=dt?O(\"span\",\"\"):O(\"span\",\" \",null,\"display: inline-block; width: 1px; margin-right: -1px\");return r.setAttribute(\"cm-text\",\"\"),r}function mt(e){if(null!=pt)return pt;var t=N(e,document.createTextNode(\"AخA\")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(pt=n.right-r.right<3)}var yt,bt=3!=\"\\n\\nb\".split(/\\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf(\"\\n\",t);-1==i&&(i=e.length);var o=e.slice(t,\"\\r\"==e.charAt(i-1)?i-1:i),l=o.indexOf(\"\\r\");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\\r\\n?|\\n/)},wt=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints(\"StartToEnd\",t)},xt=\"oncopy\"in(yt=O(\"div\"))||(yt.setAttribute(\"oncopy\",\"return;\"),\"function\"==typeof yt.oncopy),Ct=null;var St={},Lt={};function kt(e){if(\"string\"==typeof e&&Lt.hasOwnProperty(e))e=Lt[e];else if(e&&\"string\"==typeof e.name&&Lt.hasOwnProperty(e.name)){var t=Lt[e.name];\"string\"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(e))return kt(\"application/xml\");if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(e))return kt(\"application/json\")}return\"string\"==typeof e?{name:e}:e||{name:\"null\"}}function Tt(e,t){t=kt(t);var r=St[t.name];if(!r)return Tt(e,\"text/plain\");var n=r(e,t);if(Mt.hasOwnProperty(t.name)){var i=Mt[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n[\"_\"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Mt={};function Nt(e,t){z(t,Mt.hasOwnProperty(e)?Mt[e]:Mt[e]={})}function Ot(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function At(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Dt(e,t,r){return!e.startState||e.startState(t,r)}var Wt=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};Wt.prototype.eol=function(){return this.pos>=this.string.length},Wt.prototype.sol=function(){return this.pos==this.lineStart},Wt.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Wt.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Wt.prototype.eat=function(e){var t=this.string.charAt(this.pos);if(\"string\"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},Wt.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Wt.prototype.eatSpace=function(){for(var e=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Wt.prototype.skipToEnd=function(){this.pos=this.string.length},Wt.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Wt.prototype.backUp=function(e){this.pos-=e},Wt.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=I(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.indentation=function(){return I(this.string,null,this.tabSize)-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.match=function(e,t,r){if(\"string\"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Wt.prototype.current=function(){return this.string.slice(this.start,this.pos)},Wt.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Wt.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Wt.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var Ht=function(e,t){this.state=e,this.lookAhead=t},Ft=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function Pt(e,t,r,n){var i=[e.state.modeGen],o={};Kt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,Kt(e,t.text,s.mode,r,function(e,t){for(var r=a;u<e;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,\"overlay \"+t),a=r+2;else for(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+\" \":\"\")+\"overlay \"+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1},a=0;a<e.state.overlays.length;++a)s(a);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function Et(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=zt(e,he(t)),i=t.text.length>e.options.maxHighlightLength&&Ot(e.doc.mode,n.state),o=Pt(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function zt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new Ft(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=se(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof Ht?u.lookAhead:0)<=o.modeFrontier))return s;var c=I(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&se(n,o-1).stateAfter,s=l?Ft.fromSaved(n,l,o):new Ft(n,Dt(n.mode),o);return n.iter(o,t,function(r){It(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function It(e,t,r,n){var i=e.doc.mode,o=new Wt(t,e.options.tabSize,r);for(o.start=o.pos=n||0,\"\"==t&&Rt(i,r.state);!o.eol();)Bt(i,o,r.state),o.start=o.pos}function Rt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=At(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function Bt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=At(e,r).mode);var o=e.token(t,r);if(t.pos>t.start)return o}throw new Error(\"Mode \"+e.name+\" failed to advance stream.\")}Ft.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},Ft.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,\"\"),size:this.baseTokens[this.baseTokenPos]-e}},Ft.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Ft.fromSaved=function(e,t,r){return t instanceof Ht?new Ft(e,Ot(e.mode,t.state),r,t.lookAhead):new Ft(e,Ot(e.mode,t),r)},Ft.prototype.save=function(e){var t=!1!==e?Ot(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new Ht(t,this.maxLookAhead):t};var Gt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function Ut(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=se(l,(t=Ce(l,t)).line),u=zt(e,t.line,r),c=new Wt(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Bt(s,c,u.state),n&&o.push(new Gt(c,i,Ot(l.mode,u.state)));return n?o:new Gt(c,i,u.state)}function Vt(e,t){if(e)for(;;){var r=e.match(/(?:^|\\s+)line-(background-)?(\\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?\"bgClass\":\"textClass\";null==t[n]?t[n]=r[2]:new RegExp(\"(?:^|s)\"+r[2]+\"(?:$|s)\").test(t[n])||(t[n]+=\" \"+r[2])}return e}function Kt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,h=new Wt(t,e.options.tabSize,n),f=e.options.addModeClass&&[null];for(\"\"==t&&Vt(Rt(r,n.state),o);!h.eol();){if(h.pos>e.options.maxHighlightLength?(s=!1,l&&It(e,t,n,h.pos),h.pos=t.length,a=null):a=Vt(Bt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a=\"m-\"+(a?d+\" \"+a:d))}if(!s||c!=a){for(;u<h.start;)i(u=Math.min(h.start,u+5e3),c);c=a}h.start=h.pos}for(;u<h.pos;){var p=Math.min(h.pos,u+5e3);i(p,c),u=p}}var jt=function(e,t,r){this.text=e,We(this,t),this.height=r?r(this):1};jt.prototype.lineNo=function(){return he(this)},lt(jt);var Xt={},Yt={};function _t(e,t){if(!e||/^\\s*$/.test(e))return null;var r=t.addModeClass?Yt:Xt;return r[e]||(r[e]=e.replace(/\\S+/g,\"cm-$&\"))}function qt(e,t){var r=A(\"span\",null,null,a?\"padding-right: .1px\":null),n={pre:A(\"pre\",[r],\"CodeMirror-line\"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:(l||a)&&e.getOption(\"lineWrapping\")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,s=void 0;n.pos=0,n.addToken=Zt,mt(e.display.measure)&&(s=Ze(o,e.doc.direction))&&(n.addToken=Qt(n.addToken,s)),n.map=[],er(o,n,Et(e,o,t!=e.display.externalMeasured&&he(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||\"\")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||\"\"))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(vt(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var u=n.content.lastChild;(/\\bcm-tab\\b/.test(u.className)||u.querySelector&&u.querySelector(\".cm-tab\"))&&(n.content.className=\"cm-tab-wrap-hack\")}return rt(e,\"renderLine\",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||\"\")),n}function $t(e){var t=O(\"span\",\"•\",\"cm-invalidchar\");return t.title=\"\\\\u\"+e.charCodeAt(0).toString(16),t.setAttribute(\"aria-label\",t.title),t}function Zt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n=\"\",i=0;i<e.length;i++){var o=e.charAt(i);\" \"!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=\" \"),n+=o,r=\" \"==o}return n}(t,e.trailingSpace):t,h=e.cm.state.specialChars,f=!1;if(h.test(t)){u=document.createDocumentFragment();for(var d=0;;){h.lastIndex=d;var p=h.exec(t),g=p?p.index-d:t.length-d;if(g){var v=document.createTextNode(c.slice(d,d+g));l&&s<9?u.appendChild(O(\"span\",[v])):u.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!p)break;d+=g+1;var m=void 0;if(\"\\t\"==p[0]){var y=e.cm.options.tabSize,b=y-e.col%y;(m=u.appendChild(O(\"span\",_(b),\"cm-tab\"))).setAttribute(\"role\",\"presentation\"),m.setAttribute(\"cm-text\",\"\\t\"),e.col+=b}else\"\\r\"==p[0]||\"\\n\"==p[0]?((m=u.appendChild(O(\"span\",\"\\r\"==p[0]?\"␍\":\"\",\"cm-invalidchar\"))).setAttribute(\"cm-text\",p[0]),e.col+=1):((m=e.cm.options.specialCharPlaceholder(p[0])).setAttribute(\"cm-text\",p[0]),l&&s<9?u.appendChild(O(\"span\",[m])):u.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,u=document.createTextNode(c),e.map.push(e.pos,e.pos+t.length,u),l&&s<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==c.charCodeAt(t.length-1),r||n||i||f||a){var w=r||\"\";n&&(w+=n),i&&(w+=i);var x=O(\"span\",[u],w,a);return o&&(x.title=o),e.content.appendChild(x)}e.content.appendChild(u)}}function Qt(e,t){return function(r,n,i,o,l,s,a){i=i?i+\" cm-force-border\":\"cm-force-border\";for(var u=r.pos,c=u+n.length;;){for(var h=void 0,f=0;f<t.length&&!((h=t[f]).to>u&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function Jt(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement(\"span\"))),i.setAttribute(\"cm-marker\",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function er(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v=\"\",m=0;;){if(m==p){a=u=c=h=s=\"\",f=null,m=1/0;for(var y=[],b=void 0,w=0;w<n.length;++w){var x=n[w],C=x.marker;\"bookmark\"==C.type&&x.from==p&&C.widgetNode?y.push(C):x.from<=p&&(null==x.to||x.to>p||C.collapsed&&x.to==p&&x.from==p)?(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=\"\"),C.className&&(a+=\" \"+C.className),C.css&&(s=(s?s+\";\":\"\")+C.css),C.startStyle&&x.from==p&&(c+=\" \"+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&!h&&(h=C.title),C.collapsed&&(!f||Pe(f.marker,C)<0)&&(f=x)):x.from>p&&m>x.from&&(m=x.from)}if(b)for(var S=0;S<b.length;S+=2)b[S+1]==m&&(u+=\" \"+b[S]);if(!f||f.from==p)for(var L=0;L<y.length;++L)Jt(t,0,y[L]);if(f&&(f.from||0)==p){if(Jt(t,(null==f.to?d+1:f.to)-p,f.marker,null==f.from),null==f.to)return;f.to==p&&(f=!1)}}if(p>=d)break;for(var k=Math.min(d,m);;){if(v){var T=p+v.length;if(!f){var M=T>k?v.slice(0,k-p):v;t.addToken(t,M,l?l+a:a,c,p+M.length==m?u:\"\",h,s)}if(T>=k){v=v.slice(k-p),p=k;break}p=T,c=\"\"}v=i.slice(o,o=r[g++]),l=_t(r[g++],t.cm.options)}}else for(var N=1;N<r.length;N+=2)t.addToken(t,i.slice(o,o=r[N]),_t(r[N+1],t.cm.options))}function tr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Ie(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}(t),this.size=this.rest?he(q(this.rest))-r+1:1,this.node=this.text=null,this.hidden=Ve(e,t)}function rr(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new tr(e.doc,se(e.doc,o),o);n=o+l.size,i.push(l)}return i}var nr=null;var ir=null;function or(e,t){var r=et(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);nr?n=nr.delayedCallbacks:ir?n=ir:(n=ir=[],setTimeout(lr,0));for(var o=function(e){n.push(function(){return r[e].apply(null,i)})},l=0;l<r.length;++l)o(l)}}function lr(){var e=ir;ir=null;for(var t=0;t<e.length;++t)e[t]()}function sr(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];\"text\"==o?cr(e,t):\"gutter\"==o?fr(e,t,r,n):\"class\"==o?hr(e,t):\"widget\"==o&&dr(e,t,n)}t.changes=null}function ar(e){return e.node==e.text&&(e.node=O(\"div\",null,null,\"position: relative\"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),l&&s<8&&(e.node.style.zIndex=2)),e.node}function ur(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):qt(e,t)}function cr(e,t){var r=t.text.className,n=ur(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,hr(e,t)):r&&(t.text.className=r)}function hr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+\" \"+(t.line.bgClass||\"\"):t.line.bgClass;if(r&&(r+=\" CodeMirror-linebackground\"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var n=ar(t);t.background=n.insertBefore(O(\"div\",null,r),n.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?ar(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className=\"\");var r=t.textClass?t.textClass+\" \"+(t.line.textClass||\"\"):t.line.textClass;t.text.className=r||\"\"}function fr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=ar(t);t.gutterBackground=O(\"div\",null,\"CodeMirror-gutter-background \"+t.line.gutterClass,\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px; width: \"+n.gutterTotalWidth+\"px\"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=ar(t),s=t.gutter=O(\"div\",null,\"CodeMirror-gutter-wrapper\",\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px\");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=\" \"+t.line.gutterClass),!e.options.lineNumbers||o&&o[\"CodeMirror-linenumbers\"]||(t.lineNumber=s.appendChild(O(\"div\",pe(e.options,r),\"CodeMirror-linenumber CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[\"CodeMirror-linenumbers\"]+\"px; width: \"+e.display.lineNumInnerWidth+\"px\"))),o)for(var a=0;a<e.options.gutters.length;++a){var u=e.options.gutters[a],c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O(\"div\",[c],\"CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[u]+\"px; width: \"+n.gutterWidth[u]+\"px\"))}}}function dr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,\"CodeMirror-linewidget\"==n.className&&t.node.removeChild(n);pr(e,t,r)}function pr(e,t,r){if(gr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)gr(e,t.rest[n],t,r,!1)}function gr(e,t,r,n,i){if(t.widgets)for(var o=ar(r),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O(\"div\",[a.node],\"CodeMirror-linewidget\");a.handleMouseEvents||u.setAttribute(\"cm-ignore-events\",\"true\"),vr(a,u,r,n),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,r.gutter||r.text):o.appendChild(u),or(a,\"redraw\")}}function vr(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+\"px\",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+\"px\"),t.style.width=i+\"px\"}e.coverGutter&&(t.style.zIndex=5,t.style.position=\"relative\",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+\"px\"))}function mr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!D(document.body,e.node)){var r=\"position: relative;\";e.coverGutter&&(r+=\"margin-left: -\"+t.display.gutters.offsetWidth+\"px;\"),e.noHScroll&&(r+=\"width: \"+t.display.wrapper.clientWidth+\"px;\"),N(t.display.measure,O(\"div\",[e.node],null,r))}return e.height=e.node.parentNode.offsetHeight}function yr(e,t){for(var r=ht(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&\"true\"==r.getAttribute(\"cm-ignore-events\")||r.parentNode==e.sizer&&r!=e.mover)return!0}function br(e){return e.lineSpace.offsetTop}function wr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function xr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O(\"pre\",\"x\")),r=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,n={left:parseInt(r.paddingLeft),right:parseInt(r.paddingRight)};return isNaN(n.left)||isNaN(n.right)||(e.cachedPaddingH=n),n}function Cr(e){return G-e.display.nativeBarWidth}function Sr(e){return e.display.scroller.clientWidth-Cr(e)-e.display.barWidth}function Lr(e){return e.display.scroller.clientHeight-Cr(e)-e.display.barHeight}function kr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(he(e.rest[i])>r)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Tr(e,t,r,n){return Or(e,Nr(e,t),r,n)}function Mr(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[on(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Nr(e,t){var r=he(t),n=Mr(e,r);n&&!n.text?n=null:n&&n.changes&&(sr(e,n,r,Jr(e)),e.curOp.forceUpdate=!0),n||(n=function(e,t){var r=he(t=Be(t)),n=e.display.externalMeasured=new tr(e.doc,t,r);n.lineN=r;var i=n.built=qt(e,n);return n.text=i.pre,N(e.display.lineMeasure,i.pre),n}(e,t));var i=kr(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Or(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||\"\");return t.cache.hasOwnProperty(a)?o=t.cache[a]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(!function(e,t,r){var n=e.options.lineWrapping,i=n&&Sr(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Wr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c<o.coverEnd&&ie(t.line.text.charAt(o.coverStart+c));)++c;if((i=l&&s<9&&0==u&&c==o.coverEnd-o.coverStart?a.parentNode.getBoundingClientRect():Hr(k(a,u,c).getClientRects(),n)).left||i.right||0==u)break;c=u,u-=1,h=\"right\"}l&&s<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ct)return Ct;var t=N(e,O(\"span\",\"x\")),r=t.getBoundingClientRect(),n=k(t,0,1).getBoundingClientRect();return Ct=Math.abs(r.left-n.left)>1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n=\"right\"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d[\"right\"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+Qr(e.display),top:p.top,bottom:p.bottom}:Dr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;b<y.length-1&&!(m<y[b]);b++);var w=b?y[b-1]:0,x=y[b],C={left:(\"right\"==h?i.right:i.left)-t.rect.left,right:(\"left\"==h?i.left:i.right)-t.rect.left,top:w,bottom:x};i.left||i.right||(C.bogus=!0);e.options.singleCursorHeightPerLine||(C.rtop=g,C.rbottom=v);return C}(e,t,r,n)).bogus||(t.cache[a]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Ar,Dr={left:0,right:0,top:0,bottom:0};function Wr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l=\"left\"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,t>=a&&(l=\"right\")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?\"left\":\"right\")&&(l=r),\"left\"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l=\"left\";if(\"right\"==r&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l=\"right\";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Hr(e,t){var r=Dr;if(\"left\"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=0&&(r=e[i]).left==r.right;i--);return r}function Fr(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Pr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fr(e.display.view[t])}function Er(e){Pr(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function zr(){return c&&v?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Ir(){return c&&v?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Rr(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=mr(e.widgets[r]));return t}function Br(e,t,r,n,i){if(!i){var o=Rr(t);r.top+=o,r.bottom+=o}if(\"line\"==n)return r;n||(n=\"local\");var l=je(t);if(\"local\"==n?l+=br(e.display):l-=e.display.viewOffset,\"page\"==n||\"window\"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+(\"window\"==n?0:Ir());var a=s.left+(\"window\"==n?0:zr());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function Gr(e,t,r){if(\"div\"==r)return t;var n=t.left,i=t.top;if(\"page\"==r)n-=zr(),i-=Ir();else if(\"local\"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function Ur(e,t,r,n,i){return n||(n=se(e.doc,t.line)),Br(e,n,Tr(e,n,t.ch,i),r)}function Vr(e,t,r,n,i,o){function l(t,l){var s=Or(e,i,t,l?\"right\":\"left\",o);return l?s.left=s.right:s.right=s.left,Br(e,n,s,r)}n=n||se(e.doc,t.line),i||(i=Nr(e,n));var s=Ze(n,e.doc.direction),a=t.ch,u=t.sticky;if(a>=n.text.length?(a=n.text.length,u=\"before\"):a<=0&&(a=0,u=\"after\"),!s)return l(\"before\"==u?a-1:a,\"before\"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=qe(s,a,u),f=_e,d=c(a,h,\"before\"==u);return null!=f&&(d.other=c(a,f,\"before\"!=u)),d}function Kr(e,t){var r=0;t=Ce(e.doc,t),e.options.lineWrapping||(r=Qr(e.display)*t.ch);var n=se(e.doc,t.line),i=je(n)+br(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function jr(e,t,r,n,i){var o=ge(e,t,r);return o.xRel=i,n&&(o.outside=!0),o}function Xr(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return jr(n.first,0,null,!0,-1);var i=fe(n,r),o=n.first+n.size-1;if(i>o)return jr(n.first+n.size-1,se(n,o).text.length,null,!0,1);t<0&&(t=0);for(var l=se(n,i);;){var s=$r(e,l,i,t,r),a=Ie(l),u=a&&a.find(0,!0);if(!a||!(s.ch>u.from.ch||s.ch==u.from.ch&&s.xRel>0))return s;i=he(l=u.to.line)}}function Yr(e,t,r,n){n-=Rr(t);var i=t.text.length,o=le(function(t){return Or(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Or(e,r,t).top>n},o,i)}}function _r(e,t,r,n){return r||(r=Nr(e,t)),Yr(e,t,r,Br(e,t,Or(e,r,n),\"line\").top)}function qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function $r(e,t,r,n,i){i-=je(t);var o=Nr(e,t),l=Rr(t),s=0,a=t.text.length,u=!0,c=Ze(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=Yr(e,t,n,l),a=s.begin,u=s.end;/\\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f<i.length;f++){var d=i[f];if(!(d.from>=u||d.to<=a)){var p=1!=d.level,g=Or(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=g<o?o-g+1e9:g-o;(!c||h>v)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return qr(Vr(e,ge(r,u?a.to:a.from,u?\"before\":\"after\"),\"line\",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Vr(e,ge(r,u?a.from:a.to,u?\"after\":\"before\"),\"line\",t,n);qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Or(e,o,t);return r.top+=l,r.bottom+=l,!!qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left<g.right-n,b=y==u;v=p+(b?0:1),d=b?\"after\":\"before\",f=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?\"after\":v==t.text.length?\"before\":Or(e,o,v-(u?1:0)).bottom+l<=i==u?\"after\":\"before\";var w=Vr(e,ge(r,v,d),\"line\",t,o);f=w.left,m=i<w.top||i>=w.bottom}return jr(r,v=oe(t.text,v,1),d,m,n-f)}function Zr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Ar){Ar=O(\"pre\");for(var t=0;t<49;++t)Ar.appendChild(document.createTextNode(\"x\")),Ar.appendChild(O(\"br\"));Ar.appendChild(document.createTextNode(\"x\"))}N(e.measure,Ar);var r=Ar.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function Qr(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O(\"span\",\"xxxxxxxxxx\"),r=O(\"pre\",[t]);N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function Jr(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l)r[e.options.gutters[l]]=o.offsetLeft+o.clientLeft+i,n[e.options.gutters[l]]=o.clientWidth;return{fixedPos:en(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function en(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function tn(e){var t=Zr(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/Qr(e.display)-3);return function(i){if(Ve(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function rn(e){var t=e.doc,r=tn(e);t.iter(function(e){var t=r(e);t!=e.height&&ce(e,t)})}function nn(e,t,r,n){var i=e.display;if(!r&&\"true\"==ht(t).getAttribute(\"cm-not-content\"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=Xr(e,o,l);if(n&&1==u.xRel&&(a=se(e.doc,u.line).text).length==u.ch){var c=I(a,a.length,e.options.tabSize)-a.length;u=ge(u.line,Math.max(0,Math.round((o-xr(e.display).left)/Qr(e.display))-c))}return u}function on(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function ln(e){e.display.input.showSelection(e.display.input.prepareSelection())}function sn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&an(e,s.head,i),a||cn(e,s,o)}}return n}function an(e,t,r){var n=Vr(e,t,\"div\",null,null,!e.options.singleCursorHeightPerLine),i=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor\"));if(i.style.left=n.left+\"px\",i.style.top=n.top+\"px\",i.style.height=Math.max(0,n.bottom-n.top)*e.options.cursorHeight+\"px\",n.other){var o=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor CodeMirror-secondarycursor\"));o.style.display=\"\",o.style.left=n.other.left+\"px\",o.style.top=n.other.top+\"px\",o.style.height=.85*(n.other.bottom-n.other.top)+\"px\"}}function un(e,t){return e.top-t.top||e.left-t.left}function cn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFragment(),l=xr(e.display),s=l.left,a=Math.max(n.sizerWidth,Sr(e)-n.sizer.offsetLeft)-l.right,u=\"ltr\"==i.direction;function c(e,t,r,n){t<0&&(t=0),t=Math.round(t),n=Math.round(n),o.appendChild(O(\"div\",null,\"CodeMirror-selected\",\"position: absolute; left: \"+e+\"px;\\n top: \"+t+\"px; width: \"+(null==r?a-e:r)+\"px;\\n height: \"+(n-t)+\"px\"))}function h(t,r,n){var o,l,h=se(i,t),f=h.text.length;function d(r,n){return Ur(e,ge(t,r),\"div\",h,n)}function p(t,r,n){var i=_r(e,h,null,t),o=\"ltr\"==r==(\"after\"==n)?\"left\":\"right\";return d(\"after\"==n?i.begin:i.end-(/\\s/.test(h.text.charAt(i.end-1))?2:1),o)[o]}var g=Ze(h,i.direction);return function(e,t,r,n){if(!e)return n(t,r,\"ltr\",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?\"rtl\":\"ltr\",o),i=!0)}i||n(t,r,\"ltr\")}(g,r||0,null==n?f:n,function(e,t,i,h){var v=\"ltr\"==i,m=d(e,v?\"left\":\"right\"),y=d(t-1,v?\"right\":\"left\"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,\"before\"),N=u?s:p(t,i,\"after\"),O=u&&w&&C?a:y.right):(T=u?p(e,i,\"before\"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,\"after\"):a),c(T,m.top,M-T,m.bottom),m.bottom<y.top&&c(s,m.bottom,null,y.top),c(N,y.top,O-N,y.bottom)}(!o||un(m,o)<0)&&(o=m),un(y,o)<0&&(o=y),(!l||un(m,l)<0)&&(l=m),un(y,l)<0&&(l=y)}),{start:o,end:l}}var f=t.from(),d=t.to();if(f.line==d.line)h(f.line,f.ch,d.ch);else{var p=se(i,f.line),g=se(i,d.line),v=Be(p)==Be(g),m=h(f.line,f.ch,v?p.text.length+1:null).end,y=h(d.line,v?0:null,d.ch).start;v&&(m.top<y.top-2?(c(m.right,m.top,null,m.bottom),c(s,y.top,y.left,y.bottom)):c(m.right,m.top,y.left-m.right,m.bottom)),m.bottom<y.top&&c(s,m.bottom,null,y.top)}r.appendChild(o)}function hn(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility=\"\",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?\"\":\"hidden\"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility=\"hidden\")}}function fn(e){e.state.focused||(e.display.input.focus(),pn(e))}function dn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,gn(e))},100)}function pn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),\"nocursor\"!=e.options.readOnly&&(e.state.focused||(rt(e,\"focus\",e,t),e.state.focused=!0,H(e.display.wrapper,\"CodeMirror-focused\"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),hn(e))}function gn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(rt(e,\"blur\",e,t),e.state.focused=!1,T(e.display.wrapper,\"CodeMirror-focused\")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function vn(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.length;n++){var i=t.view[n],o=void 0;if(!i.hidden){if(l&&s<8){var a=i.node.offsetTop+i.node.offsetHeight;o=a-r,r=a}else{var u=i.node.getBoundingClientRect();o=u.bottom-u.top}var c=i.line.height-o;if(o<2&&(o=Zr(t)),(c>.005||c<-.005)&&(ce(i.line,o),mn(i.line),i.rest))for(var h=0;h<i.rest.length;h++)mn(i.rest[h])}}}function mn(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function yn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-br(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=fe(t,n),l=fe(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=fe(t,je(se(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=fe(t,je(se(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function bn(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=en(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+\"px\",l=0;l<r.length;l++)if(!r[l].hidden){e.options.fixedGutter&&(r[l].gutter&&(r[l].gutter.style.left=o),r[l].gutterBackground&&(r[l].gutterBackground.style.left=o));var s=r[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=n+i+\"px\")}}function wn(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=pe(e.options,t.first+t.size-1),n=e.display;if(r.length!=n.lineNumChars){var i=n.measure.appendChild(O(\"div\",[O(\"div\",r)],\"CodeMirror-linenumber CodeMirror-gutter-elt\")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return n.lineGutter.style.width=\"\",n.lineNumInnerWidth=Math.max(o,n.lineGutter.offsetWidth-l)+1,n.lineNumWidth=n.lineNumInnerWidth+l,n.lineNumChars=n.lineNumInnerWidth?r.length:-1,n.lineGutter.style.width=n.lineNumWidth+\"px\",oi(e),!0}return!1}function xn(e,t){var r=e.display,n=Zr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Lr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+wr(r),a=t.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Sr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<h?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>f+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Cn(e,t){null!=t&&(kn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sn(e){kn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Ln(e,t,r){null==t&&null==r||kn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function kn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tn(e,Kr(e,t.from),Kr(e,t.to),t.margin))}function Tn(e,t,r,n){var i=xn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});Ln(e,i.scrollLeft,i.scrollTop)}function Mn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||ii(e,{top:t}),Nn(e,t,!0),r&&ii(e),Jn(e,100))}function Nn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function On(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,bn(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function An(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+wr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+Cr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var Dn=function(e,t,r){this.cm=r;var n=this.vert=O(\"div\",[O(\"div\",null,null,\"min-width: 1px\")],\"CodeMirror-vscrollbar\"),i=this.horiz=O(\"div\",[O(\"div\",null,null,\"height: 100%; min-height: 1px\")],\"CodeMirror-hscrollbar\");e(n),e(i),Je(n,\"scroll\",function(){n.clientHeight&&t(n.scrollTop,\"vertical\")}),Je(i,\"scroll\",function(){i.clientWidth&&t(i.scrollLeft,\"horizontal\")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth=\"18px\")};Dn.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display=\"block\",this.vert.style.bottom=t?n+\"px\":\"0\";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+\"px\"}else this.vert.style.display=\"\",this.vert.firstChild.style.height=\"0\";if(t){this.horiz.style.display=\"block\",this.horiz.style.right=r?n+\"px\":\"0\",this.horiz.style.left=e.barLeft+\"px\";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+\"px\"}else this.horiz.style.display=\"\",this.horiz.firstChild.style.width=\"0\";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},Dn.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,\"horiz\")},Dn.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,\"vert\")},Dn.prototype.zeroWidthHack=function(){var e=y&&!d?\"12px\":\"18px\";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents=\"none\",this.disableHoriz=new R,this.disableVert=new R},Dn.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents=\"auto\",t.set(1e3,function n(){var i=e.getBoundingClientRect();(\"vert\"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents=\"none\":t.set(1e3,n)})},Dn.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Wn=function(){};function Hn(e,t){t||(t=An(e));var r=e.display.barWidth,n=e.display.barHeight;Fn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&vn(e),Fn(e,An(e)),r=e.display.barWidth,n=e.display.barHeight}function Fn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+\"px\",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+\"px\",r.heightForcer.style.borderBottom=n.bottom+\"px solid transparent\",n.right&&n.bottom?(r.scrollbarFiller.style.display=\"block\",r.scrollbarFiller.style.height=n.bottom+\"px\",r.scrollbarFiller.style.width=n.right+\"px\"):r.scrollbarFiller.style.display=\"\",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display=\"block\",r.gutterFiller.style.height=n.bottom+\"px\",r.gutterFiller.style.width=t.gutterWidth+\"px\"):r.gutterFiller.style.display=\"\"}Wn.prototype.update=function(){return{bottom:0,right:0}},Wn.prototype.setScrollLeft=function(){},Wn.prototype.setScrollTop=function(){},Wn.prototype.clear=function(){};var Pn={native:Dn,null:Wn};function En(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Pn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Je(t,\"mousedown\",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute(\"cm-not-content\",\"true\")},function(t,r){\"horizontal\"==r?On(e,t):Mn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var zn=0;function In(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++zn},t=e.curOp,nr?nr.ops.push(t):t.ownsGroup=nr={ops:[t],delayedCallbacks:[]}}function Rn(e){!function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}(r)}finally{nr=null,t(r)}}(e.curOp,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,r=0;r<t.length;r++)Bn(t[r]);for(var n=0;n<t.length;n++)(i=t[n]).updatedDisplay=i.mustUpdate&&ri(i.cm,i.update);var i;for(var o=0;o<t.length;o++)Gn(t[o]);for(var l=0;l<t.length;l++)Un(t[l]);for(var s=0;s<t.length;s++)Vn(t[s])}(e)})}function Bn(e){var t,r,n=e.cm,i=n.display;!(r=(t=n).display).scrollbarsClipped&&r.scroller.offsetWidth&&(r.nativeBarWidth=r.scroller.offsetWidth-r.scroller.clientWidth,r.heightForcer.style.height=Cr(t)+\"px\",r.sizer.style.marginBottom=-r.nativeBarWidth+\"px\",r.sizer.style.borderRightWidth=Cr(t)+\"px\",r.scrollbarsClipped=!0),e.updateMaxLine&&Ye(n),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<i.viewFrom||e.scrollToPos.to.line>=i.viewTo)||i.maxLineChanged&&n.options.lineWrapping,e.update=e.mustUpdate&&new ti(n,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Gn(e){var t=e.cm,r=t.display;e.updatedDisplay&&vn(t),e.barMeasure=An(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Tr(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+Cr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Sr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function Un(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+\"px\",e.maxScrollLeft<t.doc.scrollLeft&&On(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&Hn(t,e.barMeasure),e.updatedDisplay&&li(t,e.barMeasure),e.selectionChanged&&hn(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&fn(e.cm)}function Vn(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ni(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Nn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&On(t,e.scrollLeft,!0,!0),e.scrollToPos)&&function(e,t){if(!nt(e,\"scrollCursorIntoView\")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O(\"div\",\"\",null,\"position: absolute;\\n top: \"+(t.top-r.viewOffset-br(e.display))+\"px;\\n height: \"+(t.bottom-t.top+Cr(e)+r.barHeight)+\"px;\\n left: \"+t.left+\"px; width: \"+Math.max(2,t.right-t.left)+\"px;\");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r=\"before\"==(t=t.ch?ge(t.line,\"before\"==t.sticky?t.ch-1:t.ch,\"after\"):t).sticky?ge(t.line,t.ch+1,\"before\"):t);for(var o=0;o<5;o++){var l=!1,s=Vr(e,t),a=r&&r!=t?Vr(e,r):s,u=xn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(On(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,Ce(n,e.scrollToPos.from),Ce(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l<i.length;++l)i[l].lines.length||rt(i[l],\"hide\");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&rt(o[s],\"unhide\");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&rt(t,\"changes\",t,e.changeObjs),e.update&&e.update.finish()}function Kn(e,t){if(e.curOp)return t();In(e);try{return t()}finally{Rn(e)}}function jn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);In(e);try{return t.apply(e,arguments)}finally{Rn(e)}}}function Xn(e){return function(){if(this.curOp)return e.apply(this,arguments);In(this);try{return e.apply(this,arguments)}finally{Rn(this)}}}function Yn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);In(t);try{return e.apply(this,arguments)}finally{Rn(t)}}}function _n(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)ke&&Ge(e.doc,t)<i.viewTo&&$n(e);else if(r<=i.viewFrom)ke&&Ue(e.doc,r+n)>i.viewFrom?$n(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)$n(e);else if(t<=i.viewFrom){var o=Zn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):$n(e)}else if(r>=i.viewTo){var l=Zn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):$n(e)}else{var s=Zn(e,t,t,-1),a=Zn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(rr(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):$n(e)}var u=i.externalMeasured;u&&(r<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function qn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||t>=n.viewTo)){var o=n.view[on(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function $n(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Zn(e,t,r,n){var i,o=on(e,t),l=e.display.view;if(!ke||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Ge(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function Qn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function Jn(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(ei,e))}function ei(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var r=+new Date+e.options.workTime,n=zt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ot(t.mode,n.state):null,a=Pt(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&f<l.length;++f)h=l[f]!=o.styles[f];h&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&It(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)return Jn(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&Kn(e,function(){for(var t=0;t<i.length;t++)qn(e,i[t],\"text\")})}}var ti=function(e,t,r){var n=e.display;this.viewport=t,this.visible=yn(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Sr(e),this.force=r,this.dims=Jr(e),this.events=[]};function ri(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return $n(e),!1;if(!t.force&&t.visible.from>=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==Qn(e))return!1;wn(e)&&($n(e),t.dims=Jr(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFrom<o&&o-r.viewFrom<20&&(o=Math.max(n.first,r.viewFrom)),r.viewTo>l&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),ke&&(o=Ge(e.doc,o),l=Ue(e.doc,l));var s,u,c,h,f=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;u=o,c=l,0==(h=(s=e).display).view.length||u>=h.viewTo||c<=h.viewFrom?(h.view=rr(s,u,c),h.viewFrom=u):(h.viewFrom>u?h.view=rr(s,u,h.viewFrom).concat(h.view):h.viewFrom<u&&(h.view=h.view.slice(on(s,u))),h.viewFrom=u,h.viewTo<c?h.view=h.view.concat(rr(s,h.viewTo,c)):h.viewTo>c&&(h.view=h.view.slice(0,on(s,c)))),h.viewTo=c,r.viewOffset=je(se(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+\"px\";var d=Qn(e);if(!f&&0==d&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var p=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return d>4&&(r.lineDiv.style.display=\"none\"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display=\"none\":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h<u.length;h++){var f=u[h];if(f.hidden);else if(f.node&&f.node.parentNode==o){for(;l!=f.node;)l=s(l);var d=i&&null!=t&&t<=c&&f.lineNumber;f.changes&&(B(f.changes,\"gutter\")>-1&&(d=!1),sr(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(pe(e.options,c)))),l=f.node.nextSibling}else{var p=(m=c,b=r,void 0,w=ur(g=e,v=f),v.text=v.node=w.pre,w.bgClass&&(v.bgClass=w.bgClass),w.textClass&&(v.textClass=w.textClass),hr(g,v),fr(g,v,m,b),pr(g,v,b),v.node);o.insertBefore(p,l)}c+=f.size}var g,v,m,b,w;for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),d>4&&(r.lineDiv.style.display=\"\"),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(p),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,f&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,Jn(e,400)),r.updateLineNumbers=null,!0}function ni(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Sr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+wr(e.display)-Lr(e),r.top)}),t.visible=yn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ri(e,t);n=!1){vn(e);var i=An(e);ln(e),Hn(e,i),li(e,i),t.force=!1}t.signal(e,\"update\",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,\"viewportChange\",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function ii(e,t){var r=new ti(e,t);if(ri(e,r)){vn(e),ni(e,r);var n=An(e);ln(e),Hn(e,n),li(e,n),r.finish()}}function oi(e){var t=e.display.gutters.offsetWidth;e.display.sizer.style.marginLeft=t+\"px\"}function li(e,t){e.display.sizer.style.minHeight=t.docHeight+\"px\",e.display.heightForcer.style.top=t.docHeight+\"px\",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Cr(e)+\"px\"}function si(e){var t=e.display.gutters,r=e.options.gutters;M(t);for(var n=0;n<r.length;++n){var i=r[n],o=t.appendChild(O(\"div\",null,\"CodeMirror-gutter \"+i));\"CodeMirror-linenumbers\"==i&&(e.display.lineGutter=o,o.style.width=(e.display.lineNumWidth||1)+\"px\")}t.style.display=n?\"\":\"none\",oi(e)}function ai(e){var t=B(e.gutters,\"CodeMirror-linenumbers\");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat([\"CodeMirror-linenumbers\"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}ti.prototype.signal=function(e,t){ot(e,t)&&this.events.push(arguments)},ti.prototype.finish=function(){for(var e=0;e<this.events.length;e++)rt.apply(null,this.events[e])};var ui=0,ci=null;function hi(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}}function fi(e){var t=hi(e);return t.x*=ci,t.y*=ci,t}function di(e,t){var n=hi(t),i=n.x,o=n.y,l=e.display,s=l.scroller,u=s.scrollWidth>s.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p<d.length;p++)if(d[p].node==f){e.display.currentWheelTarget=f;break e}if(i&&!r&&!h&&null!=ci)return o&&c&&Mn(e,Math.max(0,s.scrollTop+o*ci)),On(e,Math.max(0,s.scrollLeft+i*ci)),(!o||o&&c)&&st(t),void(l.wheelStartX=null);if(o&&null!=ci){var g=o*ci,v=e.doc.scrollTop,m=v+l.wrapper.clientHeight;g<0?v=Math.max(0,v+g-50):m=Math.min(e.doc.height,m+g+50),ii(e,{top:v,bottom:m})}ui<20&&(null==l.wheelStartX?(l.wheelStartX=s.scrollLeft,l.wheelStartY=s.scrollTop,l.wheelDX=i,l.wheelDY=o,setTimeout(function(){if(null!=l.wheelStartX){var e=s.scrollLeft-l.wheelStartX,t=s.scrollTop-l.wheelStartY,r=t&&l.wheelDY&&t/l.wheelDY||e&&l.wheelDX&&e/l.wheelDX;l.wheelStartX=l.wheelStartY=null,r&&(ci=(ci*ui+r)/(ui+1),++ui)}},200)):(l.wheelDX+=i,l.wheelDY+=o))}}l?ci=-.53:r?ci=15:c?ci=-.7:f&&(ci=-1/3);var pi=function(e,t){this.ranges=e,this.primIndex=t};pi.prototype.primary=function(){return this.ranges[this.primIndex]},pi.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var r=this.ranges[t],n=e.ranges[t];if(!me(r.anchor,n.anchor)||!me(r.head,n.head))return!1}return!0},pi.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new gi(ye(this.ranges[t].anchor),ye(this.ranges[t].head));return new pi(e,this.primIndex)},pi.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},pi.prototype.contains=function(e,t){t||(t=e);for(var r=0;r<this.ranges.length;r++){var n=this.ranges[r];if(ve(t,n.from())>=0&&ve(e,n.to())<=0)return r}return-1};var gi=function(e,t){this.anchor=e,this.head=t};function vi(e,t){var r=e[t];e.sort(function(e,t){return ve(e.from(),t.from())}),t=B(e,r);for(var n=1;n<e.length;n++){var i=e[n],o=e[n-1];if(ve(o.to(),i.from())>=0){var l=we(o.from(),i.from()),s=be(o.to(),i.to()),a=o.empty()?i.from()==i.head:o.from()==o.head;n<=t&&--t,e.splice(--n,2,new gi(a?s:l,a?l:s))}}return new pi(e,t)}function mi(e,t){return new pi([new gi(e,t||e)],0)}function yi(e){return e.text?ge(e.from.line+e.text.length-1,q(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function bi(e,t){if(ve(e,t.from)<0)return e;if(ve(e,t.to)<=0)return yi(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=yi(t).ch-t.to.ch),ge(r,n)}function wi(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel.ranges[n];r.push(new gi(bi(i.anchor,t),bi(i.head,t)))}return vi(r,e.sel.primIndex)}function xi(e,t,r){return e.line==t.line?ge(r.line,e.ch-t.ch+r.ch):ge(r.line+(e.line-t.line),e.ch)}function Ci(e){e.doc.mode=Tt(e.options,e.doc.modeOption),Si(e)}function Si(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Jn(e,100),e.state.modeGen++,e.curOp&&_n(e)}function Li(e,t){return 0==t.from.ch&&0==t.to.ch&&\"\"==q(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function ki(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){!function(e,t,r,n){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),De(e),We(e,r);var i=n?n(e):1;i!=e.height&&ce(e,i)}(e,r,i,n),or(e,\"change\",e,t)}function l(e,t){for(var r=[],o=e;o<t;++o)r.push(new jt(u[o],i(o),n));return r}var s=t.from,a=t.to,u=t.text,c=se(e,s.line),h=se(e,a.line),f=q(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Li(e,t)){var g=l(0,u.length-1);o(h,h.text,d),p&&e.remove(s.line,p),g.length&&e.insert(s.line,g)}else if(c==h)if(1==u.length)o(c,c.text.slice(0,s.ch)+f+c.text.slice(a.ch),d);else{var v=l(1,u.length-1);v.push(new jt(f+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,v)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+h.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(h,f+h.text.slice(a.ch),d);var m=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}or(e,\"change\",e,t)}function Ti(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;l<n.linked.length;++l){var s=n.linked[l];if(s.doc!=i){var a=o&&s.sharedHist;r&&!a||(t(s.doc,a),e(s.doc,n,a))}}}(e,null,!0)}function Mi(e,t){if(t.cm)throw new Error(\"This document is already in use.\");e.doc=t,t.cm=e,rn(e),Ci(e),Ni(e),e.options.lineWrapping||Ye(e),e.options.mode=t.modeOption,_n(e)}function Ni(e){(\"rtl\"==e.doc.direction?H:T)(e.display.lineDiv,\"CodeMirror-rtl\")}function Oi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Ai(e,t){var r={from:ye(t.from),to:yi(t),text:ae(e,t.from,t.to)};return Pi(e,r,t.from.line,t.to.line+1),Ti(e,function(e){return Pi(e,r,t.from.line,t.to.line+1)},!0),r}function Di(e){for(;e.length;){if(!q(e).ranges)break;e.pop()}}function Wi(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&(\"+\"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||\"*\"==t.origin.charAt(0)))&&(s=i,o=i.lastOp==n?(Di(s.done),q(s.done)):s.done.length&&!q(s.done).ranges?q(s.done):s.done.length>1&&!s.done[s.done.length-2].ranges?(s.done.pop(),q(s.done)):void 0))l=q(o.changes),0==ve(t.from,t.to)&&0==ve(t.from,l.to)?l.to=yi(t):o.changes.push(Ai(e,t));else{var u=q(i.done);for(u&&u.ranges||Fi(e.sel,i.done),o={changes:[Ai(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||rt(e,\"historyAdded\")}function Hi(e,t,r,n){var i,o,l,s,a,u=e.history,c=n&&n.origin;r==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=q(u.done),s=t,\"*\"==(a=o.charAt(0))||\"+\"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Fi(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=r,n&&!1!==n.clearRedo&&Di(u.undone)}function Fi(e,t){var r=q(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Pi(e,t,r,n){var i=t[\"spans_\"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t[\"spans_\"+e.id]={}))[o]=r.markedSpans),++o})}function Ei(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marker.explicitlyCleared?t||(t=e.slice(0,r)):t&&t.push(e[r]);return t?t.length?t:null:e}function zi(e,t){var r=function(e,t){var r=t[\"spans_\"+e.id];if(!r)return null;for(var n=[],i=0;i<t.text.length;++i)n.push(Ei(r[i]));return n}(e,t),n=Oe(e,t);if(!r)return n;if(!n)return r;for(var i=0;i<r.length;++i){var o=r[i],l=n[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(r[i]=l)}return r}function Ii(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)n.push(r?pi.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];n.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\\d+)$/))&&B(t,Number(c[1]))>-1&&(q(s)[h]=u[h],delete u[h])}}}return n}function Ri(e,t,r,n){if(n){var i=e.anchor;if(r){var o=ve(t,i)<0;o!=ve(r,i)<0?(i=t,t=r):o!=ve(t,r)<0&&(t=r)}return new gi(i,t)}return new gi(r||t,t)}function Bi(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),ji(e,new pi([Ri(e.sel.primary(),t,r,i)],0),n)}function Gi(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)n[o]=Ri(e.sel.ranges[o],t[o],null,i);ji(e,vi(n,e.sel.primIndex),r)}function Ui(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,ji(e,vi(i,e.sel.primIndex),n)}function Vi(e,t,r,n){ji(e,mi(t,r),n)}function Ki(e,t,r){var n=e.history.done,i=q(n);i&&i.ranges?(n[n.length-1]=t,Xi(e,t,r)):ji(e,t,r)}function ji(e,t,r){Xi(e,t,r),Hi(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}function Xi(e,t,r){var n,i,o,l;(ot(e,\"beforeSelectionChange\")||e.cm&&ot(e.cm,\"beforeSelectionChange\"))&&(n=e,o=r,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new gi(Ce(n,e[t].anchor),Ce(n,e[t].head))},origin:o&&o.origin},rt(n,\"beforeSelectionChange\",n,l),n.cm&&rt(n.cm,\"beforeSelectionChange\",n.cm,l),t=l.ranges!=i.ranges?vi(l.ranges,l.ranges.length-1):i),Yi(e,qi(e,t,r&&r.bias||(ve(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),r&&!1===r.scroll||!e.cm||Sn(e.cm)}function Yi(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=!0,it(e.cm)),or(e,\"cursorActivity\",e))}function _i(e){Yi(e,qi(e,e.sel,null,!1))}function qi(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Zi(e,l.anchor,s&&s.anchor,r,n),u=Zi(e,l.head,s&&s.head,r,n);(i||a!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new gi(a,u))}return i?vi(i,t.primIndex):t}function $i(e,t,r,n,i){var o=se(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker;if((null==s.from||(a.inclusiveLeft?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(a.inclusiveRight?s.to>=t.ch:s.to>t.ch))){if(i&&(rt(a,\"beforeCursorEnter\"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var u=a.find(n<0?1:-1),c=void 0;if((n<0?a.inclusiveRight:a.inclusiveLeft)&&(u=Qi(e,u,-n,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=ve(u,r))&&(n<0?c<0:c>0))return $i(e,u,t,n,i)}var h=a.find(n<0?-1:1);return(n<0?a.inclusiveLeft:a.inclusiveRight)&&(h=Qi(e,h,n,h.line==t.line?o:null)),h?$i(e,h,t,n,i):null}}return t}function Zi(e,t,r,n,i){var o=n||1,l=$i(e,t,r,o,i)||!i&&$i(e,t,r,o,!0)||$i(e,t,r,-o,i)||!i&&$i(e,t,r,-o,!0);return l||(e.cantEdit=!0,ge(e.first,0))}function Qi(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?Ce(e,ge(t.line-1)):null:r>0&&t.ch==(n||se(e,t.line)).text.length?t.line<e.first+e.size-1?ge(t.line+1,0):null:new ge(t.line,t.ch+r)}function Ji(e){e.setSelection(ge(e.firstLine(),0),ge(e.lastLine()),V)}function eo(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return n.canceled=!0}};return r&&(n.update=function(t,r,i,o){t&&(n.from=Ce(e,t)),r&&(n.to=Ce(e,r)),i&&(n.text=i),void 0!==o&&(n.origin=o)}),rt(e,\"beforeChange\",e,n),e.cm&&rt(e.cm,\"beforeChange\",e.cm,n),n.canceled?null:{from:n.from,to:n.to,text:n.text,origin:n.origin}}function to(e,t,r){if(e.cm){if(!e.cm.curOp)return jn(e.cm,to)(e,t,r);if(e.cm.state.suppressEdits)return}if(!(ot(e,\"beforeChange\")||e.cm&&ot(e.cm,\"beforeChange\"))||(t=eo(e,t,!0))){var n=Le&&!r&&function(e,t,r){var n=null;if(e.iter(t.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var r=e.markedSpans[t].marker;!r.readOnly||n&&-1!=B(n,r)||(n||(n=[])).push(r)}}),!n)return null;for(var i=[{from:t,to:r}],o=0;o<n.length;++o)for(var l=n[o],s=l.find(0),a=0;a<i.length;++a){var u=i[a];if(!(ve(u.to,s.from)<0||ve(u.from,s.to)>0)){var c=[a,1],h=ve(u.from,s.from),f=ve(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)ro(e,{from:n[i].from,to:n[i].to,text:i?[\"\"]:t.text,origin:t.origin});else ro(e,t)}}function ro(e,t){if(1!=t.text.length||\"\"!=t.text[0]||0!=ve(t.from,t.to)){var r=wi(e,t);Wi(e,t,r,e.cm?e.cm.curOp.id:NaN),oo(e,t,r,Oe(e,t));var n=[];Ti(e,function(e,r){r||-1!=B(n,e.history)||(uo(e.history,t),n.push(e.history)),oo(e,t,null,Oe(e,t))})}}function no(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s=\"undo\"==t?o.done:o.undone,a=\"undo\"==t?o.undone:o.done,u=0;u<s.length&&(i=s[u],r?!i.ranges||i.equals(e.sel):i.ranges);u++);if(u!=s.length){for(o.lastOrigin=o.lastSelOrigin=null;;){if(!(i=s.pop()).ranges){if(n)return void s.push(i);break}if(Fi(i,a),r&&!i.equals(e.sel))return void ji(e,i,{clearRedo:!1});l=i}var c=[];Fi(l,a),a.push({changes:c,generation:o.generation}),o.generation=i.generation||++o.maxGeneration;for(var h=ot(e,\"beforeChange\")||e.cm&&ot(e.cm,\"beforeChange\"),f=function(r){var n=i.changes[r];if(n.origin=t,h&&!eo(e,n,!1))return s.length=0,{};c.push(Ai(e,n));var o=r?wi(e,n):q(s);oo(e,n,o,zi(e,n)),!r&&e.cm&&e.cm.scrollIntoView({from:n.from,to:yi(n)});var l=[];Ti(e,function(e,t){t||-1!=B(l,e.history)||(uo(e.history,n),l.push(e.history)),oo(e,n,null,zi(e,n))})},d=i.changes.length-1;d>=0;--d){var p=f(d);if(p)return p.v}}}}function io(e,t){if(0!=t&&(e.first+=t,e.sel=new pi($(e.sel.ranges,function(e){return new gi(ge(e.anchor.line+t,e.anchor.ch),ge(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){_n(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;n<r.viewTo;n++)qn(e.cm,n,\"gutter\")}}function oo(e,t,r,n){if(e.cm&&!e.cm.curOp)return jn(e.cm,oo)(e,t,r,n);if(t.to.line<e.first)io(e,t.text.length-1-(t.to.line-t.from.line));else if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);io(e,i),t={from:ge(e.first,0),to:ge(t.to.line+i,t.to.ch),text:[q(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:ge(o,se(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ae(e,t.from,t.to),r||(r=wi(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=he(Be(se(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&it(e);ki(n,t,r,tn(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Xe(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var r=e.first,n=t-1;n>r;n--){var i=se(e,n).stateAfter;if(i&&(!(i instanceof Ht)||n+i.lookAhead<t)){r=n+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,r)}})(n,o.line),Jn(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?_n(e):o.line!=l.line||1!=t.text.length||Li(e.doc,t)?_n(e,o.line,l.line+1,u):qn(e,o.line,\"text\");var c=ot(e,\"changes\"),h=ot(e,\"change\");if(h||c){var f={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};h&&or(e,\"change\",e,f),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(f)}e.display.selForContextMenu=null}(e.cm,t,n):ki(e,t,n),Xi(e,r,V)}}function lo(e,t,r,n,i){var o;(n||(n=r),ve(n,r)<0)&&(r=(o=[n,r])[0],n=o[1]);\"string\"==typeof t&&(t=e.splitLines(t)),to(e,{from:r,to:n,text:t,origin:i})}function so(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}function ao(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)so(o.ranges[s].anchor,t,r,n),so(o.ranges[s].head,t,r,n)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(r<u.from.line)u.from=ge(u.from.line+n,u.from.ch),u.to=ge(u.to.line+n,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function uo(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;ao(e.done,r,n,i),ao(e.undone,r,n,i)}function co(e,t,r,n){var i=t,o=t;return\"number\"==typeof t?o=se(e,xe(e,t)):i=he(t),null==i?null:(n(o,i)&&e.cm&&qn(e.cm,i,r),o)}function ho(e){this.lines=e,this.parent=null;for(var t=0,r=0;r<e.length;++r)e[r].parent=this,t+=e[r].height;this.height=t}function fo(e){this.children=e;for(var t=0,r=0,n=0;n<e.length;++n){var i=e[n];t+=i.chunkSize(),r+=i.height,i.parent=this}this.size=t,this.height=r,this.parent=null}gi.prototype.from=function(){return we(this.anchor,this.head)},gi.prototype.to=function(){return be(this.anchor,this.head)},gi.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},ho.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var r,n=e,i=e+t;n<i;++n){var o=this.lines[n];this.height-=o.height,(r=o).parent=null,De(r),or(o,\"delete\")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var n=0;n<t.length;++n)t[n].parent=this},iterN:function(e,t,r){for(var n=e+t;e<n;++e)if(r(this.lines[e]))return!0}},fo.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var r=0;r<this.children.length;++r){var n=this.children[r],i=n.chunkSize();if(e<i){var o=Math.min(t,i-e),l=n.height;if(n.removeInner(e,o),this.height-=l-n.height,i==o&&(this.children.splice(r--,1),n.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof ho))){var s=[];this.collapse(s),this.children=[new ho(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,r){this.size+=t.length,this.height+=r;for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,r),i.lines&&i.lines.length>50){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new ho(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++n,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=new fo(e.children.splice(e.children.length-5,5));if(e.parent){e.size-=t.size,e.height-=t.height;var r=B(e.parent.children,e);e.parent.children.splice(r+1,0,t)}else{var n=new fo(e.children);n.parent=e,e.children=[n,t],e=n}t.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,r))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var po=function(e,t,r){if(r)for(var n in r)r.hasOwnProperty(n)&&(this[n]=r[n]);this.doc=e,this.node=t};function go(e,t,r){je(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cn(e,r)}po.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,r=this.line,n=he(r);if(null!=n&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(r.widgets=null);var o=mr(this);ce(r,Math.max(0,r.height-o)),e&&(Kn(e,function(){go(e,r,-o),qn(e,n,\"widget\")}),or(e,\"lineWidgetCleared\",e,this,n))}},po.prototype.changed=function(){var e=this,t=this.height,r=this.doc.cm,n=this.line;this.height=null;var i=mr(this)-t;i&&(ce(n,n.height+i),r&&Kn(r,function(){r.curOp.forceUpdate=!0,go(r,n,i),or(r,\"lineWidgetChanged\",r,e,he(n))}))},lt(po);var vo=0,mo=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++vo};function yo(e,t,r,n,i){if(n&&n.shared)return function(e,t,r,n,i){(n=z(n)).shared=!1;var o=[yo(e,t,r,n,i)],l=o[0],s=n.widgetNode;return Ti(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(yo(e,Ce(e,t),Ce(e,r),n,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;l=q(o)}),new bo(o,l)}(e,t,r,n,i);if(e.cm&&!e.cm.curOp)return jn(e.cm,yo)(e,t,r,n,i);var o=new mo(e,i),l=ve(t,r);if(n&&z(n,o,!1),l>0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A(\"span\",[o.replacedWith],\"CodeMirror-widget\"),n.handleMouseEvents||o.widgetNode.setAttribute(\"cm-ignore-events\",\"true\"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Re(e,t.line,t,r,o)||t.line!=r.line&&Re(e,r.line,t,r,o))throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");ke=!0}o.addToHistory&&Wi(e,{from:t,to:r,origin:\"markText\"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){var n,i;u&&o.collapsed&&!u.options.lineWrapping&&Be(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&ce(e,0),n=e,i=new Te(o,a==t.line?t.ch:null,a==r.line?r.ch:null),n.markedSpans=n.markedSpans?n.markedSpans.concat([i]):[i],i.marker.attachLine(n),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Ve(e,t)&&ce(t,0)}),o.clearOnEnter&&Je(o,\"beforeCursorEnter\",function(){return o.clear()}),o.readOnly&&(Le=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++vo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)_n(u,t.line,r.line+1);else if(o.className||o.title||o.startStyle||o.endStyle||o.css)for(var c=t.line;c<=r.line;c++)qn(u,c,\"text\");o.atomic&&_i(u.doc),or(u,\"markerAdded\",u,o)}return o}mo.prototype.clear=function(){var e=this;if(!this.explicitlyCleared){var t=this.doc.cm,r=t&&!t.curOp;if(r&&In(t),ot(this,\"clear\")){var n=this.find();n&&or(this,\"clear\",n.from,n.to)}for(var i=null,o=null,l=0;l<this.lines.length;++l){var s=e.lines[l],a=Me(s.markedSpans,e);t&&!e.collapsed?qn(t,he(s),\"text\"):t&&(null!=a.to&&(o=he(s)),null!=a.from&&(i=he(s))),s.markedSpans=Ne(s.markedSpans,a),null==a.from&&e.collapsed&&!Ve(e.doc,s)&&t&&ce(s,Zr(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var u=0;u<this.lines.length;++u){var c=Be(e.lines[u]),h=Xe(c);h>t.display.maxLineLength&&(t.display.maxLine=c,t.display.maxLineLength=h,t.display.maxLineChanged=!0)}null!=i&&t&&this.collapsed&&_n(t,i,o+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&_i(t.doc)),t&&or(t,\"markerCleared\",t,this,i,o),r&&Rn(t),this.parent&&this.parent.clear()}},mo.prototype.find=function(e,t){var r,n;null==e&&\"bookmark\"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Me(o.markedSpans,this);if(null!=l.from&&(r=ge(t?o:he(o),l.from),-1==e))return r;if(null!=l.to&&(n=ge(t?o:he(o),l.to),1==e))return n}return r&&{from:r,to:n}},mo.prototype.changed=function(){var e=this,t=this.find(-1,!0),r=this,n=this.doc.cm;t&&n&&Kn(n,function(){var i=t.line,o=he(t.line),l=Mr(n,o);if(l&&(Fr(l),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0,!Ve(r.doc,i)&&null!=r.height){var s=r.height;r.height=null;var a=mr(r)-s;a&&ce(i,i.height+a)}or(n,\"markerChanged\",n,e)})},mo.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},mo.prototype.detachLine=function(e){if(this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},lt(mo);var bo=function(e,t){this.markers=e,this.primary=t;for(var r=0;r<e.length;++r)e[r].parent=this};function wo(e){return e.findMarks(ge(e.first,0),e.clipPos(ge(e.lastLine())),function(e){return e.parent})}function xo(e){for(var t=function(t){var r=e[t],n=[r.primary.doc];Ti(r.primary.doc,function(e){return n.push(e)});for(var i=0;i<r.markers.length;i++){var o=r.markers[i];-1==B(n,o.doc)&&(o.parent=null,r.markers.splice(i--,1))}},r=0;r<e.length;r++)t(r)}bo.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();or(this,\"clear\")}},bo.prototype.find=function(e,t){return this.primary.find(e,t)},lt(bo);var Co=0,So=function(e,t,r,n,i){if(!(this instanceof So))return new So(e,t,r,n,i);null==r&&(r=0),fo.call(this,[new ho([new jt(\"\",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=r;var o=ge(r,0);this.sel=mi(o),this.history=new Oi(null),this.id=++Co,this.modeOption=t,this.lineSep=n,this.direction=\"rtl\"==i?\"rtl\":\"ltr\",this.extend=!1,\"string\"==typeof e&&(e=this.splitLines(e)),ki(this,{from:o,to:o,text:e}),ji(this,mi(o),V)};So.prototype=Q(fo.prototype,{constructor:So,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n<t.length;++n)r+=t[n].height;this.insertInner(e-this.first,t,r)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=ue(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Yn(function(e){var t=ge(this.first,0),r=this.first+this.size-1;to(this,{from:t,to:ge(r,se(this,r).text.length),text:this.splitLines(e),origin:\"setValue\",full:!0},!0),this.cm&&Ln(this.cm,0,0),ji(this,mi(t),V)}),replaceRange:function(e,t,r,n){lo(this,e,t=Ce(this,t),r=r?Ce(this,r):t,n)},getRange:function(e,t,r){var n=ae(this,Ce(this,e),Ce(this,t));return!1===r?n:n.join(r||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(de(this,e))return se(this,e)},getLineNumber:function(e){return he(e)},getLineHandleVisualStart:function(e){return\"number\"==typeof e&&(e=se(this,e)),Be(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return Ce(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||\"head\"==e?t.head:\"anchor\"==e?t.anchor:\"end\"==e||\"to\"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Yn(function(e,t,r){Vi(this,Ce(this,\"number\"==typeof e?ge(e,t||0):e),null,r)}),setSelection:Yn(function(e,t,r){Vi(this,Ce(this,e),Ce(this,t||e),r)}),extendSelection:Yn(function(e,t,r){Bi(this,Ce(this,e),t&&Ce(this,t),r)}),extendSelections:Yn(function(e,t){Gi(this,Se(this,e),t)}),extendSelectionsBy:Yn(function(e,t){Gi(this,Se(this,$(this.sel.ranges,e)),t)}),setSelections:Yn(function(e,t,r){if(e.length){for(var n=[],i=0;i<e.length;i++)n[i]=new gi(Ce(this,e[i].anchor),Ce(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),ji(this,vi(n,t),r)}}),addSelection:Yn(function(e,t,r){var n=this.sel.ranges.slice(0);n.push(new gi(Ce(this,e),Ce(this,t||e))),ji(this,vi(n,n.length-1),r)}),getSelection:function(e){for(var t,r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());t=t?t.concat(i):i}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[n]=i}return t},replaceSelection:function(e,t,r){for(var n=[],i=0;i<this.sel.ranges.length;i++)n[i]=e;this.replaceSelections(n,t,r||\"+input\")},replaceSelections:Yn(function(e,t,r){for(var n=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];n[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:r}}for(var s=t&&\"end\"!=t&&function(e,t,r){for(var n=[],i=ge(e.first,0),o=i,l=0;l<t.length;l++){var s=t[l],a=xi(s.from,i,o),u=xi(yi(s),i,o);if(i=s.to,o=u,\"around\"==r){var c=e.sel.ranges[l],h=ve(c.head,c.anchor)<0;n[l]=new gi(h?u:a,h?a:u)}else n[l]=new gi(a,a)}return new pi(n,e.sel.primIndex)}(this,n,t),a=n.length-1;a>=0;a--)to(this,n[a]);s?Ki(this,s):this.cm&&Sn(this.cm)}),undo:Yn(function(){no(this,\"undo\")}),redo:Yn(function(){no(this,\"redo\")}),undoSelection:Yn(function(){no(this,\"undo\",!0)}),redoSelection:Yn(function(){no(this,\"redo\",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n<e.done.length;n++)e.done[n].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++r;return{undo:t,redo:r}},clearHistory:function(){this.history=new Oi(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Ii(this.history.done),undone:Ii(this.history.undone)}},setHistory:function(e){var t=this.history=new Oi(this.history.maxGeneration);t.done=Ii(e.done.slice(0),null,!0),t.undone=Ii(e.undone.slice(0),null,!0)},setGutterMarker:Yn(function(e,t,r){return co(this,e,\"gutter\",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&re(n)&&(e.gutterMarkers=null),!0})}),clearGutter:Yn(function(e){var t=this;this.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&co(t,r,\"gutter\",function(){return r.gutterMarkers[e]=null,re(r.gutterMarkers)&&(r.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if(\"number\"==typeof e){if(!de(this,e))return null;if(t=e,!(e=se(this,e)))return null}else if(null==(t=he(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Yn(function(e,t,r){return co(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\";if(e[n]){if(L(r).test(e[n]))return!1;e[n]+=\" \"+r}else e[n]=r;return!0})}),removeLineClass:Yn(function(e,t,r){return co(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\",i=e[n];if(!i)return!1;if(null==r)e[n]=null;else{var o=i.match(L(r));if(!o)return!1;var l=o.index+o[0].length;e[n]=i.slice(0,o.index)+(o.index&&l!=i.length?\" \":\"\")+i.slice(l)||null}return!0})}),addLineWidget:Yn(function(e,t,r){return i=e,o=new po(n=this,t,r),(l=n.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),co(n,i,\"widget\",function(e){var t=e.widgets||(e.widgets=[]);if(null==o.insertAt?t.push(o):t.splice(Math.min(t.length-1,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!Ve(n,e)){var r=je(e)<n.scrollTop;ce(e,e.height+mr(o)),r&&Cn(l,o.height),l.curOp.forceUpdate=!0}return!0}),l&&or(l,\"lineWidgetAdded\",l,o,\"number\"==typeof i?i:he(i)),o;var n,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,r){return yo(this,Ce(this,e),Ce(this,t),r,r&&r.type||\"range\")},setBookmark:function(e,t){var r={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return yo(this,e=Ce(this,e),e,r,\"bookmark\")},findMarksAt:function(e){var t=[],r=se(this,(e=Ce(this,e)).line).markedSpans;if(r)for(var n=0;n<r.length;++n){var i=r[n];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=Ce(this,e),t=Ce(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s<l.length;s++){var a=l[s];null!=a.to&&i==e.line&&e.ch>=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;n<r.length;++n)null!=r[n].from&&e.push(r[n].marker)}),e},posFromIndex:function(e){var t,r=this.first,n=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+n;if(o>e)return t=e,!0;e-=o,++r}),Ce(this,ge(r,t))},indexFromPos:function(e){var t=(e=Ce(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var r=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+r}),t},copy:function(e){var t=new So(ue(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,r=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<r&&(r=e.to);var n=new So(ue(this,t,r),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(n.history=this.history),(this.linked||(this.linked=[])).push({doc:n,sharedHist:e.sharedHist}),n.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r],i=n.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(ve(o,l)){var s=yo(e,o,l,n.primary,n.primary.type);n.markers.push(s),s.parent=n}}}(n,wo(this)),n},unlinkDoc:function(e){if(e instanceof wl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),xo(wo(this));break}}if(e.history==this.history){var r=[e.id];Ti(e,function(e){return r.push(e.id)},!0),e.history=new Oi(null),e.history.done=Ii(this.history.done,r),e.history.undone=Ii(this.history.undone,r)}},iterLinkedDocs:function(e){Ti(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):bt(e)},lineSeparator:function(){return this.lineSep||\"\\n\"},setDirection:Yn(function(e){var t;(\"rtl\"!=e&&(e=\"ltr\"),e!=this.direction)&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Kn(t=this.cm,function(){Ni(t),_n(t)}))})}),So.prototype.eachLine=So.prototype.iter;var Lo=0;function ko(e){var t=this;if(To(t),!nt(t,e)&&!yr(t.display,e)){st(e),l&&(Lo=+new Date);var r=nn(t,e,!0),n=e.dataTransfer.files;if(r&&!t.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),s=0,a=function(e,n){if(!t.options.allowDropFileTypes||-1!=B(t.options.allowDropFileTypes,e.type)){var l=new FileReader;l.onload=jn(t,function(){var e=l.result;if(/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(e)&&(e=\"\"),o[n]=e,++s==i){var a={from:r=Ce(t.doc,r),to:r,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:\"paste\"};to(t.doc,a),Ki(t.doc,mi(r,yi(a)))}}),l.readAsText(e)}},u=0;u<i;++u)a(n[u],u);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData(\"Text\");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),Xi(t.doc,mi(r,r)),h)for(var f=0;f<h.length;++f)lo(t.doc,\"\",h[f].anchor,h[f].head,\"drag\");t.replaceSelection(c,\"around\",\"paste\"),t.display.input.focus()}}catch(e){}}}}function To(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function Mo(e){if(document.getElementsByClassName)for(var t=document.getElementsByClassName(\"CodeMirror\"),r=0;r<t.length;r++){var n=t[r].CodeMirror;n&&e(n)}}var No=!1;function Oo(){var e;No||(Je(window,\"resize\",function(){null==e&&(e=setTimeout(function(){e=null,Mo(Ao)},100))}),Je(window,\"blur\",function(){return Mo(gn)}),No=!0)}function Ao(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}for(var Do={3:\"Pause\",8:\"Backspace\",9:\"Tab\",13:\"Enter\",16:\"Shift\",17:\"Ctrl\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"PrintScrn\",45:\"Insert\",46:\"Delete\",59:\";\",61:\"=\",91:\"Mod\",92:\"Mod\",93:\"Mod\",106:\"*\",107:\"=\",109:\"-\",110:\".\",111:\"/\",127:\"Delete\",145:\"ScrollLock\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",63232:\"Up\",63233:\"Down\",63234:\"Left\",63235:\"Right\",63272:\"Delete\",63273:\"Home\",63275:\"End\",63276:\"PageUp\",63277:\"PageDown\",63302:\"Insert\"},Wo=0;Wo<10;Wo++)Do[Wo+48]=Do[Wo+96]=String(Wo);for(var Ho=65;Ho<=90;Ho++)Do[Ho]=String.fromCharCode(Ho);for(var Fo=1;Fo<=12;Fo++)Do[Fo+111]=Do[Fo+63235]=\"F\"+Fo;var Po={};function Eo(e){var t,r,n,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))r=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error(\"Unrecognized modifier name: \"+s);n=!0}}return t&&(e=\"Alt-\"+e),r&&(e=\"Ctrl-\"+e),i&&(e=\"Cmd-\"+e),n&&(e=\"Shift-\"+e),e}function zo(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if(\"...\"==n){delete e[r];continue}for(var i=$(r.split(\" \"),Eo),o=0;o<i.length;o++){var l=void 0,s=void 0;o==i.length-1?(s=i.join(\" \"),l=n):(s=i.slice(0,o+1).join(\" \"),l=\"...\");var a=t[s];if(a){if(a!=l)throw new Error(\"Inconsistent bindings for \"+s)}else t[s]=l}delete e[r]}for(var u in t)e[u]=t[u];return e}function Io(e,t,r,n){var i=(t=Uo(t)).call?t.call(e,n):t[e];if(!1===i)return\"nothing\";if(\"...\"===i)return\"multi\";if(null!=i&&r(i))return\"handled\";if(t.fallthrough){if(\"[object Array]\"!=Object.prototype.toString.call(t.fallthrough))return Io(e,t.fallthrough,r,n);for(var o=0;o<t.fallthrough.length;o++){var l=Io(e,t.fallthrough[o],r,n);if(l)return l}}}function Ro(e){var t=\"string\"==typeof e?e:Do[e.keyCode];return\"Ctrl\"==t||\"Alt\"==t||\"Shift\"==t||\"Mod\"==t}function Bo(e,t,r){var n=e;return t.altKey&&\"Alt\"!=n&&(e=\"Alt-\"+e),(C?t.metaKey:t.ctrlKey)&&\"Ctrl\"!=n&&(e=\"Ctrl-\"+e),(C?t.ctrlKey:t.metaKey)&&\"Cmd\"!=n&&(e=\"Cmd-\"+e),!r&&t.shiftKey&&\"Shift\"!=n&&(e=\"Shift-\"+e),e}function Go(e,t){if(h&&34==e.keyCode&&e.char)return!1;var r=Do[e.keyCode];return null!=r&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(r=e.code),Bo(r,e,t))}function Uo(e){return\"string\"==typeof e?Po[e]:e}function Vo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for(var o=t(r[i]);n.length&&ve(o.from,q(n).to)<=0;){var l=n.pop();if(ve(l.from,o.from)<0){o.from=l.from;break}}n.push(o)}Kn(e,function(){for(var t=n.length-1;t>=0;t--)lo(e.doc,\"\",n[t].from,n[t].to,\"+delete\");Sn(e)})}function Ko(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function jo(e,t,r){var n=Ko(e,t.ch,r);return null==n?null:new ge(t.line,n,r<0?\"after\":\"before\")}function Xo(e,t,r,n,i){if(e){var o=Ze(r,t.doc.direction);if(o){var l,s=i<0?q(o):o[0],a=i<0==(1==s.level)?\"after\":\"before\";if(s.level>0||\"rtl\"==t.doc.direction){var u=Nr(t,r);l=i<0?r.text.length-1:0;var c=Or(t,u,l).top;l=le(function(e){return Or(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),\"before\"==a&&(l=Ko(r,l,1))}else l=i<0?s.to:s.from;return new ge(n,l,a)}}return new ge(n,i<0?r.text.length:0,i<0?\"before\":\"after\")}Po.basic={Left:\"goCharLeft\",Right:\"goCharRight\",Up:\"goLineUp\",Down:\"goLineDown\",End:\"goLineEnd\",Home:\"goLineStartSmart\",PageUp:\"goPageUp\",PageDown:\"goPageDown\",Delete:\"delCharAfter\",Backspace:\"delCharBefore\",\"Shift-Backspace\":\"delCharBefore\",Tab:\"defaultTab\",\"Shift-Tab\":\"indentAuto\",Enter:\"newlineAndIndent\",Insert:\"toggleOverwrite\",Esc:\"singleSelection\"},Po.pcDefault={\"Ctrl-A\":\"selectAll\",\"Ctrl-D\":\"deleteLine\",\"Ctrl-Z\":\"undo\",\"Shift-Ctrl-Z\":\"redo\",\"Ctrl-Y\":\"redo\",\"Ctrl-Home\":\"goDocStart\",\"Ctrl-End\":\"goDocEnd\",\"Ctrl-Up\":\"goLineUp\",\"Ctrl-Down\":\"goLineDown\",\"Ctrl-Left\":\"goGroupLeft\",\"Ctrl-Right\":\"goGroupRight\",\"Alt-Left\":\"goLineStart\",\"Alt-Right\":\"goLineEnd\",\"Ctrl-Backspace\":\"delGroupBefore\",\"Ctrl-Delete\":\"delGroupAfter\",\"Ctrl-S\":\"save\",\"Ctrl-F\":\"find\",\"Ctrl-G\":\"findNext\",\"Shift-Ctrl-G\":\"findPrev\",\"Shift-Ctrl-F\":\"replace\",\"Shift-Ctrl-R\":\"replaceAll\",\"Ctrl-[\":\"indentLess\",\"Ctrl-]\":\"indentMore\",\"Ctrl-U\":\"undoSelection\",\"Shift-Ctrl-U\":\"redoSelection\",\"Alt-U\":\"redoSelection\",fallthrough:\"basic\"},Po.emacsy={\"Ctrl-F\":\"goCharRight\",\"Ctrl-B\":\"goCharLeft\",\"Ctrl-P\":\"goLineUp\",\"Ctrl-N\":\"goLineDown\",\"Alt-F\":\"goWordRight\",\"Alt-B\":\"goWordLeft\",\"Ctrl-A\":\"goLineStart\",\"Ctrl-E\":\"goLineEnd\",\"Ctrl-V\":\"goPageDown\",\"Shift-Ctrl-V\":\"goPageUp\",\"Ctrl-D\":\"delCharAfter\",\"Ctrl-H\":\"delCharBefore\",\"Alt-D\":\"delWordAfter\",\"Alt-Backspace\":\"delWordBefore\",\"Ctrl-K\":\"killLine\",\"Ctrl-T\":\"transposeChars\",\"Ctrl-O\":\"openLine\"},Po.macDefault={\"Cmd-A\":\"selectAll\",\"Cmd-D\":\"deleteLine\",\"Cmd-Z\":\"undo\",\"Shift-Cmd-Z\":\"redo\",\"Cmd-Y\":\"redo\",\"Cmd-Home\":\"goDocStart\",\"Cmd-Up\":\"goDocStart\",\"Cmd-End\":\"goDocEnd\",\"Cmd-Down\":\"goDocEnd\",\"Alt-Left\":\"goGroupLeft\",\"Alt-Right\":\"goGroupRight\",\"Cmd-Left\":\"goLineLeft\",\"Cmd-Right\":\"goLineRight\",\"Alt-Backspace\":\"delGroupBefore\",\"Ctrl-Alt-Backspace\":\"delGroupAfter\",\"Alt-Delete\":\"delGroupAfter\",\"Cmd-S\":\"save\",\"Cmd-F\":\"find\",\"Cmd-G\":\"findNext\",\"Shift-Cmd-G\":\"findPrev\",\"Cmd-Alt-F\":\"replace\",\"Shift-Cmd-Alt-F\":\"replaceAll\",\"Cmd-[\":\"indentLess\",\"Cmd-]\":\"indentMore\",\"Cmd-Backspace\":\"delWrappedLineLeft\",\"Cmd-Delete\":\"delWrappedLineRight\",\"Cmd-U\":\"undoSelection\",\"Shift-Cmd-U\":\"redoSelection\",\"Ctrl-Up\":\"goDocStart\",\"Ctrl-Down\":\"goDocEnd\",fallthrough:[\"basic\",\"emacsy\"]},Po.default=y?Po.macDefault:Po.pcDefault;var Yo={selectAll:Ji,singleSelection:function(e){return e.setSelection(e.getCursor(\"anchor\"),e.getCursor(\"head\"),V)},killLine:function(e){return Vo(e,function(t){if(t.empty()){var r=se(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line<e.lastLine()?{from:t.head,to:ge(t.head.line+1,0)}:{from:t.head,to:ge(t.head.line,r)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return Vo(e,function(t){return{from:ge(t.from().line,0),to:Ce(e.doc,ge(t.to().line+1,0))}})},delLineLeft:function(e){return Vo(e,function(e){return{from:ge(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5;return{from:e.coordsChar({left:0,top:r},\"div\"),to:t.from()}})},delWrappedLineRight:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5,n=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\");return{from:t.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(ge(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(ge(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return _o(e,t.head.line)},{origin:\"+move\",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return qo(e,t.head)},{origin:\"+move\",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return function(e,t){var r=se(e.doc,t),n=function(e){for(var t;t=Ie(e);)e=t.find(1,!0).line;return e}(r);n!=r&&(t=he(n));return Xo(!0,e,r,t,-1)}(e,t.head.line)},{origin:\"+move\",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\")},j)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:0,top:r},\"div\")},j)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5,n=e.coordsChar({left:0,top:r},\"div\");return n.ch<e.getLine(n.line).search(/\\S/)?qo(e,t.head):n},j)},goLineUp:function(e){return e.moveV(-1,\"line\")},goLineDown:function(e){return e.moveV(1,\"line\")},goPageUp:function(e){return e.moveV(-1,\"page\")},goPageDown:function(e){return e.moveV(1,\"page\")},goCharLeft:function(e){return e.moveH(-1,\"char\")},goCharRight:function(e){return e.moveH(1,\"char\")},goColumnLeft:function(e){return e.moveH(-1,\"column\")},goColumnRight:function(e){return e.moveH(1,\"column\")},goWordLeft:function(e){return e.moveH(-1,\"word\")},goGroupRight:function(e){return e.moveH(1,\"group\")},goGroupLeft:function(e){return e.moveH(-1,\"group\")},goWordRight:function(e){return e.moveH(1,\"word\")},delCharBefore:function(e){return e.deleteH(-1,\"char\")},delCharAfter:function(e){return e.deleteH(1,\"char\")},delWordBefore:function(e){return e.deleteH(-1,\"word\")},delWordAfter:function(e){return e.deleteH(1,\"word\")},delGroupBefore:function(e){return e.deleteH(-1,\"group\")},delGroupAfter:function(e){return e.deleteH(1,\"group\")},indentAuto:function(e){return e.indentSelection(\"smart\")},indentMore:function(e){return e.indentSelection(\"add\")},indentLess:function(e){return e.indentSelection(\"subtract\")},insertTab:function(e){return e.replaceSelection(\"\\t\")},insertSoftTab:function(e){for(var t=[],r=e.listSelections(),n=e.options.tabSize,i=0;i<r.length;i++){var o=r[i].from(),l=I(e.getLine(o.line),o.ch,n);t.push(_(n-l%n))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection(\"add\"):e.execCommand(\"insertTab\")},transposeChars:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=[],n=0;n<t.length;n++)if(t[n].empty()){var i=t[n].head,o=se(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new ge(i.line,i.ch-1)),i.ch>0)i=new ge(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),ge(i.line,i.ch-2),i,\"+transpose\");else if(i.line>e.doc.first){var l=se(e.doc,i.line-1).text;l&&(i=new ge(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ge(i.line-1,l.length-1),i,\"+transpose\"))}r.push(new gi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,\"+input\");t=e.listSelections();for(var n=0;n<t.length;n++)e.indentLine(t[n].from().line,null,!0);Sn(e)})},openLine:function(e){return e.replaceSelection(\"\\n\",\"start\")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function _o(e,t){var r=se(e.doc,t),n=Be(r);return n!=r&&(t=he(n)),Xo(!0,e,n,t,1)}function qo(e,t){var r=_o(e,t.line),n=se(e.doc,r.line),i=Ze(n,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return ge(r.line,l?0:o,r.sticky)}return r}function $o(e,t,r){if(\"string\"==typeof t&&!(t=Yo[t]))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}var Zo=new R;function Qo(e,t,r,n){var i=e.state.keySeq;if(i){if(Ro(t))return\"handled\";if(/\\'$/.test(t)?e.state.keySeq=null:Zo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),Jo(e,i+\" \"+t,r,n))return!0}return Jo(e,t,r,n)}function Jo(e,t,r,n){var i=function(e,t,r){for(var n=0;n<e.state.keyMaps.length;n++){var i=Io(t,e.state.keyMaps[n],r,e);if(i)return i}return e.options.extraKeys&&Io(t,e.options.extraKeys,r,e)||Io(t,e.options.keyMap,r,e)}(e,t,n);return\"multi\"==i&&(e.state.keySeq=t),\"handled\"==i&&or(e,\"keyHandled\",e,t,r),\"handled\"!=i&&\"multi\"!=i||(st(r),hn(e)),!!i}function el(e,t){var r=Go(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?Qo(e,\"Shift-\"+r,t,function(t){return $o(e,t,!0)})||Qo(e,r,t,function(t){if(\"string\"==typeof t?/^go[A-Z]/.test(t):t.motion)return $o(e,t)}):Qo(e,r,t,function(t){return $o(e,t)}))}var tl=null;function rl(e){var t=this;if(t.curOp.focus=W(),!nt(t,e)){l&&s<11&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=el(t,e);h&&(tl=n?r:null,!n&&88==r&&!xt&&(y?e.metaKey:e.ctrlKey)&&t.replaceSelection(\"\",null,\"cut\")),18!=r||/\\bCodeMirror-crosshair\\b/.test(t.display.lineDiv.className)||function(e){var t=e.display.lineDiv;function r(e){18!=e.keyCode&&e.altKey||(T(t,\"CodeMirror-crosshair\"),tt(document,\"keyup\",r),tt(document,\"mouseover\",r))}H(t,\"CodeMirror-crosshair\"),Je(document,\"keyup\",r),Je(document,\"mouseover\",r)}(t)}}function nl(e){16==e.keyCode&&(this.doc.sel.shift=!1),nt(this,e)}function il(e){var t=this;if(!(yr(t.display,e)||nt(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(h&&r==tl)return tl=null,void st(e);if(!h||e.which&&!(e.which<10)||!el(t,e)){var i,o=String.fromCharCode(null==n?r:n);if(\"\\b\"!=o)if(!Qo(i=t,\"'\"+o+\"'\",e,function(e){return $o(i,e,!0)}))t.display.input.onKeyPress(e)}}}var ol,ll,sl=function(e,t,r){this.time=e,this.pos=t,this.button=r};function al(e){var t=this,r=t.display;if(!(nt(t,e)||r.activeTouch&&r.input.supportsTouch()))if(r.input.ensurePolled(),r.shift=e.shiftKey,yr(r,e))a||(r.scroller.draggable=!1,setTimeout(function(){return r.scroller.draggable=!0},100));else if(!hl(t,e)){var n,i,o,u=nn(t,e),c=ft(e),h=u?(n=u,i=c,o=+new Date,ll&&ll.compare(o,n,i)?(ol=ll=null,\"triple\"):ol&&ol.compare(o,n,i)?(ll=new sl(o,n,i),ol=null,\"double\"):(ol=new sl(o,n,i),ll=null,\"single\")):\"single\";window.focus(),1==c&&t.state.selectingText&&t.state.selectingText(e),u&&function(e,t,r,n,i){var o=\"Click\";\"double\"==n?o=\"Double\"+o:\"triple\"==n&&(o=\"Triple\"+o);return Qo(e,Bo(o=(1==t?\"Left\":2==t?\"Middle\":\"Right\")+o,i),i,function(t){if(\"string\"==typeof t&&(t=Yo[t]),!t)return!1;var n=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n=t(e,r)!=U}finally{e.state.suppressEdits=!1}return n})}(t,c,u,h,e)||(1==c?u?function(e,t,r,n){l?setTimeout(E(fn,e),0):e.curOp.focus=W();var i,o=function(e,t,r){var n=e.getOption(\"configureMouse\"),i=n?n(e,t,r):{};if(null==i.unit){var o=b?r.shiftKey&&r.metaKey:r.altKey;i.unit=o?\"rectangle\":\"single\"==t?\"char\":\"double\"==t?\"word\":\"line\"}(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||r.shiftKey);null==i.addNew&&(i.addNew=y?r.metaKey:r.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?r.altKey:r.ctrlKey));return i}(e,r,n),u=e.doc.sel;e.options.dragDrop&>&&!e.isReadOnly()&&\"single\"==r&&(i=u.contains(t))>-1&&(ve((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(ve(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=jn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,tt(i.wrapper.ownerDocument,\"mouseup\",u),tt(i.wrapper.ownerDocument,\"mousemove\",c),tt(i.scroller,\"dragstart\",h),tt(i.scroller,\"drop\",u),o||(st(t),n.addNew||Bi(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();Je(i.wrapper.ownerDocument,\"mouseup\",u),Je(i.wrapper.ownerDocument,\"mousemove\",c),Je(i.scroller,\"dragstart\",h),Je(i.scroller,\"drop\",u),dn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;st(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new gi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if(\"rectangle\"==n.unit)n.addNew||(l=new gi(r,r)),r=nn(e,t,!0,!0),s=-1;else{var c=ul(e,r,n.unit);l=n.extend?Ri(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,ji(o,vi(u.concat([l]),s),{scroll:!1,origin:\"*mouse\"})):u.length>1&&u[s].empty()&&\"char\"==n.unit&&!n.extend?(ji(o,vi(u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:\"*mouse\"}),a=o.sel):Ui(o,s,l,K):(s=0,ji(o,new pi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=ve(h,t))if(h=t,\"rectangle\"==n.unit){for(var i=[],u=e.options.tabSize,c=I(se(o,r.line).text,r.ch,u),f=I(se(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=se(o,g).text,y=X(m,d,u);d==p?i.push(new gi(ge(g,y),ge(g,y))):m.length>y&&i.push(new gi(ge(g,y),ge(g,X(m,p,u))))}i.length||i.push(new gi(r,r)),ji(o,vi(a.ranges.slice(0,s).concat(i),s),{origin:\"*mouse\",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=ul(e,t,n.unit),C=w.anchor;ve(x.anchor,C)>0?(b=x.head,C=we(w.from(),x.anchor)):(b=x.anchor,C=be(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=se(e.doc,r.line);if(0==ve(r,n)&&r.sticky==n.sticky)return t;var o=Ze(i);if(!o)return t;var l=qe(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*(\"ltr\"==e.doc.direction?1:-1)>0;else{var c=qe(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?\"after\":\"before\";return r.ch==p&&r.sticky==g?t:new gi(new ge(r.line,p,g),n)}(e,new gi(Ce(o,C),b)),ji(o,vi(S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,st(t),i.input.focus(),tt(i.wrapper.ownerDocument,\"mousemove\",v),tt(i.wrapper.ownerDocument,\"mouseup\",m),o.history.lastSelOrigin=null}var v=jn(e,function(t){ft(t)?function t(r){var l=++p;var s=nn(e,r,!0,\"rectangle\"==n.unit);if(!s)return;if(0!=ve(s,h)){e.curOp.focus=W(),f(s);var a=yn(i,o);(s.line>=a.to||s.line<a.from)&&setTimeout(jn(e,function(){p==l&&t(r)}),150)}else{var u=r.clientY<d.top?-20:r.clientY>d.bottom?20:0;u&&setTimeout(jn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=jn(e,g);e.state.selectingText=m,Je(i.wrapper.ownerDocument,\"mousemove\",v),Je(i.wrapper.ownerDocument,\"mouseup\",m)}(e,n,t,o)}(t,u,h,e):ht(e)==r.scroller&&st(e):2==c?(u&&Bi(t.doc,u),setTimeout(function(){return r.input.focus()},20)):3==c&&(S?fl(t,e):dn(t)))}}function ul(e,t,r){if(\"char\"==r)return new gi(t,t);if(\"word\"==r)return e.findWordAt(t);if(\"line\"==r)return new gi(ge(t.line,0),Ce(e.doc,ge(t.line+1,0)));var n=r(e,t);return new gi(n.from,n.to)}function cl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&st(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ot(e,r))return ut(t);o-=s.top-l.viewOffset;for(var a=0;a<e.options.gutters.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return rt(e,r,e,fe(e.doc,o),e.options.gutters[a],t),ut(t)}}function hl(e,t){return cl(e,t,\"gutterClick\",!0)}function fl(e,t){yr(e.display,t)||function(e,t){if(!ot(e,\"gutterContextMenu\"))return!1;return cl(e,t,\"gutterContextMenu\",!1)}(e,t)||nt(e,t,\"contextmenu\")||e.display.input.onContextMenu(t)}function dl(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\\s*cm-s-\\S+/g,\"\")+e.options.theme.replace(/(^|\\s)\\s*/g,\" cm-s-\"),Er(e)}sl.prototype.compare=function(e,t,r){return this.time+400>e&&0==ve(t,this.pos)&&r==this.button};var pl={toString:function(){return\"CodeMirror.Init\"}},gl={},vl={};function ml(e){si(e),_n(e),bn(e)}function yl(e,t,r){if(!t!=!(r&&r!=pl)){var n=e.display.dragFunctions,i=t?Je:tt;i(e.display.scroller,\"dragstart\",n.start),i(e.display.scroller,\"dragenter\",n.enter),i(e.display.scroller,\"dragover\",n.over),i(e.display.scroller,\"dragleave\",n.leave),i(e.display.scroller,\"drop\",n.drop)}}function bl(e){e.options.lineWrapping?(H(e.display.wrapper,\"CodeMirror-wrap\"),e.display.sizer.style.minWidth=\"\",e.display.sizerWidth=null):(T(e.display.wrapper,\"CodeMirror-wrap\"),Ye(e)),rn(e),_n(e),Er(e),setTimeout(function(){return Hn(e)},100)}function wl(e,t){var n=this;if(!(this instanceof wl))return new wl(e,t);this.options=t=t?z(t):{},z(gl,t,!1),ai(t);var i=t.value;\"string\"==typeof i&&(i=new So(i,t.mode,null,t.lineSeparator,t.direction)),this.doc=i;var o=new wl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n){var i=this;this.input=n,i.scrollbarFiller=O(\"div\",null,\"CodeMirror-scrollbar-filler\"),i.scrollbarFiller.setAttribute(\"cm-not-content\",\"true\"),i.gutterFiller=O(\"div\",null,\"CodeMirror-gutter-filler\"),i.gutterFiller.setAttribute(\"cm-not-content\",\"true\"),i.lineDiv=A(\"div\",null,\"CodeMirror-code\"),i.selectionDiv=O(\"div\",null,null,\"position: relative; z-index: 1\"),i.cursorDiv=O(\"div\",null,\"CodeMirror-cursors\"),i.measure=O(\"div\",null,\"CodeMirror-measure\"),i.lineMeasure=O(\"div\",null,\"CodeMirror-measure\"),i.lineSpace=A(\"div\",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,\"position: relative; outline: none\");var o=A(\"div\",[i.lineSpace],\"CodeMirror-lines\");i.mover=O(\"div\",[o],null,\"position: relative\"),i.sizer=O(\"div\",[i.mover],\"CodeMirror-sizer\"),i.sizerWidth=null,i.heightForcer=O(\"div\",null,null,\"position: absolute; height: \"+G+\"px; width: 1px;\"),i.gutters=O(\"div\",null,\"CodeMirror-gutters\"),i.lineGutter=null,i.scroller=O(\"div\",[i.sizer,i.heightForcer,i.gutters],\"CodeMirror-scroll\"),i.scroller.setAttribute(\"tabIndex\",\"-1\"),i.wrapper=O(\"div\",[i.scrollbarFiller,i.gutterFiller,i.scroller],\"CodeMirror\"),l&&s<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),a||r&&m||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,n.init(i)}(e,i,o);for(var c in u.wrapper.CodeMirror=this,si(this),dl(this),t.lineWrapping&&(this.display.wrapper.className+=\" CodeMirror-wrap\"),En(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;Je(t.scroller,\"mousedown\",jn(e,al)),Je(t.scroller,\"dblclick\",l&&s<11?jn(e,function(t){if(!nt(e,t)){var r=nn(e,t);if(r&&!hl(e,t)&&!yr(e.display,t)){st(t);var n=e.findWordAt(r);Bi(e.doc,n.anchor,n.head)}}}):function(t){return nt(e,t)||st(t)});S||Je(t.scroller,\"contextmenu\",function(t){return fl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}Je(t.scroller,\"touchstart\",function(i){if(!nt(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!hl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),Je(t.scroller,\"touchmove\",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Je(t.scroller,\"touchend\",function(r){var n=t.activeTouch;if(n&&!yr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,\"page\");l=!n.prev||o(n,n.prev)?new gi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new gi(ge(s.line,0),Ce(e.doc,ge(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),st(r)}i()}),Je(t.scroller,\"touchcancel\",i),Je(t.scroller,\"scroll\",function(){t.scroller.clientHeight&&(Mn(e,t.scroller.scrollTop),On(e,t.scroller.scrollLeft,!0),rt(e,\"scroll\",e))}),Je(t.scroller,\"mousewheel\",function(t){return di(e,t)}),Je(t.scroller,\"DOMMouseScroll\",function(t){return di(e,t)}),Je(t.wrapper,\"scroll\",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){nt(e,t)||ct(t)},over:function(t){nt(e,t)||(!function(e,t){var r=nn(e,t);if(r){var n=document.createDocumentFragment();an(e,r,n),e.display.dragCursor||(e.display.dragCursor=O(\"div\",null,\"CodeMirror-cursors CodeMirror-dragcursors\"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),ct(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-Lo<100))ct(t);else if(!nt(e,t)&&!yr(e.display,t)&&(t.dataTransfer.setData(\"Text\",e.getSelection()),t.dataTransfer.effectAllowed=\"copyMove\",t.dataTransfer.setDragImage&&!f)){var r=O(\"img\",null,null,\"position: fixed; left: 0; top: 0;\");r.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:jn(e,ko),leave:function(t){nt(e,t)||To(e)}};var a=t.input.getField();Je(a,\"keyup\",function(t){return nl.call(e,t)}),Je(a,\"keydown\",jn(e,rl)),Je(a,\"keypress\",jn(e,il)),Je(a,\"focus\",function(t){return pn(e,t)}),Je(a,\"blur\",function(t){return gn(e,t)})}(this),Oo(),In(this),this.curOp.forceUpdate=!0,Mi(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(pn,this),20):gn(this),vl)vl.hasOwnProperty(c)&&vl[c](n,t[c],pl);wn(this),t.finishInit&&t.finishInit(this);for(var d=0;d<xl.length;++d)xl[d](n);Rn(this),a&&t.lineWrapping&&\"optimizelegibility\"==getComputedStyle(u.lineDiv).textRendering&&(u.lineDiv.style.textRendering=\"auto\")}wl.defaults=gl,wl.optionHandlers=vl;var xl=[];function Cl(e,t,r,n){var i,o=e.doc;null==r&&(r=\"add\"),\"smart\"==r&&(o.mode.indent?i=zt(e,t).state:r=\"prev\");var l=e.options.tabSize,s=se(o,t),a=I(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\\s*/)[0];if(n||/\\S/.test(s.text)){if(\"smart\"==r&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||u>150)){if(!n)return;r=\"prev\"}}else u=0,r=\"not\";\"prev\"==r?u=t>o.first?I(se(o,t-1).text,null,l):0:\"add\"==r?u=a+e.options.indentUnit:\"subtract\"==r?u=a-e.options.indentUnit:\"number\"==typeof r&&(u=a+r),u=Math.max(0,u);var h=\"\",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+=\"\\t\";if(f<u&&(h+=_(u-f)),h!=c)return lo(o,h,ge(t,0),ge(t,c.length),\"+input\"),s.stateAfter=null,!0;for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var v=ge(t,c.length);Ui(o,p,new gi(v,v));break}}}wl.defineInitHook=function(e){return xl.push(e)};var Sl=null;function Ll(e){Sl=e}function kl(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l,s=e.state.pasteIncoming||\"paste\"==i,a=bt(t),u=null;if(s&&n.ranges.length>1)if(Sl&&Sl.text.join(\"\\n\")==t){if(n.ranges.length%Sl.text.length==0){u=[];for(var c=0;c<Sl.text.length;c++)u.push(o.splitLines(Sl.text[c]))}}else a.length==n.ranges.length&&e.options.pasteLinesPerSelection&&(u=$(a,function(e){return[e]}));for(var h=n.ranges.length-1;h>=0;h--){var f=n.ranges[h],d=f.from(),p=f.to();f.empty()&&(r&&r>0?d=ge(d.line,d.ch-r):e.state.overwrite&&!s?p=ge(p.line,Math.min(se(o,p.line).text.length,p.ch+q(a).length)):Sl&&Sl.lineWise&&Sl.text.join(\"\\n\")==t&&(d=p=ge(d.line,0))),l=e.curOp.updateInput;var g={from:d,to:p,text:u?u[h%u.length]:a,origin:i||(s?\"paste\":e.state.cutIncoming?\"cut\":\"+input\")};to(e.doc,g),or(e,\"inputRead\",e,g)}t&&!s&&Ml(e,t),Sn(e),e.curOp.updateInput=l,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Tl(e,t){var r=e.clipboardData&&e.clipboardData.getData(\"Text\");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||Kn(t,function(){return kl(t,r,0,null,\"paste\")}),!0}function Ml(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(t.indexOf(o.electricChars.charAt(s))>-1){l=Cl(e,i.head.line,\"smart\");break}}else o.electricInput&&o.electricInput.test(se(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Cl(e,i.head.line,\"smart\"));l&&or(e,\"electricInput\",e,i.head.line)}}}function Nl(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var i=e.doc.sel.ranges[n].head.line,o={anchor:ge(i,0),head:ge(i+1,0)};r.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:r}}function Ol(e,t){e.setAttribute(\"autocorrect\",\"off\"),e.setAttribute(\"autocapitalize\",\"off\"),e.setAttribute(\"spellcheck\",!!t)}function Al(){var e=O(\"textarea\",null,null,\"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\"),t=O(\"div\",[e],null,\"overflow: hidden; position: relative; width: 3px; height: 0px;\");return a?e.style.width=\"1000px\":e.setAttribute(\"wrap\",\"off\"),g&&(e.style.border=\"1px solid black\"),Ol(e),t}function Dl(e,t,r,n,i){var o=t,l=r,s=se(e,t.line);function a(n){var o,l;if(null==(o=i?function(e,t,r,n){var i=Ze(t,e.doc.direction);if(!i)return jo(t,r,n);r.ch>=t.text.length?(r.ch=t.text.length,r.sticky=\"before\"):r.ch<=0&&(r.ch=0,r.sticky=\"after\");var o=qe(i,r.ch,r.sticky),l=i[o];if(\"ltr\"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from<r.ch))return jo(t,r,n);var s,a=function(e,r){return Ko(t,e instanceof ge?e.ch:e,r)},u=function(r){return e.options.lineWrapping?(s=s||Nr(e,t),_r(e,t,s,r)):{begin:0,end:t.text.length}},c=u(\"before\"==r.sticky?a(r,-1):r.ch);if(\"rtl\"==e.doc.direction||1==l.level){var h=1==l.level==n<0,f=a(r,h?1:-1);if(null!=f&&(h?f<=l.to&&f<=c.end:f>=l.from&&f>=c.begin)){var d=h?\"before\":\"after\";return new ge(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new ge(r.line,a(e,1),\"before\"):new ge(r.line,e,\"after\")};e>=0&&e<i.length;e+=t){var l=i[e],s=t>0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u<l.to)return o(u,s);if(u=s?l.from:a(l.to,-1),n.begin<=u&&u<n.end)return o(u,s)}},g=p(o+n,n,c);if(g)return g;var v=n>0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):jo(s,t,r))){if(n||(l=t.line+r)<e.first||l>=e.first+e.size||(t=new ge(l,t.ch,t.sticky),!(s=se(e,l))))return!1;t=Xo(i,e.cm,s,t.line,r)}else t=o;return!0}if(\"char\"==n)a();else if(\"column\"==n)a(!0);else if(\"word\"==n||\"group\"==n)for(var u=null,c=\"group\"==n,h=e.cm&&e.cm.getHelper(t,\"wordChars\"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||\"\\n\",p=te(d,h)?\"w\":c&&\"\\n\"==d?\"n\":!c||/\\s/.test(d)?null:\"p\";if(!c||f||p||(p=\"s\"),u&&u!=p){r<0&&(r=1,a(),t.sticky=\"after\");break}if(p&&(u=p),r>0&&!a(!f))break}var g=Zi(e,t,o,l,!0);return me(o,g)&&(g.hitSide=!0),g}function Wl(e,t,r,n){var i,o,l=e.doc,s=t.left;if(\"page\"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*Zr(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else\"line\"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=Xr(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var Hl=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Fl(e,t){var r=Mr(e,t.line);if(!r||r.hidden)return null;var n=se(e.doc,t.line),i=kr(r,n,t.line),o=Ze(n,e.doc.direction),l=\"left\";o&&(l=qe(o,t.ch)%2?\"right\":\"left\");var s=Wr(i.map,t.ch,l);return s.offset=\"right\"==s.collapse?s.end:s.start,s}function Pl(e,t){return t&&(e.bad=!0),e}function El(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return Pl(e.clipPos(ge(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==n)return zl(o,t,r)}}function zl(e,t,r){var n=e.text.firstChild,i=!1;if(!t||!D(n,t))return Pl(ge(he(e.line),0),!0);if(t==n&&(i=!0,t=n.childNodes[r],r=0,!t)){var o=e.rest?q(e.rest):e.line;return Pl(ge(he(o),o.text.length),i)}var l=3==t.nodeType?t:null,s=t;for(l||1!=t.childNodes.length||3!=t.firstChild.nodeType||(l=t.firstChild,r&&(r=l.nodeValue.length));s.parentNode!=n;)s=s.parentNode;var a=e.measure,u=a.maps;function c(t,r,n){for(var i=-1;i<(u?u.length:0);i++)for(var o=i<0?a.map:u[i],l=0;l<o.length;l+=3){var s=o[l+2];if(s==t||s==r){var c=he(i<0?e.line:e.rest[i]),h=o[l]+n;return(n<0||s!=t)&&(h=o[l+(n?1:0)]),ge(c,h)}}}var h=c(l,s,r);if(h)return Pl(h,i);for(var f=s.nextSibling,d=l?l.nodeValue.length-r:0;f;f=f.nextSibling){if(h=c(f,f.firstChild,0))return Pl(ge(h.line,h.ch-d),i);d+=f.textContent.length}for(var p=s.previousSibling,g=r;p;p=p.previousSibling){if(h=c(p,p.firstChild,-1))return Pl(ge(h.line,h.ch+g),i);g+=p.textContent.length}}Hl.prototype.init=function(e){var t=this,r=this,n=r.cm,i=r.div=e.lineDiv;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()}),\"cut\"==e.type&&n.replaceSelection(\"\",null,\"cut\");else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),\"cut\"==e.type&&n.operation(function(){n.setSelections(t.ranges,0,V),n.replaceSelection(\"\",null,\"cut\")})}if(e.clipboardData){e.clipboardData.clearData();var o=Sl.text.join(\"\\n\");if(e.clipboardData.setData(\"Text\",o),e.clipboardData.getData(\"Text\")==o)return void e.preventDefault()}var l=Al(),s=l.firstChild;n.display.lineSpace.insertBefore(l,n.display.lineSpace.firstChild),s.value=Sl.text.join(\"\\n\");var a=document.activeElement;P(s),setTimeout(function(){n.display.lineSpace.removeChild(l),a.focus(),a==i&&r.showPrimarySelection()},50)}}Ol(i,n.options.spellcheck),Je(i,\"paste\",function(e){nt(n,e)||Tl(e,n)||s<=11&&setTimeout(jn(n,function(){return t.updateFromDOM()}),20)}),Je(i,\"compositionstart\",function(e){t.composing={data:e.data,done:!1}}),Je(i,\"compositionupdate\",function(e){t.composing||(t.composing={data:e.data,done:!1})}),Je(i,\"compositionend\",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Je(i,\"touchstart\",function(){return r.forceCompositionEnd()}),Je(i,\"input\",function(){t.composing||t.readFromDOMSoon()}),Je(i,\"copy\",o),Je(i,\"cut\",o)},Hl.prototype.prepareSelection=function(){var e=sn(this.cm,!1);return e.focus=this.cm.state.focused,e},Hl.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Hl.prototype.showPrimarySelection=function(){var e=window.getSelection(),t=this.cm,n=t.doc.sel.primary(),i=n.from(),o=n.to();if(t.display.viewTo==t.display.viewFrom||i.line>=t.display.viewTo||o.line<t.display.viewFrom)e.removeAllRanges();else{var l=El(t,e.anchorNode,e.anchorOffset),s=El(t,e.focusNode,e.focusOffset);if(!l||l.bad||!s||s.bad||0!=ve(we(l,s),i)||0!=ve(be(l,s),o)){var a=t.display.view,u=i.line>=t.display.viewFrom&&Fl(t,i)||{node:a[0].measure.map[2],offset:0},c=o.line<t.display.viewTo&&Fl(t,o);if(!c){var h=a[a.length-1].measure,f=h.maps?h.maps[h.maps.length-1]:h.map;c={node:f[f.length-1],offset:f[f.length-2]-f[f.length-3]}}if(u&&c){var d,p=e.rangeCount&&e.getRangeAt(0);try{d=k(u.node,u.offset,c.offset,c.node)}catch(e){}d&&(!r&&t.state.focused?(e.collapse(u.node,u.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),p&&null==e.anchorNode?e.addRange(p):r&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Hl.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Hl.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Hl.prototype.rememberSelection=function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Hl.prototype.selectionInEditor=function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Hl.prototype.focus=function(){\"nocursor\"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Hl.prototype.blur=function(){this.div.blur()},Hl.prototype.getField=function(){return this.div},Hl.prototype.supportsTouch=function(){return!0},Hl.prototype.receivedFocus=function(){var e=this;this.selectionInEditor()?this.pollSelection():Kn(this.cm,function(){return e.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function t(){e.cm.state.focused&&(e.pollSelection(),e.polling.set(e.cm.options.pollInterval,t))})},Hl.prototype.selectionChanged=function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Hl.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;if(v&&c&&this.cm.options.gutters.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(e.anchorNode))return this.cm.triggerOnKeyDown({type:\"keydown\",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var r=El(t,e.anchorNode,e.anchorOffset),n=El(t,e.focusNode,e.focusOffset);r&&n&&Kn(t,function(){ji(t.doc,mi(r,n),V),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}}},Hl.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,r,n=this.cm,i=n.display,o=n.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>n.firstLine()&&(l=ge(l.line-1,se(n.doc,l.line-1).length)),s.ch==se(n.doc,s.line).text.length&&s.line<n.lastLine()&&(s=ge(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;l.line==i.viewFrom||0==(e=on(n,l.line))?(t=he(i.view[0].line),r=i.view[0].node):(t=he(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=on(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=he(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o=\"\",l=!1,s=e.doc.lineSeparator();function a(){l&&(o+=s,l=!1)}function u(e){e&&(a(),o+=e)}function c(t){if(1==t.nodeType){var r=t.getAttribute(\"cm-text\");if(null!=r)return void u(r||t.textContent.replace(/\\u200b/g,\"\"));var o,h=t.getAttribute(\"cm-marker\");if(h){var f=e.findMarks(ge(n,0),ge(i+1,0),(g=+h,function(e){return e.id==g}));return void(f.length&&(o=f[0].find(0))&&u(ae(e.doc,o.from,o.to).join(s)))}if(\"false\"==t.getAttribute(\"contenteditable\"))return;var d=/^(pre|div|p)$/i.test(t.nodeName);d&&a();for(var p=0;p<t.childNodes.length;p++)c(t.childNodes[p]);d&&(l=!0)}else 3==t.nodeType&&u(t.nodeValue);var g}for(;c(t),t!=r;)t=t.nextSibling;return o}(n,r,u,t,a)),f=ae(n.doc,ge(t,0),ge(a,se(n.doc,a).text.length));h.length>1&&f.length>1;)if(q(h)==q(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);d<m&&g.charCodeAt(d)==v.charCodeAt(d);)++d;for(var y=q(h),b=q(f),w=Math.min(y.length-(1==h.length?d:0),b.length-(1==f.length?d:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==f.length&&t==l.line)for(;d&&d>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\\u200b+/,\"\"),h[0]=h[0].slice(d).replace(/\\u200b+$/,\"\");var x=ge(t,d),C=ge(a,f.length?q(f).length-p:0);return h.length>1||h[0]||ve(x,C)?(lo(n.doc,h,x,C,\"+input\"),!0):void 0},Hl.prototype.ensurePolled=function(){this.forceCompositionEnd()},Hl.prototype.reset=function(){this.forceCompositionEnd()},Hl.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Hl.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Hl.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Kn(this.cm,function(){return _n(e.cm)})},Hl.prototype.setUneditable=function(e){e.contentEditable=\"false\"},Hl.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||jn(this.cm,kl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Hl.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(\"nocursor\"!=e)},Hl.prototype.onContextMenu=function(){},Hl.prototype.resetPosition=function(){},Hl.prototype.needsContentAttribute=!0;var Il,Rl,Bl,Gl=function(e){this.cm=e,this.prevInput=\"\",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),\"cut\"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput=\"\",i.value=t.text.join(\"\\n\"),P(i))}\"cut\"==e.type&&(n.state.cutIncoming=!0)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width=\"0px\"),Je(i,\"input\",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),Je(i,\"paste\",function(e){nt(n,e)||Tl(e,n)||(n.state.pasteIncoming=!0,r.fastPoll())}),Je(i,\"cut\",o),Je(i,\"copy\",o),Je(e.scroller,\"paste\",function(t){yr(e,t)||nt(n,t)||(n.state.pasteIncoming=!0,r.focus())}),Je(e.lineSpace,\"selectstart\",function(t){yr(e,t)||st(t)}),Je(i,\"compositionstart\",function(){var e=n.getCursor(\"from\");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor(\"to\"),{className:\"CodeMirror-composing\"})}}),Je(i,\"compositionend\",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Al(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=sn(e);if(e.options.moveInputWithCursor){var i=Vr(e,r.sel.primary().head,\"div\"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+\"px\",this.wrapper.style.left=e.teLeft+\"px\")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput=\"\";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value=\"\",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if(\"nocursor\"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||wt(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\\uf700-\\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n=\"\"),8666==o)return this.reset(),this.cm.execCommand(\"undo\")}for(var a=0,u=Math.min(n.length,i.length);a<u&&n.charCodeAt(a)==i.charCodeAt(a);)++a;return Kn(t,function(){kl(t,i.slice(a),n.length-a,null,e.composing?\"*compose\":null),i.length>1e3||i.indexOf(\"\\n\")>-1?r.value=e.prevInput=\"\":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor(\"to\"),{className:\"CodeMirror-composing\"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea,o=nn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&jn(r,ji)(r.doc,mi(o),V);var c=i.style.cssText,f=t.wrapper.style.cssText;t.wrapper.style.cssText=\"position: absolute\";var d,p=t.wrapper.getBoundingClientRect();if(i.style.cssText=\"position: absolute; width: 30px; height: 30px;\\n top: \"+(e.clientY-p.top-5)+\"px; left: \"+(e.clientX-p.left-5)+\"px;\\n z-index: 1000; background: \"+(l?\"rgba(255, 255, 255, .05)\":\"transparent\")+\";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\",a&&(d=window.scrollY),n.input.focus(),a&&window.scrollTo(null,d),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=\" \"),t.contextMenuPending=!0,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){ct(e);var g=function(){tt(window,\"mouseup\",g),setTimeout(m,20)};Je(window,\"mouseup\",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o=\"\"+(e?i.value:\"\");i.value=\"⇚\",i.value=o,t.prevInput=e?\"\":\"\",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending=!1,t.wrapper.style.cssText=f,i.style.cssText=c,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&\"\"==t.prevInput?jn(r,Ji)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=\"nocursor\"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=pl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=pl,r(\"value\",\"\",function(e,t){return e.setValue(t)},!0),r(\"mode\",null,function(e,t){e.doc.modeOption=t,Ci(e)},!0),r(\"indentUnit\",2,Ci,!0),r(\"indentWithTabs\",!1),r(\"smartIndent\",!0),r(\"tabSize\",4,function(e){Si(e),Er(e),_n(e)},!0),r(\"lineSeparator\",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(ge(n,o))}n++});for(var i=r.length-1;i>=0;i--)lo(e.doc,t,r[i],ge(r[i].line,r[i].ch+t.length))}}),r(\"specialChars\",/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test(\"\\t\")?\"\":\"|\\t\"),\"g\"),r!=pl&&e.refresh()}),r(\"specialCharPlaceholder\",$t,function(e){return e.refresh()},!0),r(\"electricChars\",!0),r(\"inputStyle\",m?\"contenteditable\":\"textarea\",function(){throw new Error(\"inputStyle can not (yet) be changed in a running editor\")},!0),r(\"spellcheck\",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r(\"rtlMoveVisually\",!w),r(\"wholeLineUpdateBefore\",!0),r(\"theme\",\"default\",function(e){dl(e),ml(e)},!0),r(\"keyMap\",\"default\",function(e,t,r){var n=Uo(t),i=r!=pl&&Uo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r(\"extraKeys\",null),r(\"configureMouse\",null),r(\"lineWrapping\",!1,bl,!0),r(\"gutters\",[],function(e){ai(e.options),ml(e)},!0),r(\"fixedGutter\",!0,function(e,t){e.display.gutters.style.left=t?en(e.display)+\"px\":\"0\",e.refresh()},!0),r(\"coverGutterNextToScrollbar\",!1,function(e){return Hn(e)},!0),r(\"scrollbarStyle\",\"native\",function(e){En(e),Hn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r(\"lineNumbers\",!1,function(e){ai(e.options),ml(e)},!0),r(\"firstLineNumber\",1,ml,!0),r(\"lineNumberFormatter\",function(e){return e},ml,!0),r(\"showCursorWhenSelecting\",!1,ln,!0),r(\"resetSelectionOnContextMenu\",!0),r(\"lineWiseCopyCut\",!0),r(\"pasteLinesPerSelection\",!0),r(\"readOnly\",!1,function(e,t){\"nocursor\"==t&&(gn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r(\"disableInput\",!1,function(e,t){t||e.display.input.reset()},!0),r(\"dragDrop\",!0,yl),r(\"allowDropFileTypes\",null),r(\"cursorBlinkRate\",530),r(\"cursorScrollMargin\",0),r(\"cursorHeight\",1,ln,!0),r(\"singleCursorHeightPerLine\",!0,ln,!0),r(\"workTime\",100),r(\"workDelay\",100),r(\"flattenSpans\",!0,Si,!0),r(\"addModeClass\",!1,Si,!0),r(\"pollInterval\",100),r(\"undoDepth\",200,function(e,t){return e.doc.history.undoDepth=t}),r(\"historyEventDelay\",1250),r(\"viewportMargin\",10,function(e){return e.refresh()},!0),r(\"maxHighlightLength\",1e4,Si,!0),r(\"moveInputWithCursor\",!0,function(e,t){t||e.display.input.resetPosition()}),r(\"tabindex\",null,function(e,t){return e.display.input.getField().tabIndex=t||\"\"}),r(\"autofocus\",null),r(\"direction\",\"ltr\",function(e,t){return e.doc.setDirection(t)},!0)}(wl),Rl=(Il=wl).optionHandlers,Bl=Il.helpers={},Il.prototype={constructor:Il,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var r=this.options,n=r[e];r[e]==t&&\"mode\"!=e||(r[e]=t,Rl.hasOwnProperty(e)&&jn(this,Rl[e])(this,t,n),rt(this,\"optionChange\",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?\"push\":\"unshift\"](Uo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;r<t.length;++r)if(t[r]==e||t[r].name==e)return t.splice(r,1),!0},addOverlay:Xn(function(e,t){var r=e.token?e:Il.getMode(this.options,e);if(r.startState)throw new Error(\"Overlays may not be stateful.\");!function(e,t,r){for(var n=0,i=r(t);n<e.length&&r(e[n])<=i;)n++;e.splice(n,0,t)}(this.state.overlays,{mode:r,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,_n(this)}),removeOverlay:Xn(function(e){for(var t=this.state.overlays,r=0;r<t.length;++r){var n=t[r].modeSpec;if(n==e||\"string\"==typeof e&&n.name==e)return t.splice(r,1),this.state.modeGen++,void _n(this)}}),indentLine:Xn(function(e,t,r){\"string\"!=typeof t&&\"number\"!=typeof t&&(t=null==t?this.options.smartIndent?\"smart\":\"prev\":t?\"add\":\"subtract\"),de(this.doc,e)&&Cl(this,e,t,r)}),indentSelection:Xn(function(e){for(var t=this,r=this.doc.sel.ranges,n=-1,i=0;i<r.length;i++){var o=r[i];if(o.empty())o.head.line>n&&(Cl(t,o.head.line,e,!0),n=o.head.line,i==t.doc.sel.primIndex&&Sn(t));else{var l=o.from(),s=o.to(),a=Math.max(n,l.line);n=Math.min(t.lastLine(),s.line-(s.ch?0:1))+1;for(var u=a;u<n;++u)Cl(t,u,e);var c=t.doc.sel.ranges;0==l.ch&&r.length==c.length&&c[i].from().ch>0&&Ui(t.doc,i,new gi(l,c[i].to()),V)}}}),getTokenAt:function(e,t){return Ut(this,e,t)},getLineTokens:function(e,t){return Ut(this,ge(e),t,!0)},getTokenTypeAt:function(e){e=Ce(this.doc,e);var t,r=Et(this,se(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]<o)){t=r[2*l+2];break}n=l+1}}var s=t?t.indexOf(\"overlay \"):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Il.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var r=[];if(!Bl.hasOwnProperty(t))return r;var n=Bl[t],i=this.getModeAt(e);if(\"string\"==typeof i[t])n[i[t]]&&r.push(n[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=n[i[t][o]];l&&r.push(l)}else i.helperType&&n[i.helperType]?r.push(n[i.helperType]):n[i.name]&&r.push(n[i.name]);for(var s=0;s<n._global.length;s++){var a=n._global[s];a.pred(i,this)&&-1==B(r,a.val)&&r.push(a.val)}return r},getStateAfter:function(e,t){var r=this.doc;return zt(this,(e=xe(r,null==e?r.first+r.size-1:e))+1,t).state},cursorCoords:function(e,t){var r=this.doc.sel.primary();return Vr(this,null==e?r.head:\"object\"==typeof e?Ce(this.doc,e):e?r.from():r.to(),t||\"page\")},charCoords:function(e,t){return Ur(this,Ce(this.doc,e),t||\"page\")},coordsChar:function(e,t){return Xr(this,(e=Gr(this,e,t||\"page\")).left,e.top)},lineAtHeight:function(e,t){return e=Gr(this,{top:e,left:0},t||\"page\").top,fe(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,r){var n,i=!1;if(\"number\"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),n=se(this.doc,e)}else n=e;return Br(this,n,{top:0,left:0},t||\"page\",r||i).top+(i?this.doc.height-je(n):0)},defaultTextHeight:function(){return Zr(this.display)},defaultCharWidth:function(){return Qr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Vr(this,Ce(this.doc,e))).bottom,c=e.left;if(t.style.position=\"absolute\",t.setAttribute(\"cm-ignore-events\",\"true\"),this.display.input.setUneditable(t),a.sizer.appendChild(t),\"over\"==n)u=e.top;else if(\"above\"==n||\"near\"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);(\"above\"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+\"px\",t.style.left=t.style.right=\"\",\"right\"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right=\"0px\"):(\"left\"==i?c=0:\"middle\"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+\"px\"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=xn(o,l)).scrollTop&&Mn(o,s.scrollTop),null!=s.scrollLeft&&On(o,s.scrollLeft))},triggerOnKeyDown:Xn(rl),triggerOnKeyPress:Xn(il),triggerOnKeyUp:nl,triggerOnMouseDown:Xn(al),execCommand:function(e){if(Yo.hasOwnProperty(e))return Yo[e].call(null,this)},triggerElectric:Xn(function(e){Ml(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=Ce(this.doc,e),l=0;l<t&&!(o=Dl(this.doc,o,i,r,n)).hitSide;++l);return o},moveH:Xn(function(e,t){var r=this;this.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?Dl(r.doc,n.head,e,t,r.options.rtlMoveVisually):e<0?n.from():n.to()},j)}),deleteH:Xn(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection(\"\",null,\"+delete\"):Vo(this,function(r){var i=Dl(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=1,o=n;t<0&&(i=-1,t=-t);for(var l=Ce(this.doc,e),s=0;s<t;++s){var a=Vr(this,l,\"div\");if(null==o?o=a.left:a.left=o,(l=Wl(this,a,i,r)).hitSide)break}return l},moveV:Xn(function(e,t){var r=this,n=this.doc,i=[],o=!this.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var s=Vr(r,l.head,\"div\");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=Wl(r,s,e,t);return\"page\"==t&&l==n.sel.primary()&&Cn(r,Ur(r,a,\"div\").top-s.top),a},j),i.length)for(var l=0;l<n.sel.ranges.length;l++)n.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=se(this.doc,e.line).text,r=e.ch,n=e.ch;if(t){var i=this.getHelper(e,\"wordChars\");\"before\"!=e.sticky&&n!=t.length||!r?++n:--r;for(var o=t.charAt(r),l=te(o,i)?function(e){return te(e,i)}:/\\s/.test(o)?function(e){return/\\s/.test(e)}:function(e){return!/\\s/.test(e)&&!te(e)};r>0&&l(t.charAt(r-1));)--r;for(;n<t.length&&l(t.charAt(n));)++n}return new gi(ge(e.line,r),ge(e.line,n))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?H(this.display.cursorDiv,\"CodeMirror-overwrite\"):T(this.display.cursorDiv,\"CodeMirror-overwrite\"),rt(this,\"overwriteToggle\",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Xn(function(e,t){Ln(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Cr(this)-this.display.barHeight,width:e.scrollWidth-Cr(this)-this.display.barWidth,clientHeight:Lr(this),clientWidth:Sr(this)}},scrollIntoView:Xn(function(e,t){var r,n;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):\"number\"==typeof e?e={from:ge(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(n=e,kn(r=this),r.curOp.scrollToPos=n):Tn(this,e.from,e.to,e.margin)}),setSize:Xn(function(e,t){var r=this,n=function(e){return\"number\"==typeof e||/^\\d+$/.test(String(e))?e+\"px\":e};null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Pr(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){qn(r,i,\"widget\");break}++i}),this.curOp.forceUpdate=!0,rt(this,\"refresh\",this)}),operation:function(e){return Kn(this,e)},startOperation:function(){return In(this)},endOperation:function(){return Rn(this)},refresh:Xn(function(){var e=this.display.cachedTextHeight;_n(this),this.curOp.forceUpdate=!0,Er(this),Ln(this,this.doc.scrollLeft,this.doc.scrollTop),oi(this),(null==e||Math.abs(e-Zr(this.display))>.5)&&rn(this),rt(this,\"refresh\",this)}),swapDoc:Xn(function(e){var t=this.doc;return t.cm=null,Mi(this,e),Er(this),this.display.input.reset(),Ln(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,or(this,\"swapDoc\",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},lt(Il),Il.registerHelper=function(e,t,r){Bl.hasOwnProperty(e)||(Bl[e]=Il[e]={_global:[]}),Bl[e][t]=r},Il.registerGlobalHelper=function(e,t,r,n){Il.registerHelper(e,t,n),Bl[e]._global.push({pred:r,val:n})};var Ul,Vl=\"iter insert remove copy getEditor constructor\".split(\" \");for(var Kl in So.prototype)So.prototype.hasOwnProperty(Kl)&&B(Vl,Kl)<0&&(wl.prototype[Kl]=function(e){return function(){return e.apply(this.doc,arguments)}}(So.prototype[Kl]));return lt(So),wl.inputStyles={textarea:Gl,contenteditable:Hl},wl.defineMode=function(e){wl.defaults.mode||\"null\"==e||(wl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),St[e]=t}.apply(this,arguments)},wl.defineMIME=function(e,t){Lt[e]=t},wl.defineMode(\"null\",function(){return{token:function(e){return e.skipToEnd()}}}),wl.defineMIME(\"text/plain\",\"null\"),wl.defineExtension=function(e,t){wl.prototype[e]=t},wl.defineDocExtension=function(e,t){So.prototype[e]=t},wl.fromTextArea=function(e,t){if((t=t?z(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute(\"autofocus\")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(Je(e.form,\"submit\",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(t){t.save=n,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,n(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display=\"\",e.form&&(tt(e.form,\"submit\",n),\"function\"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display=\"none\";var s=wl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},(Ul=wl).off=tt,Ul.on=Je,Ul.wheelEventPixels=fi,Ul.Doc=So,Ul.splitLines=bt,Ul.countColumn=I,Ul.findColumn=X,Ul.isWordChar=ee,Ul.Pass=U,Ul.signal=rt,Ul.Line=jt,Ul.changeEnd=yi,Ul.scrollbarModel=Pn,Ul.Pos=ge,Ul.cmpPos=ve,Ul.modes=St,Ul.mimeModes=Lt,Ul.resolveMode=kt,Ul.getMode=Tt,Ul.modeExtensions=Mt,Ul.extendMode=Nt,Ul.copyState=Ot,Ul.startState=Dt,Ul.innerMode=At,Ul.commands=Yo,Ul.keyMap=Po,Ul.keyName=Go,Ul.isModifierKey=Ro,Ul.lookupKey=Io,Ul.normalizeKeyMap=zo,Ul.StringStream=Wt,Ul.SharedTextMarker=bo,Ul.TextMarker=mo,Ul.LineWidget=po,Ul.e_preventDefault=st,Ul.e_stopPropagation=at,Ul.e_stop=ct,Ul.addClass=H,Ul.contains=D,Ul.rmClass=T,Ul.keyNames=Do,wl.version=\"5.37.1\",wl});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.css": {
"text": ".CodeMirror{font-family:monospace;height:300px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{0%{}50%{background-color:transparent}}@-webkit-keyframes blink{0%{}50%{background-color:transparent}}@keyframes blink{0%{}50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css": {
"text": ".CodeMirror-dialog {\n position: absolute;\n left: 0; right: 0;\n background: inherit;\n z-index: 15;\n padding: .1em .8em;\n overflow: hidden;\n color: inherit;\n}\n\n.CodeMirror-dialog-top {\n border-bottom: 1px solid #eee;\n top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n border-top: 1px solid #eee;\n bottom: 0;\n}\n\n.CodeMirror-dialog input {\n border: none;\n outline: none;\n background: transparent;\n width: 20em;\n color: inherit;\n font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n font-size: 70%;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){function o(e,o,n){var t;return(t=e.getWrapperElement().appendChild(document.createElement(\"div\"))).className=n?\"CodeMirror-dialog CodeMirror-dialog-bottom\":\"CodeMirror-dialog CodeMirror-dialog-top\",\"string\"==typeof o?t.innerHTML=o:t.appendChild(o),t}function n(e,o){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=o}e.defineExtension(\"openDialog\",function(t,i,r){r||(r={}),n(this,null);var u=o(this,t,r.bottom),l=!1,c=this;function a(e){if(\"string\"==typeof e)s.value=e;else{if(l)return;l=!0,u.parentNode.removeChild(u),c.focus(),r.onClose&&r.onClose(u)}}var f,s=u.getElementsByTagName(\"input\")[0];return s?(s.focus(),r.value&&(s.value=r.value,!1!==r.selectValueOnOpen&&s.select()),r.onInput&&e.on(s,\"input\",function(e){r.onInput(e,s.value,a)}),r.onKeyUp&&e.on(s,\"keyup\",function(e){r.onKeyUp(e,s.value,a)}),e.on(s,\"keydown\",function(o){r&&r.onKeyDown&&r.onKeyDown(o,s.value,a)||((27==o.keyCode||!1!==r.closeOnEnter&&13==o.keyCode)&&(s.blur(),e.e_stop(o),a()),13==o.keyCode&&i(s.value,o))}),!1!==r.closeOnBlur&&e.on(s,\"blur\",a)):(f=u.getElementsByTagName(\"button\")[0])&&(e.on(f,\"click\",function(){a(),c.focus()}),!1!==r.closeOnBlur&&e.on(f,\"blur\",a),f.focus()),a}),e.defineExtension(\"openConfirm\",function(t,i,r){n(this,null);var u=o(this,t,r&&r.bottom),l=u.getElementsByTagName(\"button\"),c=!1,a=this,f=1;function s(){c||(c=!0,u.parentNode.removeChild(u),a.focus())}l[0].focus();for(var d=0;d<l.length;++d){var p=l[d];!function(o){e.on(p,\"click\",function(n){e.e_preventDefault(n),s(),o&&o(a)})}(i[d]),e.on(p,\"blur\",function(){--f,setTimeout(function(){f<=0&&s()},200)}),e.on(p,\"focus\",function(){++f})}}),e.defineExtension(\"openNotification\",function(t,i){n(this,a);var r,u=o(this,t,i&&i.bottom),l=!1,c=i&&void 0!==i.duration?i.duration:5e3;function a(){l||(l=!0,clearTimeout(r),u.parentNode.removeChild(u))}return e.on(u,\"click\",function(o){e.e_preventDefault(o),a()}),c&&(r=setTimeout(a,c)),a})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/selection/activeline.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";var t=\"CodeMirror-activeline\",n=\"CodeMirror-activeline-background\",i=\"CodeMirror-activeline-gutter\";function r(e){for(var r=0;r<e.state.activeLines.length;r++)e.removeLineClass(e.state.activeLines[r],\"wrap\",t),e.removeLineClass(e.state.activeLines[r],\"background\",n),e.removeLineClass(e.state.activeLines[r],\"gutter\",i)}function o(e,o){for(var a=[],s=0;s<o.length;s++){var c=o[s],l=e.getOption(\"styleActiveLine\");if(\"object\"==typeof l&&l.nonEmpty?c.anchor.line==c.head.line:c.empty()){var f=e.getLineHandleVisualStart(c.head.line);a[a.length-1]!=f&&a.push(f)}}(function(e,t){if(e.length!=t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0})(e.state.activeLines,a)||e.operation(function(){r(e);for(var o=0;o<a.length;o++)e.addLineClass(a[o],\"wrap\",t),e.addLineClass(a[o],\"background\",n),e.addLineClass(a[o],\"gutter\",i);e.state.activeLines=a})}function a(e,t){o(e,t.ranges)}e.defineOption(\"styleActiveLine\",!1,function(t,n,i){var s=i!=e.Init&&i;n!=s&&(s&&(t.off(\"beforeSelectionChange\",a),r(t),delete t.state.activeLines),n&&(t.state.activeLines=[],o(t,t.listSelections()),t.on(\"beforeSelectionChange\",a)))})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/selection/activeline.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/mode/tw-meta.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";e.modeInfo=[{name:\"CMake\",mime:\"text/x-cmake\",mode:\"cmake\",ext:[\"cmake\",\"cmake.in\"],file:/^CMakeLists.txt$/},{name:\"Cython\",mime:\"text/x-cython\",mode:\"python\",ext:[\"pyx\",\"pxd\",\"pxi\"]},{name:\"CSS\",mime:\"text/css\",mode:\"css\",ext:[\"css\"]},{name:\"diff\",mime:\"text/x-diff\",mode:\"diff\",ext:[\"diff\",\"patch\"]},{name:\"Embedded Javascript\",mime:\"application/x-ejs\",mode:\"htmlembedded\",ext:[\"ejs\"]},{name:\"Embedded Ruby\",mime:\"application/x-erb\",mode:\"htmlembedded\",ext:[\"erb\"]},{name:\"Erlang\",mime:\"text/x-erlang\",mode:\"erlang\",ext:[\"erl\"]},{name:\"GitHub Flavored Markdown\",mime:\"text/x-gfm\",mode:\"gfm\",file:/^(readme|contributing|history).md$/i},{name:\"Go\",mime:\"text/x-go\",mode:\"go\",ext:[\"go\"]},{name:\"ASP.NET\",mime:\"application/x-aspx\",mode:\"htmlembedded\",ext:[\"aspx\"],alias:[\"asp\",\"aspx\"]},{name:\"HTML\",mime:\"text/html\",mode:\"htmlmixed\",ext:[\"html\",\"htm\",\"handlebars\",\"hbs\"],alias:[\"xhtml\"]},{name:\"HTTP\",mime:\"message/http\",mode:\"http\"},{name:\"JavaScript\",mimes:[\"text/javascript\",\"text/ecmascript\",\"application/javascript\",\"application/x-javascript\",\"application/ecmascript\"],mode:\"javascript\",ext:[\"js\"],alias:[\"ecmascript\",\"js\",\"node\"]},{name:\"JSON\",mimes:[\"application/json\",\"application/x-json\"],mode:\"javascript\",ext:[\"json\",\"map\"],alias:[\"json5\"]},{name:\"JSON-LD\",mime:\"application/ld+json\",mode:\"javascript\",ext:[\"jsonld\"],alias:[\"jsonld\"]},{name:\"Lua\",mime:\"text/x-lua\",mode:\"lua\",ext:[\"lua\"]},{name:\"Markdown\",mime:\"text/x-markdown\",mode:\"markdown\",ext:[\"markdown\",\"md\",\"mkd\"]},{name:\"MySQL\",mime:\"text/x-mysql\",mode:\"sql\"},{name:\"Plain Text\",mime:\"text/plain\",mode:\"null\",ext:[\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\"]},{name:\"Python\",mime:\"text/x-python\",mode:\"python\",ext:[\"BUILD\",\"bzl\",\"py\",\"pyw\"],file:/^(BUCK|BUILD)$/},{name:\"SCSS\",mime:\"text/x-scss\",mode:\"css\",ext:[\"scss\"]},{name:\"LaTeX\",mime:\"text/x-latex\",mode:\"stex\",ext:[\"text\",\"ltx\",\"tex\"],alias:[\"tex\"]},{name:\"TiddlyWiki \",mime:\"text/x-tiddlywiki\",mode:\"tiddlywiki\"}];for(var t=0;t<e.modeInfo.length;t++){var m=e.modeInfo[t];m.mimes&&(m.mime=m.mimes[0])}e.findModeByMIME=function(t){t=t.toLowerCase();for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.mime==t)return i;if(i.mimes)for(var a=0;a<i.mimes.length;a++)if(i.mimes[a]==t)return i}return/\\+xml$/.test(t)?e.findModeByMIME(\"application/xml\"):/\\+json$/.test(t)?e.findModeByMIME(\"application/json\"):void 0},e.findModeByExtension=function(t){for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.ext)for(var a=0;a<i.ext.length;a++)if(i.ext[a]==t)return i}},e.findModeByFileName=function(t){for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.file&&i.file.test(t))return i}var a=t.lastIndexOf(\".\"),o=a>-1&&t.substring(a+1,t.length);if(o)return e.findModeByExtension(o)},e.findModeByName=function(t){t=t.toLowerCase();for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.name.toLowerCase()==t)return i;if(i.alias)for(var a=0;a<i.alias.length;a++)if(i.alias[a].toLowerCase()==t)return i}}});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/tw-meta.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/keyboard": {
"title": "$:/plugins/tiddlywiki/codemirror/keyboard",
"text": "\n!!Default keyboard shortcuts\n\n!!!Basic shortcuts\n\n|Shortcut |Function |h\n|Left |goCharLeft |\n|Right |goCharRight |\n|Up |goLineUp |\n|Down |goLineDown |\n|End |goLineEnd |\n|Home |goLineStartSmart |\n|~PageUp |goPageUp |\n|~PageDown |goPageDown |\n|Delete |delCharAfter |\n|Backspace |delCharBefore |\n|Shift-Backspace |delCharBefore |\n|Tab |defaultTab |\n|Shift-Tab |indentAuto |\n|Enter |newlineAndIndent |\n|Insert |toggleOverwrite |\n|Ctrl-Esc |singleSelection |\n\n\n!!!Shortcuts on Windows and Linux\n\n|Shortcut |Function |h\n|Ctrl-A |selectAll |\n|Ctrl-D |deleteLine |\n|Ctrl-Z |undo |\n|Shift-Ctrl-Z |redo |\n|Ctrl-Y |redo |\n|Ctrl-Home |goDocStart |\n|Ctrl-End |goDocEnd |\n|Ctrl-Up |goLineUp |\n|Ctrl-Down |goLineDown |\n|Ctrl-Left |goGroupLeft |\n|Ctrl-Right |goGroupRight |\n|Alt-Left |goLineStart |\n|Alt-Right |goLineEnd |\n|Ctrl-Backspace |delGroupBefore |\n|Ctrl-Delete |delGroupAfter |\n|Ctrl-F |find |\n|Ctrl-G |findNext |\n|Shift-Ctrl-G |findPrev |\n|Shift-Ctrl-F |replace |\n|Shift-Ctrl-R |replaceAll |\n|Ctrl-[ |indentLess |\n|Ctrl-] |indentMore |\n|Alt-U |undoSelection |\n|Shift-Ctrl-U |redoSelection |\n|Shift-Alt-U |redoSelection |\n\n\n!!!Shortcuts on ~MacOs\n\n|Shortcut |Function |h\n|Cmd-A |selectAll |\n|Cmd-D |deleteLine |\n|Cmd-Z |undo |\n|Shift-Cmd-Z |redo |\n|Cmd-Y |redo |\n|Cmd-Home |goDocStart |\n|Cmd-Up |goDocStart |\n|Cmd-End |goDocEnd |\n|Cmd-Down |goDocEnd |\n|Alt-Left |goGroupLeft |\n|Alt-Right |goGroupRight |\n|Cmd-Left |goLineLeft |\n|Cmd-Right |goLineRight |\n|Alt-Backspace |delGroupBefore |\n|Ctrl-Alt-Backspace |delGroupAfter |\n|Alt-Delete |delGroupAfter |\n|Cmd-F |find |\n|Cmd-G |findNext |\n|Shift-Cmd-G |findPrev |\n|Cmd-Alt-F |replace |\n|Shift-Cmd-Alt-F |replaceAll |\n|Cmd-[ |indentLess |\n|Cmd-] |indentMore |\n|Cmd-Backspace |delWrappedLineLeft |\n|Cmd-Delete |delWrappedLineRight |\n|Alt-U |undoSelection |\n|Shift-Alt-U |redoSelection |\n|Ctrl-Up |goDocStart |\n|Ctrl-Down |goDocEnd |\n|Ctrl-F |goCharRight |\n|Ctrl-B |goCharLeft |\n|Ctrl-P |goLineUp |\n|Ctrl-N |goLineDown |\n|Alt-F |goWordRight |\n|Alt-B |goWordLeft |\n|Ctrl-A |goLineStart |\n|Ctrl-E |goLineEnd |\n|Ctrl-V |goPageDown |\n|Shift-Ctrl-V |goPageUp |\n|Ctrl-D |delCharAfter |\n|Ctrl-H |delCharBefore |\n|Alt-D |delWordAfter |\n|Alt-Backspace |delWordBefore |\n|Ctrl-K |killLine |\n|Alt-T |transposeChars |\n|Ctrl-O |openLine |\n\n\n"
},
"$:/plugins/tiddlywiki/codemirror/license": {
"title": "$:/plugins/tiddlywiki/codemirror/license",
"text": "\"\"\"\n~CodeMirror, copyright (c) by Marijn Haverbeke and others\nDistributed under an MIT license: http://codemirror.net/LICENSE\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2018, UnaMesa Association\nDistributed under an BSD license: https://tiddlywiki.com/#License\n\"\"\"\n"
},
"$:/plugins/tiddlywiki/codemirror/readme": {
"title": "$:/plugins/tiddlywiki/codemirror/readme",
"text": "This plugin provides an enhanced text editor component based on [[CodeMirror|http://codemirror.net]]. The basic configuration is designed to be as lightweight as possible and is just around 235kb of size. Additional features can be installed with ~CodeMirror ~AddOns from the plugin library.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]]\n\nBased on ~CodeMirror version 5.37.0\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/editorFont": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/editorFont",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/editorFont/hint}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/keyMap": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/keyMap",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/keyMap/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/keyMap\n\n<$link to=\"$:/config/codemirror/keyMap\"><<lingo hint>></$link>\n\n<$select tiddler=\"$:/config/codemirror/keyMap\" default=\"default\">\n<option value=\"default\">default</option>\n<$list filter=\"[all[shadows+tiddlers]module-type[codemirror-keymap]!has[draft.of]get[text]]\">\n<option value=<<currentTiddler>>><$transclude><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/lineNumbers": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/lineNumbers",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/lineNumbers/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/lineNumbers/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/lineNumbers\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"false\"> <$link to=\"$:/config/codemirror/lineNumbers\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/lineWrapping": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/lineWrapping",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/lineWrapping/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/lineWrapping/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/lineWrapping\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/lineWrapping\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/showCursorWhenSelecting": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/showCursorWhenSelecting",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/showCursorWhenSelecting/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/showCursorWhenSelecting/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/showCursorWhenSelecting\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/showCursorWhenSelecting\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/styleActiveLine": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/styleActiveLine",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/styleActiveLine/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/styleActiveLine/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/styleActiveLine\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"false\"> <$link to=\"$:/config/codemirror/styleActiveLine\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/theme": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/theme",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/theme/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/\n\n<$link to=\"$:/config/codemirror/theme\"><<lingo hint>></$link>\n\n<$select tiddler=\"$:/config/codemirror/theme\" default=\"default\">\n<option value=\"default\">default</option>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]module-type[codemirror-theme]!has[draft.of]get[name]]\">\n<option value=<<currentTiddler>>><$transclude field=\"name\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n\n//see the [[CodeMirror Usage|$:/plugins/tiddlywiki/codemirror/usage]] how to add themes//\n"
},
"$:/plugins/tiddlywiki/codemirror/styles": {
"title": "$:/plugins/tiddlywiki/codemirror/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* Make the editor resize to fit its content */\n\n.CodeMirror {\n\theight: auto;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.5;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n}\n\n.CodeMirror-scroll {\n\toverflow-x: auto;\n\toverflow-y: hidden;\t\n}\n"
},
"$:/core/ui/ControlPanel/Settings/CodeMirror": {
"title": "$:/core/ui/ControlPanel/Settings/CodeMirror",
"tags": "$:/tags/ControlPanel/SettingsTab",
"caption": "CodeMirror",
"list-after": "$:/core/ui/ControlPanel/Settings/TiddlyWiki",
"text": "\\define lingo-base() $:/language/codemirror/controlPanel/\n\n<<lingo hint>>\n\n<$link to=\"$:/plugins/tiddlywiki/codemirror/usage\"><<lingo usage>></$link>\n\n<$link to=\"$:/plugins/tiddlywiki/codemirror/keyboard\"><<lingo keyboard>></$link>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings/CodeMirror]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Settings/TiddlyWiki\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Settings/TiddlyWiki": {
"title": "$:/core/ui/ControlPanel/Settings/TiddlyWiki",
"tags": "$:/tags/ControlPanel/SettingsTab",
"caption": "TiddlyWiki",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/plugins/tiddlywiki/codemirror/usage": {
"title": "$:/plugins/tiddlywiki/codemirror/usage",
"text": "! Configuration\n\nConfiguration for the ~CodeMirror text-editor can be done from within the CodeMirror Settings Tab in the [[ControlPanel|$:/ControlPanel]] (Settings - ~CodeMirror)\n\n\n!!Setting a different Theme\n\n~CodeMirror themes are available in the [ext[official GitHub repository|https://github.com/codemirror/CodeMirror/tree/master/theme]]\n\nMore themes can be found at https://github.com/FarhadG/code-mirror-themes/tree/master/themes and previewed [ext[here|http://farhadg.github.io/code-mirror-themes/]]\n\n\nTo add a theme to your wiki, follow these four steps:\n\n* choose one of the CSS files and copy its content to a new tiddler\n* remove all comments from the top and tag the tiddler with <<tag-pill \"$:/tags/Stylesheet\">>\n* add a field \"module-type\" with the value \"codemirror-theme\". add a field \"name\" with the exact ''name'' of the theme as value\n* save the tiddler and go to the Settings tab in $:/ControlPanel - look for the \"theme\" dropdown to select your newly added theme\n\n\n!!Line Numbers\n\nTo show or hide the Line Numbers at the left, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Line Numbers\" checkbox\n\n\n!!Line Wrapping\n\nControls if long lines get visually wrapped to a new line if they're too long to fit the editor width or if the editor should scroll horizontally\n\nTo change the line-wrapping behaviour, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Line Wrapping\" checkbox\n\n\n!!Show Cursor when selecting\n\nDefines whether the Mouse cursor should be visually shown or hidden when making a text-selection\n\nTo change the show-cursor-when-selecting behaviour, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Show cursor when selecting\" checkbox\n\n\n!!~CodeMirror Font Family\n\nThe Font-Family used within the ~CodeMirror text-editor defaults to \"monospace\" which will choose your configured monospace system-font\n\nThat setting can be overridden entering one or more Font-Families in the \"Font Family\" input field at ~ControlPanel - Settings - ~CodeMirror\n\n* The entries must be separated by semicolons ','\n* Font-Family Names that contain spaces must be quoted like \"My Font\"\n* If a list of Font-Families is specified, the last Font-Family found on the user-system gets used, non-existing fonts get ignored\n* If none of the specified Font-Families is available, ~CodeMirror uses the default \"monospace\"\n\n\n!!\"Hidden\" Settings:\n\n!!!Cursor Blink Rate\n\nThe cursor blink-rate defines how fast (in milliseconds) the cursor blinks inside the textarea\n\nYou can change it by editing $:/config/codemirror/cursorBlinkRate\n\"0\" disables blinking\n\n!!!Tabsize\n\nThe Tabsize defines the width of a tab character. Default is 4.\n\nYou can change it by editing $:/config/codemirror/tabSize\n\n!!!Indent Unit\n\nNot enabled for vnd.tiddlywiki and x-tiddlywiki\n\nDefines how many spaces a text-block should be indented. Defaults to 2.\n\nYou can change it by editing $:/config/codemirror/indentUnit\n\n"
}
}
}
{
"tiddlers": {
"$:/config/HighlightPlugin/TypeMappings/application/javascript": {
"title": "$:/config/HighlightPlugin/TypeMappings/application/javascript",
"text": "javascript"
},
"$:/config/HighlightPlugin/TypeMappings/application/json": {
"title": "$:/config/HighlightPlugin/TypeMappings/application/json",
"text": "json"
},
"$:/config/HighlightPlugin/TypeMappings/text/css": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/css",
"text": "css"
},
"$:/config/HighlightPlugin/TypeMappings/text/html": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/html",
"text": "html"
},
"$:/config/HighlightPlugin/TypeMappings/image/svg+xml": {
"title": "$:/config/HighlightPlugin/TypeMappings/image/svg+xml",
"text": "xml"
},
"$:/config/HighlightPlugin/TypeMappings/text/x-markdown": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/x-markdown",
"text": "markdown"
},
"$:/plugins/tiddlywiki/highlight/highlight.js": {
"text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */\n!function(e){var n=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\\blang(?:uage)?-([\\w-]+)\\b/i,t=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,r={case_insensitive:\"cI\",lexemes:\"l\",contains:\"c\",keywords:\"k\",subLanguage:\"sL\",className:\"cN\",begin:\"b\",beginKeywords:\"bK\",end:\"e\",endsWithParent:\"eW\",illegal:\"i\",excludeBegin:\"eB\",excludeEnd:\"eE\",returnBegin:\"rB\",returnEnd:\"rE\",variants:\"v\",IDENT_RE:\"IR\",UNDERSCORE_IDENT_RE:\"UIR\",NUMBER_RE:\"NR\",C_NUMBER_RE:\"CNR\",BINARY_NUMBER_RE:\"BNR\",RE_STARTERS_RE:\"RSR\",BACKSLASH_ESCAPE:\"BE\",APOS_STRING_MODE:\"ASM\",QUOTE_STRING_MODE:\"QSM\",PHRASAL_WORDS_MODE:\"PWM\",C_LINE_COMMENT_MODE:\"CLCM\",C_BLOCK_COMMENT_MODE:\"CBCM\",HASH_COMMENT_MODE:\"HCM\",NUMBER_MODE:\"NM\",C_NUMBER_MODE:\"CNM\",BINARY_NUMBER_MODE:\"BNM\",CSS_NUMBER_MODE:\"CSSNM\",REGEXP_MODE:\"RM\",TITLE_MODE:\"TM\",UNDERSCORE_TITLE_MODE:\"UTM\",COMMENT:\"C\",beginRe:\"bR\",endRe:\"eR\",illegalRe:\"iR\",lexemesRe:\"lR\",terminators:\"t\",terminator_end:\"tE\"},m=\"</span>\",O=\"Could not find the language '{}', did you forget to load/include a language module?\",B={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},o=\"of and for in not or if then\".split(\" \");function x(e){return e.replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:\"start\",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:\"stop\",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a=\"\",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"===n[0].event?e:n:e.length?e:n}function c(e){a+=\"<\"+g(e)+f.map.call(e.attributes,function(e){return\" \"+e.nodeName+'=\"'+x(e.value).replace(/\"/g,\""\")+'\"'}).join(\"\")+\">\"}function l(e){a+=\"</\"+g(e)+\">\"}function u(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else\"start\"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return\"string\"==typeof n?t(\"keyword\",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(\" \").forEach(function(e){var n=e.split(\"|\");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),\"m\"+(r.cI?\"i\":\"\")+(n?\"g\":\"\"))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?\"\\\\.?(?:\"+e.b+\")\\\\.?\":e.b)}a.tE&&n(\"end\",a.tE),a.i&&n(\"illegal\",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./,r=0,a=\"\",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+=\"(\";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),\"\\\\\"==l[0][0]&&l[1]?a+=\"\\\\\"+String(Number(l[1])+o):(a+=l[0],\"(\"==l[0]&&r++)}a+=\")\"}return a}(u,\"|\"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[\"\"+r]){n=o[\"\"+r];break}return\"string\"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type=\"begin\",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf(\"self\")){if(!C)throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");r.c=r.c.filter(function(e){return\"self\"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\\w+/,!0),e&&(t.bK&&(t.b=\"\\\\b(\"+t.bK.split(\" \").join(\"|\")+\")\\\\b\"),t.b||(t.b=/\\B|\\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\\B|\\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||\"\",t.eW&&e.tE&&(t.tE+=(t.e?\"|\":\"\")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R(\"self\"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&\"\"===n)return\"\";if(!e)return n;var a='<span class=\"'+(r?\"\":B.classPrefix);return(a+=e+'\">')+n+(t?\"\":m)}function l(){p+=null!=d.sL?function(){var e=\"string\"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r=\"\",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=\"\"}function u(e){p+=e.cN?c(e.cN,\"\",!0):\"\",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if(\"begin\"==f.type&&\"end\"==n.type&&f.index==n.index&&\"\"===t)return v+=i.slice(n.index,n.index+1),1;if(\"begin\"===(f=n).type)return s(n);if(\"illegal\"===n.type&&!a)throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(d.cN||\"<unnamed>\")+'\"');if(\"end\"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace(\"{}\",n)),new Error('Unknown language: \"'+n+'\"');S(g);var E,d=t||g,R={},p=\"\";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,\"\",!0)+p);var v=\"\",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf(\"Illegal\"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&\"\\n\"===e?\"<br>\":B.tabReplace?n.replace(/\\t/g,B.tabReplace):\"\"}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace(\"{}\",t[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),o?t[1]:\"no-highlight\"}for(n=0,r=(i=i.split(/\\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement(\"div\")).innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement(\"div\")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||\"\").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener(\"DOMContentLoaded\",h,!1),window.addEventListener(\"load\",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE=\"[a-zA-Z]\\\\w*\",a.UIR=a.UNDERSCORE_IDENT_RE=\"[a-zA-Z_]\\\\w*\",a.NR=a.NUMBER_RE=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",a.CNR=a.C_NUMBER_RE=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",a.BNR=a.BINARY_NUMBER_RE=\"\\\\b(0b[01]+)\",a.RSR=a.RE_STARTERS_RE=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",a.BE=a.BACKSLASH_ESCAPE={b:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:\"comment\",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C(\"//\",\"$\"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C(\"/\\\\*\",\"\\\\*/\"),a.HCM=a.HASH_COMMENT_MODE=a.C(\"#\",\"$\"),a.NM=a.NUMBER_MODE={cN:\"number\",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:\"number\",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:\"number\",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:\"number\",b:a.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},a.RM=a.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[a.BE,{b:/\\[/,e:/\\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:\"title\",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:\"title\",b:a.UIR,relevance:0},a.METHOD_GUARD={b:\"\\\\.\\\\s*\"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r=\"function\"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||\"object\"!=typeof t[e]&&\"function\"!=typeof t[e]||r&&(\"caller\"===e||\"callee\"===e||\"arguments\"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage(\"swift\",function(e){var i={keyword:\"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet\",literal:\"true false nil\",built_in:\"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip\"},t=e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),n={cN:\"subst\",b:/\\\\\\(/,e:\"\\\\)\",k:i,c:[]},r={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/\"/,e:/\"/}]},a={cN:\"number\",b:\"\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b\",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*[!?]\"},{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*\",relevance:0},a,{cN:\"function\",bK:\"func\",e:\"{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:i,c:[\"self\",a,r,e.CBCM,{b:\":\"}],i:/[\"']/}],i:/\\[|%/},{cN:\"class\",bK:\"struct protocol class extension enum\",k:i,e:\"\\\\{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/})]},{cN:\"meta\",b:\"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\"},{bK:\"import\",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage(\"less\",function(e){function r(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a=\"[\\\\w-]+\",c=\"(\"+a+\"|@{\"+a+\"})\",s=[],n=[],b={b:\"\\\\(\",e:\"\\\\)\",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r(\"'\"),r('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},t(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),b,t(\"variable\",\"@@?\"+a,10),t(\"variable\",\"@{\"+a+\"}\"),t(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:a+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=n.concat({b:\"{\",e:\"}\",c:s}),l={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(n)},o={b:c+\"\\\\s*:\",rB:!0,e:\"[;}]\",relevance:0,c:[{cN:\"attribute\",b:c,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",relevance:0,c:n}}]},u={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:n,relevance:0}},v={cN:\"variable\",v:[{b:\"@\"+a+\"\\\\s*:\",relevance:15},{b:\"@\"+a}],starts:{e:\"[;}]\",rE:!0,c:i}},C={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:c,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",relevance:0,c:[e.CLCM,e.CBCM,l,t(\"keyword\",\"all\\\\b\"),t(\"variable\",\"@{\"+a+\"}\"),t(\"selector-tag\",c+\"%?\",0),t(\"selector-id\",\"#\"+c),t(\"selector-class\",\"\\\\.\"+c,0),t(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:\"[=>'/<($\\\"]\",c:s}});hljs.registerLanguage(\"armasm\",function(s){return{cI:!0,aliases:[\"arm\"],l:\"\\\\.?\"+s.IR,k:{meta:\".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND \",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @\"},c:[{cN:\"keyword\",b:\"\\\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?\",e:\"\\\\s\"},s.C(\"[;@]\",\"$\",{relevance:0}),s.CBCM,s.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",relevance:0},{cN:\"title\",b:\"\\\\|\",e:\"\\\\|\",i:\"\\\\n\",relevance:0},{cN:\"number\",v:[{b:\"[#$=]?0x[0-9a-f]+\"},{b:\"[#$=]?0b[01]+\"},{b:\"[#$=]\\\\d+\"},{b:\"\\\\b\\\\d+\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+\"},{b:\"^\\\\s*[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+:\"},{b:\"[=#]\\\\w+\"}],relevance:0}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",b={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},r={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[r]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[r],relevance:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:b},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<[-~]?'?(\\w+)(?:.|\\n)*?\\n\\s*\\1\\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:b},l=[t,a,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",relevance:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[t,{b:c}],relevance:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:b},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[a,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\\s*=>/,starts:{e:\"$\",c:i.c=l}},{cN:\"meta\",b:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>)\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:b,i:/\\/\\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage(\"lua\",function(e){var t=\"\\\\[=*\\\\[\",a=\"\\\\]=*\\\\]\",n={b:t,e:a,c:[\"self\"]},l=[e.C(\"--(?!\"+t+\")\",\"$\"),e.C(\"--\"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:\"true false nil\",keyword:\"and break do else elseif end for goto if in local not or repeat return then until while\",built_in:\"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove\"},c:l.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[e.inherit(e.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:\"string\",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage(\"matlab\",function(e){var a=\"('|\\\\.')+\",s={relevance:0,c:[{b:a}]};return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell \"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[e.UTM,{cN:\"params\",v:[{b:\"\\\\(\",e:\"\\\\)\"},{b:\"\\\\[\",e:\"\\\\]\"}]}]},{cN:\"built_in\",b:/true|false/,relevance:0,starts:s},{b:\"[a-zA-Z][a-zA-Z_0-9]*\"+a,relevance:0},{cN:\"number\",b:e.CNR,relevance:0,starts:s},{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{b:/\\]|}|\\)/,relevance:0,starts:s},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}],starts:s},e.C(\"^\\\\s*\\\\%\\\\{\\\\s*$\",\"^\\\\s*\\\\%\\\\}\\\\s*$\"),e.C(\"\\\\%\",\"$\")]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,relevance:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,relevance:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"yaml\",function(e){var b=\"true false yes no null\",a={cN:\"string\",relevance:0,v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/\\S+/}],c:[e.BE,{cN:\"template-variable\",v:[{b:\"{{\",e:\"}}\"},{b:\"%{\",e:\"}\"}]}]};return{cI:!0,aliases:[\"yml\",\"YAML\",\"yaml\"],c:[{cN:\"attr\",v:[{b:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{b:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{b:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{cN:\"meta\",b:\"^---s*$\",relevance:10},{cN:\"string\",b:\"[\\\\|>]([0-9]?[+-])?[ ]*\\\\n( *)[\\\\S ]+\\\\n(\\\\2[\\\\S ]+\\\\n?)*\"},{b:\"<%[%=-]?\",e:\"[%-]?%>\",sL:\"ruby\",eB:!0,eE:!0,relevance:0},{cN:\"type\",b:\"!\"+e.UIR},{cN:\"type\",b:\"!!\"+e.UIR},{cN:\"meta\",b:\"&\"+e.UIR+\"$\"},{cN:\"meta\",b:\"\\\\*\"+e.UIR+\"$\"},{cN:\"bullet\",b:\"\\\\-(?=[ ]|$)\",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:\"number\",b:e.CNR+\"\\\\b\"},a]}});hljs.registerLanguage(\"plaintext\",function(e){return{disableAutodetect:!0}});hljs.registerLanguage(\"erlang-repl\",function(e){return{k:{built_in:\"spawn spawn_link self\",keyword:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"meta\",b:\"^[0-9]+> \",relevance:10},e.C(\"%\",\"$\"),{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},e.ASM,e.QSM,{b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{b:\"->\"},{b:\"ok\"},{b:\"!\"},{b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",relevance:0},{b:\"[A-Z][a-zA-Z0-9_']*\",relevance:0}]}});hljs.registerLanguage(\"cmake\",function(e){return{aliases:[\"cmake.in\"],cI:!0,k:{keyword:\"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined\"},c:[{cN:\"variable\",b:\"\\\\${\",e:\"}\"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage(\"kotlin\",function(e){var t={keyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default\",built_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",literal:\"true false null\"},a={cN:\"symbol\",b:e.UIR+\"@\"},n={cN:\"subst\",b:\"\\\\${\",e:\"}\",c:[e.CNM]},c={cN:\"variable\",b:\"\\\\$\"+e.UIR},r={cN:\"string\",v:[{b:'\"\"\"',e:'\"\"\"(?=[^\"])',c:[c,n]},{b:\"'\",e:\"'\",i:/\\n/,c:[e.BE]},{b:'\"',e:'\"',i:/\\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:\"meta\",b:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UIR+\")?\"},l={cN:\"meta\",b:\"@\"+e.UIR,c:[{b:/\\(/,e:/\\)/,c:[e.inherit(r,{cN:\"meta-string\"})]}]},s={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0},b=e.C(\"/\\\\*\",\"\\\\*/\",{c:[e.CBCM]}),o={v:[{cN:\"type\",b:e.UIR},{b:/\\(/,e:/\\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:[\"kt\"],k:t,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,b,{cN:\"keyword\",b:/\\b(break|continue|return|this)\\b/,starts:{c:[{cN:\"symbol\",b:/@\\w+/}]}},a,i,l,{cN:\"function\",bK:\"fun\",e:\"[(]|$\",rB:!0,eE:!0,k:t,i:/fun\\s+(<.*>)?[^\\s\\(]+(\\s+[^\\s\\(]+)\\s*=/,relevance:5,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"type\",b:/</,e:/>/,k:\"reified\",relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:\"class\",bK:\"class interface trait\",e:/[:\\{(]|$/,eE:!0,i:\"extends implements\",c:[{bK:\"public protected internal private constructor\"},e.UTM,{cN:\"type\",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:\"type\",b:/[,:]\\s*/,e:/[<\\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:\"meta\",b:\"^#!/usr/bin/env\",e:\"$\",i:\"\\n\"},s]}});hljs.registerLanguage(\"javascript\",function(e){var r=\"<>\",a=\"</>\",t={b:/<[A-Za-z0-9\\\\._:-]+/,e:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/},c=\"[A-Za-z$_][0-9A-Za-z$_]*\",n={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:n,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},b={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},l={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],k:n,c:[{cN:\"meta\",relevance:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\",c:[{cN:\"type\",b:\"\\\\{\",e:\"\\\\}\",relevance:0},{cN:\"variable\",b:c+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{b:/(?=[^\\n])\\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\\n]\\s*/,relevance:0,c:[{b:c+\"\\\\s*:\",rB:!0,relevance:0,c:[{cN:\"attr\",b:c,relevance:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+c+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:c},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:\"\",b:/\\s/,e:/\\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:\"xml\",c:[{b:t.b,e:t.e,skip:!0,c:[\"self\"]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:u}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor get set\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"scss\",function(e){var t=\"@[a-z-]+\",r={cN:\"variable\",b:\"(\\\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\\\b\"},i={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",relevance:0},{cN:\"selector-pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"selector-pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},r,{cN:\"attribute\",b:\"\\\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@(page|font-face)\",l:t,k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",rB:!0,k:\"and or not only\",c:[{b:t,cN:\"keyword\"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:c,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",relevance:5},{b:\"qw\\\\s+q\",e:\"q\",relevance:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],relevance:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],relevance:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",relevance:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",relevance:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],relevance:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,relevance:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",relevance:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=a,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s.c=a}});hljs.registerLanguage(\"go\",function(e){var n={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",literal:\"true false iota nil\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:n,i:\"</\",c:[e.CLCM,e.CBCM,{cN:\"string\",v:[e.QSM,e.ASM,{b:\"`\",e:\"`\"}]},{cN:\"number\",v:[{b:e.CNR+\"[i]\",relevance:1},e.CNM]},{b:/:=/},{cN:\"function\",bK:\"func\",e:\"\\\\s*(\\\\{|$)\",eE:!0,c:[e.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:n,i:/[\"']/}]}]}});hljs.registerLanguage(\"x86asm\",function(s){return{cI:!0,l:\"[.%]?\"+s.IR,k:{keyword:\"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63\",built_in:\"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr\",meta:\"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__\"},c:[s.C(\";\",\"$\",{relevance:0}),{cN:\"number\",v:[{b:\"\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b\",relevance:0},{b:\"\\\\$[0-9][0-9A-Fa-f]*\",relevance:0},{b:\"\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b\"},{b:\"\\\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b\"}]},s.QSM,{cN:\"string\",v:[{b:\"'\",e:\"[^\\\\\\\\]'\"},{b:\"`\",e:\"[^\\\\\\\\]`\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)\"},{b:\"^\\\\s*%%[A-Za-z0-9_$#@~.?]*:\"}],relevance:0},{cN:\"subst\",b:\"%[0-9]+\",relevance:0},{cN:\"subst\",b:\"%!S+\",relevance:0},{cN:\"meta\",b:/^\\s*\\.[\\w_-]+/}]}});hljs.registerLanguage(\"cpp\",function(e){function t(e){return\"(?:\"+e+\")?\"}var r=\"decltype\\\\(auto\\\\)\",a=\"[a-zA-Z_]\\\\w*::\",i=\"(\"+r+\"|\"+t(a)+\"[a-zA-Z_]\\\\w*\"+t(\"<.*?>\")+\")\",c={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},s={cN:\"string\",v:[{b:'(u8?|U|L)?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",e:\"'\",i:\".\"},{b:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\((?:.|\\n)*?\\)\\1\"/}]},n={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},o={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(s,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},l={cN:\"title\",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+\"\\\\s*\\\\(\",p={keyword:\"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\",built_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary\",literal:\"true false nullptr NULL\"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:p,c:m.concat([{b:/\\(/,e:/\\)/,k:p,c:m.concat([\"self\"]),relevance:0}]),relevance:0},b={cN:\"function\",b:\"(\"+i+\"[\\\\*&\\\\s]+)+\"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\\w\\s\\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\\(/,e:/\\)/,k:p,relevance:0,c:[\"self\",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\",\"hh\",\"hxx\",\"cxx\"],k:p,i:\"</\",c:[].concat(d,b,m,[o,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:p,c:[\"self\",c]},{b:e.IR+\"::\",k:p},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage(\"arduino\",function(e){var t=\"boolean byte word String\",r=\"setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put\",i=\"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW\",o=e.requireLanguage(\"cpp\").rawDefinition(),a=o.k;return a.keyword+=\" \"+t,a.literal+=\" \"+i,a.built_in+=\" \"+r,o});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},relevance:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",relevance:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],relevance:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:b}],relevance:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"xml\",function(e){var c={cN:\"symbol\",b:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},s={b:\"\\\\s\",c:[{cN:\"meta-keyword\",b:\"#?[a-z_][a-z1-9_-]+\",i:\"\\\\n\"}]},a=e.inherit(s,{b:\"\\\\(\",e:\"\\\\)\"}),t=e.inherit(e.ASM,{cN:\"meta-string\"}),l=e.inherit(e.QSM,{cN:\"meta-string\"}),r={eW:!0,i:/</,relevance:0,c:[{cN:\"attr\",b:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{b:/=\\s*/,relevance:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],cI:!0,c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",relevance:10,c:[s,l,t,a,{b:\"\\\\[\",e:\"\\\\]\",c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",c:[s,a,l,t]}]}]},e.C(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",relevance:10},c,{cN:\"meta\",b:/<\\?xml/,e:/\\?>/,relevance:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0},{b:'b\"',e:'\"',skip:!0},{b:\"b'\",e:\"'\",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:\"tag\",b:\"<style(?=\\\\s|>)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"<\\/script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,relevance:0},r]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",relevance:0},{cN:\"bullet\",b:\"^\\\\s*([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",relevance:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```\\\\w*\\\\s*$\",e:\"^```[ ]*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\\\\t)\",e:\"$\",relevance:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,relevance:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],relevance:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"properties\",function(e){var r=\"[ \\\\t\\\\f]*\",t=\"(\"+r+\"[:=]\"+r+\"|[ \\\\t\\\\f]+)\",n=\"([^\\\\\\\\\\\\W:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",a=\"([^\\\\\\\\:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",c={e:t,relevance:0,starts:{cN:\"string\",e:/$/,relevance:0,c:[{b:\"\\\\\\\\\\\\n\"}]}};return{cI:!0,i:/\\S/,c:[e.C(\"^\\\\s*[!#]\",\"$\"),{b:n+t,rB:!0,c:[{cN:\"attr\",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:\"meta\",b:a,endsParent:!0,relevance:0}],starts:c},{cN:\"attr\",relevance:0,b:a+r+\"$\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},a={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,relevance:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],relevance:0},e.HCM,a,{cN:\"\",b:/\\\\\"/},{cN:\"string\",b:/'/,e:/'/},t]}});hljs.registerLanguage(\"dockerfile\",function(e){return{aliases:[\"docker\"],cI:!0,k:\"from maintainer expose env arg user onbuild stopsignal\",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:\"run cmd entrypoint volume add copy workdir label healthcheck shell\",starts:{e:/[^\\\\]$/,sL:\"bash\"}}],i:\"</\"}});hljs.registerLanguage(\"python\",function(e){var r={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10\",built_in:\"Ellipsis NotImplemented\",literal:\"False None True\"},b={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},c={cN:\"subst\",b:/\\{/,e:/\\}/,k:r,i:/#/},a={b:/\\{\\{/,relevance:0},l={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)\"/,e:/\"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:\"number\",relevance:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},i={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:[\"py\",\"gyp\",\"ipython\"],k:r,i:/(<\\/|->|\\?)|=>/,c:[b,n,{bK:\"if\",relevance:0},l,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"number\",relevance:0,v:[{b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},n={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",relevance:10},{b:'\"\"\"',e:'\"\"\"',relevance:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[a,{cN:\"section\",b:/\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_\\.-]+(?=\\s*=\\s*)/,cN:\"attr\",starts:{e:/$/,c:[a,{b:/\\[/,e:/\\]/,c:[a,r,c,n,b,\"self\"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",relevance:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/^\\*{15}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",relevance:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null unknown\",built_in:\"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage(\"vala\",function(e){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object Gtk Posix\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface namespace\",e:\"{\",eE:!0,i:\"[^,:\\\\n\\\\s\\\\.]\",c:[e.UTM]},e.CLCM,e.CBCM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',relevance:5},e.ASM,e.QSM,e.CNM,{cN:\"meta\",b:\"^#\",e:\"$\",relevance:2}]}});hljs.registerLanguage(\"asciidoc\",function(e){return{aliases:[\"adoc\"],c:[e.C(\"^/{4,}\\\\n\",\"\\\\n/{4,}$\",{relevance:10}),e.C(\"^//\",\"$\",{relevance:0}),{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",relevance:10},{cN:\"section\",relevance:10,v:[{b:\"^(={1,5}) .+?( \\\\1)?$\"},{b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\"}]},{cN:\"meta\",b:\"^:.+?:\",e:\"\\\\s\",eE:!0,relevance:10},{cN:\"meta\",b:\"^\\\\[.+?\\\\]$\",relevance:0},{cN:\"quote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",relevance:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",relevance:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",relevance:0}],relevance:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"symbol\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",relevance:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",relevance:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",relevance:0}],relevance:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",relevance:0},{cN:\"string\",v:[{b:\"``.+?''\"},{b:\"`.+?'\"}]},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",relevance:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",relevance:0},{b:\"^'{3,}[ \\\\t]*$\",relevance:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:!0,c:[{b:\"(link|image:?):\",relevance:0},{cN:\"link\",b:\"\\\\w\",e:\"[^\\\\[]+\",relevance:0},{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:c,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})].concat(n),i:\"\\\\S\"},a={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(e){var t=\"([ui](8|16|32|64|128|size)|f(32|64))?\",r=\"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!\";return{aliases:[\"rs\"],k:{keyword:\"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield\",literal:\"true false Some None Ok Err\",built_in:r},l:e.IR+\"!?\",i:\"</\",c:[e.CLCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),e.inherit(e.QSM,{b:/b?\"/,i:null}),{cN:\"string\",v:[{b:/r(#*)\"(.|\\n)*?\"\\1(?!#)/},{b:/b?'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/}]},{cN:\"symbol\",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:\"number\",v:[{b:\"\\\\b0b([01_]+)\"+t},{b:\"\\\\b0o([0-7_]+)\"+t},{b:\"\\\\b0x([A-Fa-f0-9_]+)\"+t},{b:\"\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)\"+t}],relevance:0},{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",eE:!0,c:[e.UTM]},{cN:\"meta\",b:\"#\\\\!?\\\\[\",e:\"\\\\]\",c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{cN:\"class\",bK:\"type\",e:\";\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"\\\\S\"},{cN:\"class\",bK:\"trait enum struct union\",e:\"{\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"[\\\\w\\\\d]\"},{b:e.IR+\"::\",k:{built_in:r}},{b:\"->\"}]}});hljs.registerLanguage(\"awk\",function(e){return{k:{keyword:\"BEGIN END if else while do for in break continue delete next nextfile function func exit|10\"},c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},{cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage(\"java\",function(e){var a=\"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",t={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{b:/\\w+@/,relevance:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",relevance:0},{cN:\"function\",b:\"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\\\s*,\\\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"cs\",function(e){var a={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield\",literal:\"null false true\"},i={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},c={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},r=e.inherit(c,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:a},t=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,t]},l={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},b=e.inherit(l,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\",\"c#\"],k:a,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",relevance:0},{b:\"\\x3c!--|--\\x3e\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},o,i,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",relevance:0},{cN:\"function\",b:\"(\"+d+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/\\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"mathematica\",function(e){return{aliases:[\"mma\",\"wl\"],l:\"(\\\\$|\\\\b)\"+e.IR+\"\\\\b\",k:\"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID\",c:[e.C(\"\\\\(\\\\*\",\"\\\\*\\\\)\",{c:[\"self\"]}),e.QSM,e.CNM]}});hljs.registerLanguage(\"vim\",function(e){return{l:/[!#@\\w]+/,k:{keyword:\"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank\",built_in:\"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp\"},i:/;/,c:[e.NM,{cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\"},{cN:\"string\",b:/\"(\\\\\"|\\n\\\\|[^\"\\n])*\"/},e.C('\"',\"$\"),{cN:\"variable\",b:/[bwtglsav]:[\\w\\d_]*/},{cN:\"function\",bK:\"function function!\",e:\"$\",relevance:0,c:[e.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"symbol\",b:/<[\\w-]+>/}]}});hljs.registerLanguage(\"makefile\",function(e){var i={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,i]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[i]},n={b:\"^\"+e.UIR+\"\\\\s*(?=[:+?]?=)\"},t={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[i]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,i,r,a,n,{cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},t]}});hljs.registerLanguage(\"objectivec\",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:{keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},l:t,i:\"</\",c:[{cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]}]},{cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(e.QSM,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},{cN:\"class\",b:\"(\"+i.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:i,l:t,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,relevance:0}]}});hljs.registerLanguage(\"shell\",function(s){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[/\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}});hljs.registerLanguage(\"erlang\",function(e){var r=\"[a-z'][a-zA-Z0-9_']*\",c=\"(\"+r+\":\"+r+\"|\"+r+\")\",n={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor\",literal:\"false true\"},a=e.C(\"%\",\"$\"),b={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},i={b:\"fun\\\\s+\"+r+\"/\\\\d+\"},l={b:c+\"\\\\(\",e:\"\\\\)\",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:\"\\\\(\",e:\"\\\\)\",eW:!0,rE:!0,relevance:0}]},d={b:\"{\",e:\"}\",relevance:0},o={b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",relevance:0},t={b:\"[A-Z][a-zA-Z0-9_]*\",relevance:0},v={b:\"#\"+e.UIR,relevance:0,rB:!0,c:[{b:\"#\"+e.UIR,relevance:0},{b:\"{\",e:\"}\",relevance:0}]},f={bK:\"fun receive if try case\",e:\"end\",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:\"\"}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v.c[1].c=s};return{aliases:[\"erl\"],k:n,i:\"(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+r+\"\\\\s*\\\\(\",e:\"->\",rB:!0,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[u,e.inherit(e.TM,{b:r})],starts:{e:\";|\\\\.\",k:n,c:s}},a,{b:\"^-\",e:\"\\\\.\",relevance:0,eE:!0,rB:!0,l:\"-\"+e.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec\",c:[u]},b,e.QSM,v,o,t,d,{b:/\\.$/}]}});hljs.registerLanguage(\"powershell\",function(e){var t={keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\"},n={b:\"`[\\\\s\\\\S]\",relevance:0},c={cN:\"variable\",v:[{b:/\\$\\B/},{cN:\"keyword\",b:/\\$this/},{b:/\\$[\\w\\d][\\w\\d_:]*/}]},i={cN:\"string\",v:[{b:/\"/,e:/\"/},{b:/@\"/,e:/^\"@/}],c:[n,c,{cN:\"variable\",b:/\\$[A-z]/,e:/[^A-z]/}]},a={cN:\"string\",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:\"doctag\",v:[{b:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),o={cN:\"built_in\",v:[{b:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},l={cN:\"class\",bK:\"class enum\",e:/\\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:\"function\",b:/function\\s+/,e:/\\s*\\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:\"function\",relevance:0,cN:\"keyword\"},{cN:\"title\",b:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{b:/\\(/,e:/\\)/,cN:\"params\",relevance:0,c:[c]}]},p={b:/using\\s/,e:/$/,rB:!0,c:[i,a,{cN:\"keyword\",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:\"operator\",b:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{cN:\"literal\",b:/(-)[\\w\\d]+/,relevance:0}]},d={cN:\"function\",b:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,e:/$/,rB:!0,relevance:0,c:[{cN:\"keyword\",b:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:\"literal\",b:/\\$(null|true|false)\\b/},{cN:\"selector-tag\",b:/\\@\\B/,relevance:0}],m={b:/\\[/,e:/\\]/,eB:!0,eE:!0,relevance:0,c:[].concat(\"self\",u,{b:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",cN:\"built_in\",relevance:0},{cN:\"type\",b:/[\\.\\w\\d]+/,relevance:0})};return d.c.unshift(m),{aliases:[\"ps\",\"ps1\"],l:/-?[A-z\\.\\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage(\"typescript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise\"},n={cN:\"meta\",b:\"@\"+r},a={b:\"\\\\(\",e:/\\)/,k:t,c:[\"self\",e.QSM,e.ASM,e.NM]},c={cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},l={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},b={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:[\"ts\"],k:t,c:[{cN:\"meta\",b:/^\\s*['\"]use strict['\"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+e.IR+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:e.IR},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[\"self\",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/[\\{;]/,eE:!0,k:t,c:[\"self\",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:\"constructor\",e:/[\\{;]/,eE:!0,c:[\"self\",c]},{b:/module\\./,k:{built_in:\"module\"},relevance:0},{bK:\"module\",e:/\\{/,eE:!0},{bK:\"interface\",e:/\\{/,eE:!0,k:\"interface extends\"},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,relevance:0},n,a]}});hljs.registerLanguage(\"fortran\",function(e){return{cI:!0,aliases:[\"f90\",\"f95\"],k:{literal:\".False. .True.\",keyword:\"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data\",built_in:\"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image\"},i:/\\/\\*/,c:[e.inherit(e.ASM,{cN:\"string\",relevance:0}),e.inherit(e.QSM,{cN:\"string\",relevance:0}),{cN:\"function\",bK:\"subroutine function program\",i:\"[${=\\\\n]\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},e.C(\"!\",\"$\",{relevance:0}),{cN:\"number\",b:\"(?=\\\\b|\\\\+|\\\\-|\\\\.)(?=\\\\.\\\\d|\\\\d)(?:\\\\d+)?(?:\\\\.?\\\\d*)(?:[de][+-]?\\\\d+)?\\\\b\\\\.?\",relevance:0}]}});hljs.registerLanguage(\"php\",function(e){var c={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"meta\",b:/<\\?(php)?|\\?>/},t={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:[\"php\",\"php3\",\"php4\",\"php5\",\"php6\",\"php7\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[i]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},i,{cN:\"keyword\",b:/\\$this\\b/},c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,t,a]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},t,a]}});hljs.registerLanguage(\"haskell\",function(e){var i={v:[e.C(\"--\",\"$\"),e.C(\"{-\",\"-}\",{c:[\"self\"]})]},a={cN:\"meta\",b:\"{-#\",e:\"#-}\"},l={cN:\"meta\",b:\"^#\",e:\"$\"},c={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",relevance:0},n={b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[a,l,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},e.inherit(e.TM,{b:\"[_a-z][\\\\w']*\"}),i]};return{aliases:[\"hs\"],k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{bK:\"module\",e:\"where\",k:\"module where\",c:[n,i],i:\"\\\\W\\\\.|;\"},{b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import qualified as hiding\",c:[n,i],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[c,n,i]},{cN:\"class\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[a,c,n,{b:\"{\",e:\"}\",c:n.c},i]},{bK:\"default\",e:\"$\",c:[c,n,i]},{bK:\"infix infixl infixr\",e:\"$\",c:[e.CNM,i]},{b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[c,e.QSM,i]},{cN:\"meta\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:\"^[_a-z][\\\\w']*\"}),i,{b:\"->|<-\"}]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",relevance:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]{0,3}(?=\\\\W)\",relevance:0},{b:/\\/(?![ *]).*?(?![\\\\]).\\/[gim]{0,3}(?=\\W)/}]},{b:\"@\"+n},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",a={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(i)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:i.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+t,e:\"[-=]>\",rB:!0,c:[s,a]},{b:/[:\\(,=]\\s*/,relevance:0,c:[{cN:\"function\",b:t,e:\"[-=]>\",rB:!0,c:[a]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{b:n+\":\",e:\":\",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage(\"r\",function(e){var r=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[e.HCM,{b:r,l:r,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},relevance:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{b:\"`\",e:\"`\",relevance:0},{cN:\"string\",c:[e.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"autohotkey\",function(e){var a={b:\"`[\\\\s\\\\S]\"};return{cI:!0,aliases:[\"ahk\"],k:{keyword:\"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group\",literal:\"true false NOT AND OR\",built_in:\"ComSpec Clipboard ClipboardAll ErrorLevel\"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(\";\",\"$\",{relevance:0}),e.CBCM,{cN:\"number\",b:e.NR,relevance:0},{cN:\"variable\",b:\"%[a-zA-Z0-9#_$@]+%\"},{cN:\"built_in\",b:\"^\\\\s*\\\\w+\\\\s*(,|%)\"},{cN:\"title\",v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',relevance:0}]},{cN:\"meta\",b:\"^\\\\s*#\\\\w+\",e:\"$\",relevance:0},{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{b:\",\\\\s*,\"}]}});hljs.registerLanguage(\"elixir\",function(e){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*(\\\\!|\\\\?)?\",c=\"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0\",n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:b,k:c},r=\"[/|([{<\\\"']\",a={cN:\"string\",b:\"~[a-z](?=\"+r+\")\",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/</,e:/>/}]}]}]},i={cN:\"string\",b:\"~[A-Z](?=\"+r+\")\",c:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/\\</,e:/\\>/}]},l={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/'''/,e:/'''/},{b:/~S\"\"\"/,e:/\"\"\"/,c:[]},{b:/~S\"/,e:/\"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/\"/,e:/\"/}]},s={cN:\"function\",bK:\"def defp defmacro\",e:/\\B\\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:\"class\",bK:\"defimpl defmodule defprotocol defrecord\",e:/\\bdo\\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:\"::\"},{cN:\"symbol\",b:\":(?![\\\\s:])\",c:[l,{b:\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\"}],relevance:0},{cN:\"symbol\",b:b+\":(?!:)\",relevance:0},{cN:\"number\",b:\"(\\\\b0o[0-7_]+)|(\\\\b0b[01_]+)|(\\\\b0x[0-9a-fA-F_]+)|(-?\\\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)\",relevance:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"->\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[e.HCM,{cN:\"regexp\",i:\"\\\\n\",c:[e.BE,n],v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage(\"gradle\",function(e){return{cI:!0,k:{keyword:\"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine\"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage(\"css\",function(e){var c={b:/(?:[A-Z\\_\\.\\-]+|--[a-zA-Z0-9_-]+)\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\",c:[e.ASM,e.QSM]},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(page|font-face)\",l:\"@[a-z-]+\",k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",i:/:/,rB:!0,c:[{cN:\"keyword\",b:/@\\-?\\w[\\w]*(\\-\\w+)*/},{b:/\\s/,eW:!0,eE:!0,relevance:0,k:\"and or not only\",c:[{b:/[a-z-]+:/,cN:\"attribute\"},e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:\"[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,c]}]}});\n\nexports.hljs = hljs;\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/highlight/highlight.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/highlight/highlight.css": {
"text": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #F0F0F0;\n}\n\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n color: #444;\n}\n\n.hljs-comment {\n color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n font-weight: bold;\n}\n\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n color: #880000;\n font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n color: #BC6060;\n}\n\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n color: #78A960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n color: #397300;\n}\n\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n color: #1f7199;\n}\n\n.hljs-meta-string {\n color: #4d99bf;\n}\n\n\n/* Misc effects */\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/highlight/highlight.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/highlight/highlightblock.js": {
"title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TYPE_MAPPINGS_BASE = \"$:/config/HighlightPlugin/TypeMappings/\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \" \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0],\n\t\tlanguage = this.language,\n\t\ttiddler = this.wiki.getTiddler(TYPE_MAPPINGS_BASE + language);\n\tif(tiddler) {\n\t\tlanguage = tiddler.fields.text || \"\";\n\t}\n\tif(language && hljs.getLanguage(language)) {\n\t\tdomNode.className = language.toLowerCase() + \" hljs\";\n\t\tif($tw.browser && !domNode.isTiddlyWikiFakeDom) {\n\t\t\thljs.highlightBlock(domNode);\t\t\t\n\t\t} else {\n\t\t\tvar text = domNode.textContent;\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(language,text).value);\n\t\t\t// If we're using the fakedom then specially save the original raw text\n\t\t\tif(domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tdomNode.children[0].textInnerHTML = text;\n\t\t\t}\n\t\t}\n\t}\t\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/highlight/howto": {
"title": "$:/plugins/tiddlywiki/highlight/howto",
"text": "! Supporting Additional Languages\n \nThe [[highlight.js|https://github.com/highlightjs/highlight.js]] project supports many languages. Only a subset of these languages are supported by the plugin. It is possible for users to change the set of languages supported by the plugin by following these steps:\n \n# Go to the highlight.js project [[download page|https://highlightjs.org/download/]], select the language definitions to include, and press the Download button to download a zip archive containing customised support files for a highlight.js syntax highlighting server.\n# Locate the `highlight.pack.js` file in the highlight plugin -- on a stock Debian 8 system running Tiddlywiki5 under node-js it is located at `/usr/local/lib/node_modules/tiddlywiki/plugins/tiddlywiki/highlight/files/highlight.pack.js`.\n# Replace the plugin `highlight.pack.js` file located in step 2 with the one from the downloaded archive obtained in step 1.\n# Restart the Tiddlywiki server.\n"
},
"$:/plugins/tiddlywiki/highlight/license": {
"title": "$:/plugins/tiddlywiki/highlight/license",
"type": "text/plain",
"text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of highlight.js nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
"$:/plugins/tiddlywiki/highlight/readme": {
"title": "$:/plugins/tiddlywiki/highlight/readme",
"text": "This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1 { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* arduino\n* arm assembly\n* asciidoc\n* autohotkey\n* awk\n* bash\n* cmake\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* dockerfile\n* erlang\n* elixir\n* fortran\n* go\n* gradle\n* haskell\n* html\n* http\n* ini\n* intel x86 assembly\n* java\n* javascript\n* json\n* kotlin\n* less\n* lua\n* makefile\n* markdown\n* mathematica\n* matlab\n* nginx\n* objectivec\n* perl\n* php\n* plaintext\n* powershell\n* properties\n* python\n* R\n* ruby\n* rust\n* scss\n* shell session\n* sql\n* swift\n* toml\n* typescript\n* vala\n* vim script\n* xml\n* yaml\n\nYou can also specify the language as a MIME content type (eg `text/html` or `text/css`). The mapping is accomplished via mapping tiddlers whose titles start with `$:/config/HighlightPlugin/TypeMappings/`.\n"
},
"$:/plugins/tiddlywiki/highlight/styles": {
"title": "$:/plugins/tiddlywiki/highlight/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": ".hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8;-webkit-text-size-adjust:none}.hljs-comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:teal}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.scss .hljs-preprocessor{color:#900;font-weight:bold}.hljs-list .hljs-keyword,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rule .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.hljs-name{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}"
},
"$:/plugins/tiddlywiki/highlight/usage": {
"title": "$:/plugins/tiddlywiki/highlight/usage",
"text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/katex/katex.min.css": {
"text": ".katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:\"0.10.2\"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:\"\"}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left}\n",
"type": "text/plain",
"title": "$:/plugins/tiddlywiki/katex/katex.min.css"
},
"$:/plugins/tiddlywiki/katex/katex.min.js": {
"text": "(function(document) {\n!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.katex=e():t.katex=e()}(\"undefined\"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,\"a\",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p=\"\",r(r.s=1)}([function(t,e,r){},function(t,e,r){\"use strict\";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),o=function t(e,r){this.position=void 0;var a,n=\"KaTeX parse error: \"+e,o=r&&r.loc;if(o&&o.start<=o.end){var i=o.lexer.input;a=o.start;var s=o.end;a===i.length?n+=\" at end of input: \":n+=\" at position \"+(a+1)+\": \";var h=i.slice(a,s).replace(/[^]/g,\"$&\\u0332\");n+=(a>15?\"\\u2026\"+i.slice(a-15,a):i.slice(0,a))+h+(s+15<i.length?i.slice(s,s+15)+\"\\u2026\":i.slice(s))}var l=new Error(n);return l.name=\"ParseError\",l.__proto__=t.prototype,l.position=a,l};o.prototype.__proto__=Error.prototype;var i=o,s=/([A-Z])/g,h={\"&\":\"&\",\">\":\">\",\"<\":\"<\",'\"':\""\",\"'\":\"'\"},l=/[&><\"']/g;var m=function t(e){return\"ordgroup\"===e.type?1===e.body.length?t(e.body[0]):e:\"color\"===e.type?1===e.body.length?t(e.body[0]):e:\"font\"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(l,function(t){return h[t]})},hyphenate:function(t){return t.replace(s,\"-$1\").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return\"mathord\"===e.type||\"textord\"===e.type||\"atom\"===e.type}},u=function(){function t(t){this.displayMode=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.allowedProtocols=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,\"#cc0000\"),this.macros=t.macros||{},this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,\"warn\"),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3)),this.allowedProtocols=c.deflt(t.allowedProtocols,[\"http\",\"https\",\"mailto\",\"_relative\"])}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if(\"function\"==typeof a&&(a=a(t,e,r)),a&&\"ignore\"!==a){if(!0===a||\"error\"===a)throw new i(\"LaTeX-incompatible input and strict mode is set to 'error': \"+e+\" [\"+t+\"]\",r);\"warn\"===a?\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \"+e+\" [\"+t+\"]\"):\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to unrecognized '\"+a+\"': \"+e+\" [\"+t+\"]\")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if(\"function\"==typeof a)try{a=a(t,e,r)}catch(t){a=\"error\"}return!(!a||\"ignore\"===a)&&(!0===a||\"error\"===a||(\"warn\"===a?(\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \"+e+\" [\"+t+\"]\"),!1):(\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to unrecognized '\"+a+\"': \"+e+\" [\"+t+\"]\"),!1)))},t}(),d=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return p[f[this.id]]},e.sub=function(){return p[g[this.id]]},e.fracNum=function(){return p[x[this.id]]},e.fracDen=function(){return p[v[this.id]]},e.cramp=function(){return p[b[this.id]]},e.text=function(){return p[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),p=[new d(0,0,!1),new d(1,0,!0),new d(2,1,!1),new d(3,1,!0),new d(4,2,!1),new d(5,2,!0),new d(6,3,!1),new d(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},k=[{name:\"latin\",blocks:[[256,591],[768,879]]},{name:\"cyrillic\",blocks:[[1024,1279]]},{name:\"brahmic\",blocks:[[2304,4255]]},{name:\"georgian\",blocks:[[4256,4351]]},{name:\"cjk\",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:\"hangul\",blocks:[[44032,55215]]}];var S=[];function z(t){for(var e=0;e<S.length;e+=2)if(t>=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var M={path:{sqrtMain:\"M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\\ns-65,47,-65,47z M834 80H400000v40H845z\",sqrtSize1:\"M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,\\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\\ns76,-59,76,-59s76,-60,76,-60z M1001 80H40000v40H1012z\",sqrtSize2:\"M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\\nM1001 80H400000v40H1013z\",sqrtSize3:\"M424,2478c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M1001 80H400000v40H1014z\",sqrtSize4:\"M473,2793c339.3,-1799.3,509.3,-2700,510,-2702\\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\\nM1001 80H400000v40H1017z\",doubleleftarrow:\"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",doublerightarrow:\"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",leftarrow:\"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",leftbrace:\"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",leftbraceunder:\"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",leftgroup:\"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",leftgroupunder:\"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",leftharpoon:\"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",leftharpoonplus:\"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",leftharpoondown:\"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",leftharpoondownplus:\"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",lefthook:\"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",leftlinesegment:\"M40 281 V428 H0 V94 H40 V241 H400000 v40z\\nM40 281 V428 H0 V94 H40 V241 H400000 v40z\",leftmapsto:\"M40 281 V448H0V74H40V241H400000v40z\\nM40 281 V448H0V74H40V241H400000v40z\",leftToFrom:\"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",longequal:\"M0 50 h400000 v40H0z m0 194h40000v40H0z\\nM0 50 h400000 v40H0z m0 194h40000v40H0z\",midbrace:\"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",midbraceunder:\"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",oiintSize1:\"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",oiintSize2:\"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",oiiintSize1:\"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",oiiintSize2:\"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",rightarrow:\"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",rightbrace:\"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",rightbraceunder:\"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",rightgroup:\"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",rightgroupunder:\"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",rightharpoon:\"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",rightharpoonplus:\"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",rightharpoondown:\"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",rightharpoondownplus:\"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",righthook:\"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",rightlinesegment:\"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z\",rightToFrom:\"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",twoheadleftarrow:\"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",twoheadrightarrow:\"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",tilde1:\"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",tilde2:\"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",tilde3:\"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",tilde4:\"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",vec:\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",widehat1:\"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",widehat2:\"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",widehat3:\"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",widehat4:\"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",widecheck1:\"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",widecheck2:\"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",widecheck3:\"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",widecheck4:\"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",baraboveleftarrow:\"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",rightarrowabovebar:\"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",baraboveshortleftharpoon:\"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",rightharpoonaboveshortbar:\"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",shortbaraboveleftharpoon:\"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",shortrightharpoonabovebar:\"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"}},T=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e<this.children.length;e++)t.appendChild(this.children[e].toNode());return t},e.toMarkup=function(){for(var t=\"\",e=0;e<this.children.length;e++)t+=this.children[e].toMarkup();return t},e.toText=function(){var t=function(t){return t.toText()};return this.children.map(t).join(\"\")},t}(),A=function(t){return t.filter(function(t){return t}).join(\" \")},B=function(t,e,r){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},e){e.style.isTight()&&this.classes.push(\"mtight\");var a=e.getColor();a&&(this.style.color=a)}},q=function(t){var e=document.createElement(t);for(var r in e.className=A(this.classes),this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&e.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)e.appendChild(this.children[n].toNode());return e},C=function(t){var e=\"<\"+t;this.classes.length&&(e+=' class=\"'+c.escape(A(this.classes))+'\"');var r=\"\";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+\":\"+this.style[a]+\";\");for(var n in r&&(e+=' style=\"'+c.escape(r)+'\"'),this.attributes)this.attributes.hasOwnProperty(n)&&(e+=\" \"+n+'=\"'+c.escape(this.attributes[n])+'\"');e+=\">\";for(var o=0;o<this.children.length;o++)e+=this.children[o].toMarkup();return e+=\"</\"+t+\">\"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,\"span\")},e.toMarkup=function(){return C.call(this,\"span\")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute(\"href\",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,\"a\")},e.toMarkup=function(){return C.call(this,\"a\")},t}(),O={\"\\xee\":\"\\u0131\\u0302\",\"\\xef\":\"\\u0131\\u0308\",\"\\xed\":\"\\u0131\\u0301\",\"\\xec\":\"\\u0131\\u0300\"},E=function(){function t(t,e,r,a,n,o,i,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=t,this.height=e||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=o||0,this.classes=i||[],this.style=s||{},this.maxFontSize=0;var h=function(t){for(var e=0;e<k.length;e++)for(var r=k[e],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(t>=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));h&&this.classes.push(h+\"_fallback\"),/[\\xee\\xef\\xed\\xec]/.test(this.text)&&(this.text=O[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement(\"span\")).style.marginRight=this.italic+\"em\"),this.classes.length>0&&((e=e||document.createElement(\"span\")).className=A(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement(\"span\")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e=\"<span\";this.classes.length&&(t=!0,e+=' class=\"',e+=c.escape(A(this.classes)),e+='\"');var r=\"\";for(var a in this.italic>0&&(r+=\"margin-right:\"+this.italic+\"em;\"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+\":\"+this.style[a]+\";\");r&&(t=!0,e+=' style=\"'+c.escape(r)+'\"');var n=c.escape(this.text);return t?(e+=\">\",e+=n,e+=\"</span>\"):n},t}(),R=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t=\"<svg\";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=\" \"+e+\"='\"+this.attributes[e]+\"'\");t+=\">\";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+=\"</svg>\"},t}(),L=function(){function t(t,e){this.pathName=void 0,this.alternate=void 0,this.pathName=t,this.alternate=e}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");return this.alternate?t.setAttribute(\"d\",this.alternate):t.setAttribute(\"d\",M.path[this.pathName]),t},e.toMarkup=function(){return this.alternate?\"<path d='\"+this.alternate+\"'/>\":\"<path d='\"+M.path[this.pathName]+\"'/>\"},t}(),H=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t=\"<line\";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=\" \"+e+\"='\"+this.attributes[e]+\"'\");return t+=\"/>\"},t}();var P={\"AMS-Regular\":{65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},\"Caligraphic-Regular\":{48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473]},\"Fraktur-Regular\":{33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},\"Main-Bold\":{33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},\"Main-BoldItalic\":{33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],163:[0,.69444,0,0,.86853],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},\"Main-Italic\":{33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],163:[0,.69444,0,0,.76909],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],305:[0,.43056,0,.02778,.32246],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],567:[.19444,.43056,0,.08334,.38403],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},\"Main-Regular\":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},\"Math-BoldItalic\":{65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333]},\"Math-Italic\":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},\"Math-Regular\":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},\"SansSerif-Bold\":{33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},\"SansSerif-Italic\":{33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},\"SansSerif-Regular\":{33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},\"Script-Regular\":{65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212]},\"Size1-Regular\":{40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},\"Size2-Regular\":{40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},\"Size3-Regular\":{40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},\"Size4-Regular\":{40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},\"Typewriter-Regular\":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},D={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2]},F={\"\\xc5\":\"A\",\"\\xc7\":\"C\",\"\\xd0\":\"D\",\"\\xde\":\"o\",\"\\xe5\":\"a\",\"\\xe7\":\"c\",\"\\xf0\":\"d\",\"\\xfe\":\"o\",\"\\u0410\":\"A\",\"\\u0411\":\"B\",\"\\u0412\":\"B\",\"\\u0413\":\"F\",\"\\u0414\":\"A\",\"\\u0415\":\"E\",\"\\u0416\":\"K\",\"\\u0417\":\"3\",\"\\u0418\":\"N\",\"\\u0419\":\"N\",\"\\u041a\":\"K\",\"\\u041b\":\"N\",\"\\u041c\":\"M\",\"\\u041d\":\"H\",\"\\u041e\":\"O\",\"\\u041f\":\"N\",\"\\u0420\":\"P\",\"\\u0421\":\"C\",\"\\u0422\":\"T\",\"\\u0423\":\"y\",\"\\u0424\":\"O\",\"\\u0425\":\"X\",\"\\u0426\":\"U\",\"\\u0427\":\"h\",\"\\u0428\":\"W\",\"\\u0429\":\"W\",\"\\u042a\":\"B\",\"\\u042b\":\"X\",\"\\u042c\":\"B\",\"\\u042d\":\"3\",\"\\u042e\":\"X\",\"\\u042f\":\"R\",\"\\u0430\":\"a\",\"\\u0431\":\"b\",\"\\u0432\":\"a\",\"\\u0433\":\"r\",\"\\u0434\":\"y\",\"\\u0435\":\"e\",\"\\u0436\":\"m\",\"\\u0437\":\"e\",\"\\u0438\":\"n\",\"\\u0439\":\"n\",\"\\u043a\":\"n\",\"\\u043b\":\"n\",\"\\u043c\":\"m\",\"\\u043d\":\"n\",\"\\u043e\":\"o\",\"\\u043f\":\"n\",\"\\u0440\":\"p\",\"\\u0441\":\"c\",\"\\u0442\":\"o\",\"\\u0443\":\"y\",\"\\u0444\":\"b\",\"\\u0445\":\"x\",\"\\u0446\":\"n\",\"\\u0447\":\"n\",\"\\u0448\":\"w\",\"\\u0449\":\"w\",\"\\u044a\":\"a\",\"\\u044b\":\"m\",\"\\u044c\":\"a\",\"\\u044d\":\"e\",\"\\u044e\":\"m\",\"\\u044f\":\"r\"};function V(t,e,r){if(!P[e])throw new Error(\"Font metrics not found for font: \"+e+\".\");var a=t.charCodeAt(0),n=P[e][a];if(!n&&t[0]in F&&(a=F[t[0]].charCodeAt(0),n=P[e][a]),n||\"text\"!==r||z(a)&&(n=P[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var U={};var G={bin:1,close:1,inner:1,open:1,punct:1,rel:1},X={\"accent-token\":1,mathord:1,\"op-token\":1,spacing:1,textord:1},Y={math:{},text:{}},_=Y;function W(t,e,r,a,n,o){Y[t][n]={font:e,group:r,replace:a},o&&a&&(Y[t][a]=Y[t][n])}var j=\"main\",$=\"ams\",Z=\"bin\",K=\"mathord\",J=\"op-token\",Q=\"rel\";W(\"math\",j,Q,\"\\u2261\",\"\\\\equiv\",!0),W(\"math\",j,Q,\"\\u227a\",\"\\\\prec\",!0),W(\"math\",j,Q,\"\\u227b\",\"\\\\succ\",!0),W(\"math\",j,Q,\"\\u223c\",\"\\\\sim\",!0),W(\"math\",j,Q,\"\\u22a5\",\"\\\\perp\"),W(\"math\",j,Q,\"\\u2aaf\",\"\\\\preceq\",!0),W(\"math\",j,Q,\"\\u2ab0\",\"\\\\succeq\",!0),W(\"math\",j,Q,\"\\u2243\",\"\\\\simeq\",!0),W(\"math\",j,Q,\"\\u2223\",\"\\\\mid\",!0),W(\"math\",j,Q,\"\\u226a\",\"\\\\ll\",!0),W(\"math\",j,Q,\"\\u226b\",\"\\\\gg\",!0),W(\"math\",j,Q,\"\\u224d\",\"\\\\asymp\",!0),W(\"math\",j,Q,\"\\u2225\",\"\\\\parallel\"),W(\"math\",j,Q,\"\\u22c8\",\"\\\\bowtie\",!0),W(\"math\",j,Q,\"\\u2323\",\"\\\\smile\",!0),W(\"math\",j,Q,\"\\u2291\",\"\\\\sqsubseteq\",!0),W(\"math\",j,Q,\"\\u2292\",\"\\\\sqsupseteq\",!0),W(\"math\",j,Q,\"\\u2250\",\"\\\\doteq\",!0),W(\"math\",j,Q,\"\\u2322\",\"\\\\frown\",!0),W(\"math\",j,Q,\"\\u220b\",\"\\\\ni\",!0),W(\"math\",j,Q,\"\\u221d\",\"\\\\propto\",!0),W(\"math\",j,Q,\"\\u22a2\",\"\\\\vdash\",!0),W(\"math\",j,Q,\"\\u22a3\",\"\\\\dashv\",!0),W(\"math\",j,Q,\"\\u220b\",\"\\\\owns\"),W(\"math\",j,\"punct\",\".\",\"\\\\ldotp\"),W(\"math\",j,\"punct\",\"\\u22c5\",\"\\\\cdotp\"),W(\"math\",j,\"textord\",\"#\",\"\\\\#\"),W(\"text\",j,\"textord\",\"#\",\"\\\\#\"),W(\"math\",j,\"textord\",\"&\",\"\\\\&\"),W(\"text\",j,\"textord\",\"&\",\"\\\\&\"),W(\"math\",j,\"textord\",\"\\u2135\",\"\\\\aleph\",!0),W(\"math\",j,\"textord\",\"\\u2200\",\"\\\\forall\",!0),W(\"math\",j,\"textord\",\"\\u210f\",\"\\\\hbar\",!0),W(\"math\",j,\"textord\",\"\\u2203\",\"\\\\exists\",!0),W(\"math\",j,\"textord\",\"\\u2207\",\"\\\\nabla\",!0),W(\"math\",j,\"textord\",\"\\u266d\",\"\\\\flat\",!0),W(\"math\",j,\"textord\",\"\\u2113\",\"\\\\ell\",!0),W(\"math\",j,\"textord\",\"\\u266e\",\"\\\\natural\",!0),W(\"math\",j,\"textord\",\"\\u2663\",\"\\\\clubsuit\",!0),W(\"math\",j,\"textord\",\"\\u2118\",\"\\\\wp\",!0),W(\"math\",j,\"textord\",\"\\u266f\",\"\\\\sharp\",!0),W(\"math\",j,\"textord\",\"\\u2662\",\"\\\\diamondsuit\",!0),W(\"math\",j,\"textord\",\"\\u211c\",\"\\\\Re\",!0),W(\"math\",j,\"textord\",\"\\u2661\",\"\\\\heartsuit\",!0),W(\"math\",j,\"textord\",\"\\u2111\",\"\\\\Im\",!0),W(\"math\",j,\"textord\",\"\\u2660\",\"\\\\spadesuit\",!0),W(\"text\",j,\"textord\",\"\\xa7\",\"\\\\S\",!0),W(\"text\",j,\"textord\",\"\\xb6\",\"\\\\P\",!0),W(\"math\",j,\"textord\",\"\\u2020\",\"\\\\dag\"),W(\"text\",j,\"textord\",\"\\u2020\",\"\\\\dag\"),W(\"text\",j,\"textord\",\"\\u2020\",\"\\\\textdagger\"),W(\"math\",j,\"textord\",\"\\u2021\",\"\\\\ddag\"),W(\"text\",j,\"textord\",\"\\u2021\",\"\\\\ddag\"),W(\"text\",j,\"textord\",\"\\u2021\",\"\\\\textdaggerdbl\"),W(\"math\",j,\"close\",\"\\u23b1\",\"\\\\rmoustache\",!0),W(\"math\",j,\"open\",\"\\u23b0\",\"\\\\lmoustache\",!0),W(\"math\",j,\"close\",\"\\u27ef\",\"\\\\rgroup\",!0),W(\"math\",j,\"open\",\"\\u27ee\",\"\\\\lgroup\",!0),W(\"math\",j,Z,\"\\u2213\",\"\\\\mp\",!0),W(\"math\",j,Z,\"\\u2296\",\"\\\\ominus\",!0),W(\"math\",j,Z,\"\\u228e\",\"\\\\uplus\",!0),W(\"math\",j,Z,\"\\u2293\",\"\\\\sqcap\",!0),W(\"math\",j,Z,\"\\u2217\",\"\\\\ast\"),W(\"math\",j,Z,\"\\u2294\",\"\\\\sqcup\",!0),W(\"math\",j,Z,\"\\u25ef\",\"\\\\bigcirc\"),W(\"math\",j,Z,\"\\u2219\",\"\\\\bullet\"),W(\"math\",j,Z,\"\\u2021\",\"\\\\ddagger\"),W(\"math\",j,Z,\"\\u2240\",\"\\\\wr\",!0),W(\"math\",j,Z,\"\\u2a3f\",\"\\\\amalg\"),W(\"math\",j,Z,\"&\",\"\\\\And\"),W(\"math\",j,Q,\"\\u27f5\",\"\\\\longleftarrow\",!0),W(\"math\",j,Q,\"\\u21d0\",\"\\\\Leftarrow\",!0),W(\"math\",j,Q,\"\\u27f8\",\"\\\\Longleftarrow\",!0),W(\"math\",j,Q,\"\\u27f6\",\"\\\\longrightarrow\",!0),W(\"math\",j,Q,\"\\u21d2\",\"\\\\Rightarrow\",!0),W(\"math\",j,Q,\"\\u27f9\",\"\\\\Longrightarrow\",!0),W(\"math\",j,Q,\"\\u2194\",\"\\\\leftrightarrow\",!0),W(\"math\",j,Q,\"\\u27f7\",\"\\\\longleftrightarrow\",!0),W(\"math\",j,Q,\"\\u21d4\",\"\\\\Leftrightarrow\",!0),W(\"math\",j,Q,\"\\u27fa\",\"\\\\Longleftrightarrow\",!0),W(\"math\",j,Q,\"\\u21a6\",\"\\\\mapsto\",!0),W(\"math\",j,Q,\"\\u27fc\",\"\\\\longmapsto\",!0),W(\"math\",j,Q,\"\\u2197\",\"\\\\nearrow\",!0),W(\"math\",j,Q,\"\\u21a9\",\"\\\\hookleftarrow\",!0),W(\"math\",j,Q,\"\\u21aa\",\"\\\\hookrightarrow\",!0),W(\"math\",j,Q,\"\\u2198\",\"\\\\searrow\",!0),W(\"math\",j,Q,\"\\u21bc\",\"\\\\leftharpoonup\",!0),W(\"math\",j,Q,\"\\u21c0\",\"\\\\rightharpoonup\",!0),W(\"math\",j,Q,\"\\u2199\",\"\\\\swarrow\",!0),W(\"math\",j,Q,\"\\u21bd\",\"\\\\leftharpoondown\",!0),W(\"math\",j,Q,\"\\u21c1\",\"\\\\rightharpoondown\",!0),W(\"math\",j,Q,\"\\u2196\",\"\\\\nwarrow\",!0),W(\"math\",j,Q,\"\\u21cc\",\"\\\\rightleftharpoons\",!0),W(\"math\",$,Q,\"\\u226e\",\"\\\\nless\",!0),W(\"math\",$,Q,\"\\ue010\",\"\\\\@nleqslant\"),W(\"math\",$,Q,\"\\ue011\",\"\\\\@nleqq\"),W(\"math\",$,Q,\"\\u2a87\",\"\\\\lneq\",!0),W(\"math\",$,Q,\"\\u2268\",\"\\\\lneqq\",!0),W(\"math\",$,Q,\"\\ue00c\",\"\\\\@lvertneqq\"),W(\"math\",$,Q,\"\\u22e6\",\"\\\\lnsim\",!0),W(\"math\",$,Q,\"\\u2a89\",\"\\\\lnapprox\",!0),W(\"math\",$,Q,\"\\u2280\",\"\\\\nprec\",!0),W(\"math\",$,Q,\"\\u22e0\",\"\\\\npreceq\",!0),W(\"math\",$,Q,\"\\u22e8\",\"\\\\precnsim\",!0),W(\"math\",$,Q,\"\\u2ab9\",\"\\\\precnapprox\",!0),W(\"math\",$,Q,\"\\u2241\",\"\\\\nsim\",!0),W(\"math\",$,Q,\"\\ue006\",\"\\\\@nshortmid\"),W(\"math\",$,Q,\"\\u2224\",\"\\\\nmid\",!0),W(\"math\",$,Q,\"\\u22ac\",\"\\\\nvdash\",!0),W(\"math\",$,Q,\"\\u22ad\",\"\\\\nvDash\",!0),W(\"math\",$,Q,\"\\u22ea\",\"\\\\ntriangleleft\"),W(\"math\",$,Q,\"\\u22ec\",\"\\\\ntrianglelefteq\",!0),W(\"math\",$,Q,\"\\u228a\",\"\\\\subsetneq\",!0),W(\"math\",$,Q,\"\\ue01a\",\"\\\\@varsubsetneq\"),W(\"math\",$,Q,\"\\u2acb\",\"\\\\subsetneqq\",!0),W(\"math\",$,Q,\"\\ue017\",\"\\\\@varsubsetneqq\"),W(\"math\",$,Q,\"\\u226f\",\"\\\\ngtr\",!0),W(\"math\",$,Q,\"\\ue00f\",\"\\\\@ngeqslant\"),W(\"math\",$,Q,\"\\ue00e\",\"\\\\@ngeqq\"),W(\"math\",$,Q,\"\\u2a88\",\"\\\\gneq\",!0),W(\"math\",$,Q,\"\\u2269\",\"\\\\gneqq\",!0),W(\"math\",$,Q,\"\\ue00d\",\"\\\\@gvertneqq\"),W(\"math\",$,Q,\"\\u22e7\",\"\\\\gnsim\",!0),W(\"math\",$,Q,\"\\u2a8a\",\"\\\\gnapprox\",!0),W(\"math\",$,Q,\"\\u2281\",\"\\\\nsucc\",!0),W(\"math\",$,Q,\"\\u22e1\",\"\\\\nsucceq\",!0),W(\"math\",$,Q,\"\\u22e9\",\"\\\\succnsim\",!0),W(\"math\",$,Q,\"\\u2aba\",\"\\\\succnapprox\",!0),W(\"math\",$,Q,\"\\u2246\",\"\\\\ncong\",!0),W(\"math\",$,Q,\"\\ue007\",\"\\\\@nshortparallel\"),W(\"math\",$,Q,\"\\u2226\",\"\\\\nparallel\",!0),W(\"math\",$,Q,\"\\u22af\",\"\\\\nVDash\",!0),W(\"math\",$,Q,\"\\u22eb\",\"\\\\ntriangleright\"),W(\"math\",$,Q,\"\\u22ed\",\"\\\\ntrianglerighteq\",!0),W(\"math\",$,Q,\"\\ue018\",\"\\\\@nsupseteqq\"),W(\"math\",$,Q,\"\\u228b\",\"\\\\supsetneq\",!0),W(\"math\",$,Q,\"\\ue01b\",\"\\\\@varsupsetneq\"),W(\"math\",$,Q,\"\\u2acc\",\"\\\\supsetneqq\",!0),W(\"math\",$,Q,\"\\ue019\",\"\\\\@varsupsetneqq\"),W(\"math\",$,Q,\"\\u22ae\",\"\\\\nVdash\",!0),W(\"math\",$,Q,\"\\u2ab5\",\"\\\\precneqq\",!0),W(\"math\",$,Q,\"\\u2ab6\",\"\\\\succneqq\",!0),W(\"math\",$,Q,\"\\ue016\",\"\\\\@nsubseteqq\"),W(\"math\",$,Z,\"\\u22b4\",\"\\\\unlhd\"),W(\"math\",$,Z,\"\\u22b5\",\"\\\\unrhd\"),W(\"math\",$,Q,\"\\u219a\",\"\\\\nleftarrow\",!0),W(\"math\",$,Q,\"\\u219b\",\"\\\\nrightarrow\",!0),W(\"math\",$,Q,\"\\u21cd\",\"\\\\nLeftarrow\",!0),W(\"math\",$,Q,\"\\u21cf\",\"\\\\nRightarrow\",!0),W(\"math\",$,Q,\"\\u21ae\",\"\\\\nleftrightarrow\",!0),W(\"math\",$,Q,\"\\u21ce\",\"\\\\nLeftrightarrow\",!0),W(\"math\",$,Q,\"\\u25b3\",\"\\\\vartriangle\"),W(\"math\",$,\"textord\",\"\\u210f\",\"\\\\hslash\"),W(\"math\",$,\"textord\",\"\\u25bd\",\"\\\\triangledown\"),W(\"math\",$,\"textord\",\"\\u25ca\",\"\\\\lozenge\"),W(\"math\",$,\"textord\",\"\\u24c8\",\"\\\\circledS\"),W(\"math\",$,\"textord\",\"\\xae\",\"\\\\circledR\"),W(\"text\",$,\"textord\",\"\\xae\",\"\\\\circledR\"),W(\"math\",$,\"textord\",\"\\u2221\",\"\\\\measuredangle\",!0),W(\"math\",$,\"textord\",\"\\u2204\",\"\\\\nexists\"),W(\"math\",$,\"textord\",\"\\u2127\",\"\\\\mho\"),W(\"math\",$,\"textord\",\"\\u2132\",\"\\\\Finv\",!0),W(\"math\",$,\"textord\",\"\\u2141\",\"\\\\Game\",!0),W(\"math\",$,\"textord\",\"\\u2035\",\"\\\\backprime\"),W(\"math\",$,\"textord\",\"\\u25b2\",\"\\\\blacktriangle\"),W(\"math\",$,\"textord\",\"\\u25bc\",\"\\\\blacktriangledown\"),W(\"math\",$,\"textord\",\"\\u25a0\",\"\\\\blacksquare\"),W(\"math\",$,\"textord\",\"\\u29eb\",\"\\\\blacklozenge\"),W(\"math\",$,\"textord\",\"\\u2605\",\"\\\\bigstar\"),W(\"math\",$,\"textord\",\"\\u2222\",\"\\\\sphericalangle\",!0),W(\"math\",$,\"textord\",\"\\u2201\",\"\\\\complement\",!0),W(\"math\",$,\"textord\",\"\\xf0\",\"\\\\eth\",!0),W(\"math\",$,\"textord\",\"\\u2571\",\"\\\\diagup\"),W(\"math\",$,\"textord\",\"\\u2572\",\"\\\\diagdown\"),W(\"math\",$,\"textord\",\"\\u25a1\",\"\\\\square\"),W(\"math\",$,\"textord\",\"\\u25a1\",\"\\\\Box\"),W(\"math\",$,\"textord\",\"\\u25ca\",\"\\\\Diamond\"),W(\"math\",$,\"textord\",\"\\xa5\",\"\\\\yen\",!0),W(\"text\",$,\"textord\",\"\\xa5\",\"\\\\yen\",!0),W(\"math\",$,\"textord\",\"\\u2713\",\"\\\\checkmark\",!0),W(\"text\",$,\"textord\",\"\\u2713\",\"\\\\checkmark\"),W(\"math\",$,\"textord\",\"\\u2136\",\"\\\\beth\",!0),W(\"math\",$,\"textord\",\"\\u2138\",\"\\\\daleth\",!0),W(\"math\",$,\"textord\",\"\\u2137\",\"\\\\gimel\",!0),W(\"math\",$,\"textord\",\"\\u03dd\",\"\\\\digamma\"),W(\"math\",$,\"textord\",\"\\u03f0\",\"\\\\varkappa\"),W(\"math\",$,\"open\",\"\\u250c\",\"\\\\ulcorner\",!0),W(\"math\",$,\"close\",\"\\u2510\",\"\\\\urcorner\",!0),W(\"math\",$,\"open\",\"\\u2514\",\"\\\\llcorner\",!0),W(\"math\",$,\"close\",\"\\u2518\",\"\\\\lrcorner\",!0),W(\"math\",$,Q,\"\\u2266\",\"\\\\leqq\",!0),W(\"math\",$,Q,\"\\u2a7d\",\"\\\\leqslant\",!0),W(\"math\",$,Q,\"\\u2a95\",\"\\\\eqslantless\",!0),W(\"math\",$,Q,\"\\u2272\",\"\\\\lesssim\",!0),W(\"math\",$,Q,\"\\u2a85\",\"\\\\lessapprox\",!0),W(\"math\",$,Q,\"\\u224a\",\"\\\\approxeq\",!0),W(\"math\",$,Z,\"\\u22d6\",\"\\\\lessdot\"),W(\"math\",$,Q,\"\\u22d8\",\"\\\\lll\",!0),W(\"math\",$,Q,\"\\u2276\",\"\\\\lessgtr\",!0),W(\"math\",$,Q,\"\\u22da\",\"\\\\lesseqgtr\",!0),W(\"math\",$,Q,\"\\u2a8b\",\"\\\\lesseqqgtr\",!0),W(\"math\",$,Q,\"\\u2251\",\"\\\\doteqdot\"),W(\"math\",$,Q,\"\\u2253\",\"\\\\risingdotseq\",!0),W(\"math\",$,Q,\"\\u2252\",\"\\\\fallingdotseq\",!0),W(\"math\",$,Q,\"\\u223d\",\"\\\\backsim\",!0),W(\"math\",$,Q,\"\\u22cd\",\"\\\\backsimeq\",!0),W(\"math\",$,Q,\"\\u2ac5\",\"\\\\subseteqq\",!0),W(\"math\",$,Q,\"\\u22d0\",\"\\\\Subset\",!0),W(\"math\",$,Q,\"\\u228f\",\"\\\\sqsubset\",!0),W(\"math\",$,Q,\"\\u227c\",\"\\\\preccurlyeq\",!0),W(\"math\",$,Q,\"\\u22de\",\"\\\\curlyeqprec\",!0),W(\"math\",$,Q,\"\\u227e\",\"\\\\precsim\",!0),W(\"math\",$,Q,\"\\u2ab7\",\"\\\\precapprox\",!0),W(\"math\",$,Q,\"\\u22b2\",\"\\\\vartriangleleft\"),W(\"math\",$,Q,\"\\u22b4\",\"\\\\trianglelefteq\"),W(\"math\",$,Q,\"\\u22a8\",\"\\\\vDash\",!0),W(\"math\",$,Q,\"\\u22aa\",\"\\\\Vvdash\",!0),W(\"math\",$,Q,\"\\u2323\",\"\\\\smallsmile\"),W(\"math\",$,Q,\"\\u2322\",\"\\\\smallfrown\"),W(\"math\",$,Q,\"\\u224f\",\"\\\\bumpeq\",!0),W(\"math\",$,Q,\"\\u224e\",\"\\\\Bumpeq\",!0),W(\"math\",$,Q,\"\\u2267\",\"\\\\geqq\",!0),W(\"math\",$,Q,\"\\u2a7e\",\"\\\\geqslant\",!0),W(\"math\",$,Q,\"\\u2a96\",\"\\\\eqslantgtr\",!0),W(\"math\",$,Q,\"\\u2273\",\"\\\\gtrsim\",!0),W(\"math\",$,Q,\"\\u2a86\",\"\\\\gtrapprox\",!0),W(\"math\",$,Z,\"\\u22d7\",\"\\\\gtrdot\"),W(\"math\",$,Q,\"\\u22d9\",\"\\\\ggg\",!0),W(\"math\",$,Q,\"\\u2277\",\"\\\\gtrless\",!0),W(\"math\",$,Q,\"\\u22db\",\"\\\\gtreqless\",!0),W(\"math\",$,Q,\"\\u2a8c\",\"\\\\gtreqqless\",!0),W(\"math\",$,Q,\"\\u2256\",\"\\\\eqcirc\",!0),W(\"math\",$,Q,\"\\u2257\",\"\\\\circeq\",!0),W(\"math\",$,Q,\"\\u225c\",\"\\\\triangleq\",!0),W(\"math\",$,Q,\"\\u223c\",\"\\\\thicksim\"),W(\"math\",$,Q,\"\\u2248\",\"\\\\thickapprox\"),W(\"math\",$,Q,\"\\u2ac6\",\"\\\\supseteqq\",!0),W(\"math\",$,Q,\"\\u22d1\",\"\\\\Supset\",!0),W(\"math\",$,Q,\"\\u2290\",\"\\\\sqsupset\",!0),W(\"math\",$,Q,\"\\u227d\",\"\\\\succcurlyeq\",!0),W(\"math\",$,Q,\"\\u22df\",\"\\\\curlyeqsucc\",!0),W(\"math\",$,Q,\"\\u227f\",\"\\\\succsim\",!0),W(\"math\",$,Q,\"\\u2ab8\",\"\\\\succapprox\",!0),W(\"math\",$,Q,\"\\u22b3\",\"\\\\vartriangleright\"),W(\"math\",$,Q,\"\\u22b5\",\"\\\\trianglerighteq\"),W(\"math\",$,Q,\"\\u22a9\",\"\\\\Vdash\",!0),W(\"math\",$,Q,\"\\u2223\",\"\\\\shortmid\"),W(\"math\",$,Q,\"\\u2225\",\"\\\\shortparallel\"),W(\"math\",$,Q,\"\\u226c\",\"\\\\between\",!0),W(\"math\",$,Q,\"\\u22d4\",\"\\\\pitchfork\",!0),W(\"math\",$,Q,\"\\u221d\",\"\\\\varpropto\"),W(\"math\",$,Q,\"\\u25c0\",\"\\\\blacktriangleleft\"),W(\"math\",$,Q,\"\\u2234\",\"\\\\therefore\",!0),W(\"math\",$,Q,\"\\u220d\",\"\\\\backepsilon\"),W(\"math\",$,Q,\"\\u25b6\",\"\\\\blacktriangleright\"),W(\"math\",$,Q,\"\\u2235\",\"\\\\because\",!0),W(\"math\",$,Q,\"\\u22d8\",\"\\\\llless\"),W(\"math\",$,Q,\"\\u22d9\",\"\\\\gggtr\"),W(\"math\",$,Z,\"\\u22b2\",\"\\\\lhd\"),W(\"math\",$,Z,\"\\u22b3\",\"\\\\rhd\"),W(\"math\",$,Q,\"\\u2242\",\"\\\\eqsim\",!0),W(\"math\",j,Q,\"\\u22c8\",\"\\\\Join\"),W(\"math\",$,Q,\"\\u2251\",\"\\\\Doteq\",!0),W(\"math\",$,Z,\"\\u2214\",\"\\\\dotplus\",!0),W(\"math\",$,Z,\"\\u2216\",\"\\\\smallsetminus\"),W(\"math\",$,Z,\"\\u22d2\",\"\\\\Cap\",!0),W(\"math\",$,Z,\"\\u22d3\",\"\\\\Cup\",!0),W(\"math\",$,Z,\"\\u2a5e\",\"\\\\doublebarwedge\",!0),W(\"math\",$,Z,\"\\u229f\",\"\\\\boxminus\",!0),W(\"math\",$,Z,\"\\u229e\",\"\\\\boxplus\",!0),W(\"math\",$,Z,\"\\u22c7\",\"\\\\divideontimes\",!0),W(\"math\",$,Z,\"\\u22c9\",\"\\\\ltimes\",!0),W(\"math\",$,Z,\"\\u22ca\",\"\\\\rtimes\",!0),W(\"math\",$,Z,\"\\u22cb\",\"\\\\leftthreetimes\",!0),W(\"math\",$,Z,\"\\u22cc\",\"\\\\rightthreetimes\",!0),W(\"math\",$,Z,\"\\u22cf\",\"\\\\curlywedge\",!0),W(\"math\",$,Z,\"\\u22ce\",\"\\\\curlyvee\",!0),W(\"math\",$,Z,\"\\u229d\",\"\\\\circleddash\",!0),W(\"math\",$,Z,\"\\u229b\",\"\\\\circledast\",!0),W(\"math\",$,Z,\"\\u22c5\",\"\\\\centerdot\"),W(\"math\",$,Z,\"\\u22ba\",\"\\\\intercal\",!0),W(\"math\",$,Z,\"\\u22d2\",\"\\\\doublecap\"),W(\"math\",$,Z,\"\\u22d3\",\"\\\\doublecup\"),W(\"math\",$,Z,\"\\u22a0\",\"\\\\boxtimes\",!0),W(\"math\",$,Q,\"\\u21e2\",\"\\\\dashrightarrow\",!0),W(\"math\",$,Q,\"\\u21e0\",\"\\\\dashleftarrow\",!0),W(\"math\",$,Q,\"\\u21c7\",\"\\\\leftleftarrows\",!0),W(\"math\",$,Q,\"\\u21c6\",\"\\\\leftrightarrows\",!0),W(\"math\",$,Q,\"\\u21da\",\"\\\\Lleftarrow\",!0),W(\"math\",$,Q,\"\\u219e\",\"\\\\twoheadleftarrow\",!0),W(\"math\",$,Q,\"\\u21a2\",\"\\\\leftarrowtail\",!0),W(\"math\",$,Q,\"\\u21ab\",\"\\\\looparrowleft\",!0),W(\"math\",$,Q,\"\\u21cb\",\"\\\\leftrightharpoons\",!0),W(\"math\",$,Q,\"\\u21b6\",\"\\\\curvearrowleft\",!0),W(\"math\",$,Q,\"\\u21ba\",\"\\\\circlearrowleft\",!0),W(\"math\",$,Q,\"\\u21b0\",\"\\\\Lsh\",!0),W(\"math\",$,Q,\"\\u21c8\",\"\\\\upuparrows\",!0),W(\"math\",$,Q,\"\\u21bf\",\"\\\\upharpoonleft\",!0),W(\"math\",$,Q,\"\\u21c3\",\"\\\\downharpoonleft\",!0),W(\"math\",$,Q,\"\\u22b8\",\"\\\\multimap\",!0),W(\"math\",$,Q,\"\\u21ad\",\"\\\\leftrightsquigarrow\",!0),W(\"math\",$,Q,\"\\u21c9\",\"\\\\rightrightarrows\",!0),W(\"math\",$,Q,\"\\u21c4\",\"\\\\rightleftarrows\",!0),W(\"math\",$,Q,\"\\u21a0\",\"\\\\twoheadrightarrow\",!0),W(\"math\",$,Q,\"\\u21a3\",\"\\\\rightarrowtail\",!0),W(\"math\",$,Q,\"\\u21ac\",\"\\\\looparrowright\",!0),W(\"math\",$,Q,\"\\u21b7\",\"\\\\curvearrowright\",!0),W(\"math\",$,Q,\"\\u21bb\",\"\\\\circlearrowright\",!0),W(\"math\",$,Q,\"\\u21b1\",\"\\\\Rsh\",!0),W(\"math\",$,Q,\"\\u21ca\",\"\\\\downdownarrows\",!0),W(\"math\",$,Q,\"\\u21be\",\"\\\\upharpoonright\",!0),W(\"math\",$,Q,\"\\u21c2\",\"\\\\downharpoonright\",!0),W(\"math\",$,Q,\"\\u21dd\",\"\\\\rightsquigarrow\",!0),W(\"math\",$,Q,\"\\u21dd\",\"\\\\leadsto\"),W(\"math\",$,Q,\"\\u21db\",\"\\\\Rrightarrow\",!0),W(\"math\",$,Q,\"\\u21be\",\"\\\\restriction\"),W(\"math\",j,\"textord\",\"\\u2018\",\"`\"),W(\"math\",j,\"textord\",\"$\",\"\\\\$\"),W(\"text\",j,\"textord\",\"$\",\"\\\\$\"),W(\"text\",j,\"textord\",\"$\",\"\\\\textdollar\"),W(\"math\",j,\"textord\",\"%\",\"\\\\%\"),W(\"text\",j,\"textord\",\"%\",\"\\\\%\"),W(\"math\",j,\"textord\",\"_\",\"\\\\_\"),W(\"text\",j,\"textord\",\"_\",\"\\\\_\"),W(\"text\",j,\"textord\",\"_\",\"\\\\textunderscore\"),W(\"math\",j,\"textord\",\"\\u2220\",\"\\\\angle\",!0),W(\"math\",j,\"textord\",\"\\u221e\",\"\\\\infty\",!0),W(\"math\",j,\"textord\",\"\\u2032\",\"\\\\prime\"),W(\"math\",j,\"textord\",\"\\u25b3\",\"\\\\triangle\"),W(\"math\",j,\"textord\",\"\\u0393\",\"\\\\Gamma\",!0),W(\"math\",j,\"textord\",\"\\u0394\",\"\\\\Delta\",!0),W(\"math\",j,\"textord\",\"\\u0398\",\"\\\\Theta\",!0),W(\"math\",j,\"textord\",\"\\u039b\",\"\\\\Lambda\",!0),W(\"math\",j,\"textord\",\"\\u039e\",\"\\\\Xi\",!0),W(\"math\",j,\"textord\",\"\\u03a0\",\"\\\\Pi\",!0),W(\"math\",j,\"textord\",\"\\u03a3\",\"\\\\Sigma\",!0),W(\"math\",j,\"textord\",\"\\u03a5\",\"\\\\Upsilon\",!0),W(\"math\",j,\"textord\",\"\\u03a6\",\"\\\\Phi\",!0),W(\"math\",j,\"textord\",\"\\u03a8\",\"\\\\Psi\",!0),W(\"math\",j,\"textord\",\"\\u03a9\",\"\\\\Omega\",!0),W(\"math\",j,\"textord\",\"A\",\"\\u0391\"),W(\"math\",j,\"textord\",\"B\",\"\\u0392\"),W(\"math\",j,\"textord\",\"E\",\"\\u0395\"),W(\"math\",j,\"textord\",\"Z\",\"\\u0396\"),W(\"math\",j,\"textord\",\"H\",\"\\u0397\"),W(\"math\",j,\"textord\",\"I\",\"\\u0399\"),W(\"math\",j,\"textord\",\"K\",\"\\u039a\"),W(\"math\",j,\"textord\",\"M\",\"\\u039c\"),W(\"math\",j,\"textord\",\"N\",\"\\u039d\"),W(\"math\",j,\"textord\",\"O\",\"\\u039f\"),W(\"math\",j,\"textord\",\"P\",\"\\u03a1\"),W(\"math\",j,\"textord\",\"T\",\"\\u03a4\"),W(\"math\",j,\"textord\",\"X\",\"\\u03a7\"),W(\"math\",j,\"textord\",\"\\xac\",\"\\\\neg\",!0),W(\"math\",j,\"textord\",\"\\xac\",\"\\\\lnot\"),W(\"math\",j,\"textord\",\"\\u22a4\",\"\\\\top\"),W(\"math\",j,\"textord\",\"\\u22a5\",\"\\\\bot\"),W(\"math\",j,\"textord\",\"\\u2205\",\"\\\\emptyset\"),W(\"math\",$,\"textord\",\"\\u2205\",\"\\\\varnothing\"),W(\"math\",j,K,\"\\u03b1\",\"\\\\alpha\",!0),W(\"math\",j,K,\"\\u03b2\",\"\\\\beta\",!0),W(\"math\",j,K,\"\\u03b3\",\"\\\\gamma\",!0),W(\"math\",j,K,\"\\u03b4\",\"\\\\delta\",!0),W(\"math\",j,K,\"\\u03f5\",\"\\\\epsilon\",!0),W(\"math\",j,K,\"\\u03b6\",\"\\\\zeta\",!0),W(\"math\",j,K,\"\\u03b7\",\"\\\\eta\",!0),W(\"math\",j,K,\"\\u03b8\",\"\\\\theta\",!0),W(\"math\",j,K,\"\\u03b9\",\"\\\\iota\",!0),W(\"math\",j,K,\"\\u03ba\",\"\\\\kappa\",!0),W(\"math\",j,K,\"\\u03bb\",\"\\\\lambda\",!0),W(\"math\",j,K,\"\\u03bc\",\"\\\\mu\",!0),W(\"math\",j,K,\"\\u03bd\",\"\\\\nu\",!0),W(\"math\",j,K,\"\\u03be\",\"\\\\xi\",!0),W(\"math\",j,K,\"\\u03bf\",\"\\\\omicron\",!0),W(\"math\",j,K,\"\\u03c0\",\"\\\\pi\",!0),W(\"math\",j,K,\"\\u03c1\",\"\\\\rho\",!0),W(\"math\",j,K,\"\\u03c3\",\"\\\\sigma\",!0),W(\"math\",j,K,\"\\u03c4\",\"\\\\tau\",!0),W(\"math\",j,K,\"\\u03c5\",\"\\\\upsilon\",!0),W(\"math\",j,K,\"\\u03d5\",\"\\\\phi\",!0),W(\"math\",j,K,\"\\u03c7\",\"\\\\chi\",!0),W(\"math\",j,K,\"\\u03c8\",\"\\\\psi\",!0),W(\"math\",j,K,\"\\u03c9\",\"\\\\omega\",!0),W(\"math\",j,K,\"\\u03b5\",\"\\\\varepsilon\",!0),W(\"math\",j,K,\"\\u03d1\",\"\\\\vartheta\",!0),W(\"math\",j,K,\"\\u03d6\",\"\\\\varpi\",!0),W(\"math\",j,K,\"\\u03f1\",\"\\\\varrho\",!0),W(\"math\",j,K,\"\\u03c2\",\"\\\\varsigma\",!0),W(\"math\",j,K,\"\\u03c6\",\"\\\\varphi\",!0),W(\"math\",j,Z,\"\\u2217\",\"*\"),W(\"math\",j,Z,\"+\",\"+\"),W(\"math\",j,Z,\"\\u2212\",\"-\"),W(\"math\",j,Z,\"\\u22c5\",\"\\\\cdot\",!0),W(\"math\",j,Z,\"\\u2218\",\"\\\\circ\"),W(\"math\",j,Z,\"\\xf7\",\"\\\\div\",!0),W(\"math\",j,Z,\"\\xb1\",\"\\\\pm\",!0),W(\"math\",j,Z,\"\\xd7\",\"\\\\times\",!0),W(\"math\",j,Z,\"\\u2229\",\"\\\\cap\",!0),W(\"math\",j,Z,\"\\u222a\",\"\\\\cup\",!0),W(\"math\",j,Z,\"\\u2216\",\"\\\\setminus\"),W(\"math\",j,Z,\"\\u2227\",\"\\\\land\"),W(\"math\",j,Z,\"\\u2228\",\"\\\\lor\"),W(\"math\",j,Z,\"\\u2227\",\"\\\\wedge\",!0),W(\"math\",j,Z,\"\\u2228\",\"\\\\vee\",!0),W(\"math\",j,\"textord\",\"\\u221a\",\"\\\\surd\"),W(\"math\",j,\"open\",\"(\",\"(\"),W(\"math\",j,\"open\",\"[\",\"[\"),W(\"math\",j,\"open\",\"\\u27e8\",\"\\\\langle\",!0),W(\"math\",j,\"open\",\"\\u2223\",\"\\\\lvert\"),W(\"math\",j,\"open\",\"\\u2225\",\"\\\\lVert\"),W(\"math\",j,\"close\",\")\",\")\"),W(\"math\",j,\"close\",\"]\",\"]\"),W(\"math\",j,\"close\",\"?\",\"?\"),W(\"math\",j,\"close\",\"!\",\"!\"),W(\"math\",j,\"close\",\"\\u27e9\",\"\\\\rangle\",!0),W(\"math\",j,\"close\",\"\\u2223\",\"\\\\rvert\"),W(\"math\",j,\"close\",\"\\u2225\",\"\\\\rVert\"),W(\"math\",j,Q,\"=\",\"=\"),W(\"math\",j,Q,\"<\",\"<\"),W(\"math\",j,Q,\">\",\">\"),W(\"math\",j,Q,\":\",\":\"),W(\"math\",j,Q,\"\\u2248\",\"\\\\approx\",!0),W(\"math\",j,Q,\"\\u2245\",\"\\\\cong\",!0),W(\"math\",j,Q,\"\\u2265\",\"\\\\ge\"),W(\"math\",j,Q,\"\\u2265\",\"\\\\geq\",!0),W(\"math\",j,Q,\"\\u2190\",\"\\\\gets\"),W(\"math\",j,Q,\">\",\"\\\\gt\"),W(\"math\",j,Q,\"\\u2208\",\"\\\\in\",!0),W(\"math\",j,Q,\"\\ue020\",\"\\\\@not\"),W(\"math\",j,Q,\"\\u2282\",\"\\\\subset\",!0),W(\"math\",j,Q,\"\\u2283\",\"\\\\supset\",!0),W(\"math\",j,Q,\"\\u2286\",\"\\\\subseteq\",!0),W(\"math\",j,Q,\"\\u2287\",\"\\\\supseteq\",!0),W(\"math\",$,Q,\"\\u2288\",\"\\\\nsubseteq\",!0),W(\"math\",$,Q,\"\\u2289\",\"\\\\nsupseteq\",!0),W(\"math\",j,Q,\"\\u22a8\",\"\\\\models\"),W(\"math\",j,Q,\"\\u2190\",\"\\\\leftarrow\",!0),W(\"math\",j,Q,\"\\u2264\",\"\\\\le\"),W(\"math\",j,Q,\"\\u2264\",\"\\\\leq\",!0),W(\"math\",j,Q,\"<\",\"\\\\lt\"),W(\"math\",j,Q,\"\\u2192\",\"\\\\rightarrow\",!0),W(\"math\",j,Q,\"\\u2192\",\"\\\\to\"),W(\"math\",$,Q,\"\\u2271\",\"\\\\ngeq\",!0),W(\"math\",$,Q,\"\\u2270\",\"\\\\nleq\",!0),W(\"math\",j,\"spacing\",\"\\xa0\",\"\\\\ \"),W(\"math\",j,\"spacing\",\"\\xa0\",\"~\"),W(\"math\",j,\"spacing\",\"\\xa0\",\"\\\\space\"),W(\"math\",j,\"spacing\",\"\\xa0\",\"\\\\nobreakspace\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\ \"),W(\"text\",j,\"spacing\",\"\\xa0\",\"~\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\space\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\nobreakspace\"),W(\"math\",j,\"spacing\",null,\"\\\\nobreak\"),W(\"math\",j,\"spacing\",null,\"\\\\allowbreak\"),W(\"math\",j,\"punct\",\",\",\",\"),W(\"math\",j,\"punct\",\";\",\";\"),W(\"math\",$,Z,\"\\u22bc\",\"\\\\barwedge\",!0),W(\"math\",$,Z,\"\\u22bb\",\"\\\\veebar\",!0),W(\"math\",j,Z,\"\\u2299\",\"\\\\odot\",!0),W(\"math\",j,Z,\"\\u2295\",\"\\\\oplus\",!0),W(\"math\",j,Z,\"\\u2297\",\"\\\\otimes\",!0),W(\"math\",j,\"textord\",\"\\u2202\",\"\\\\partial\",!0),W(\"math\",j,Z,\"\\u2298\",\"\\\\oslash\",!0),W(\"math\",$,Z,\"\\u229a\",\"\\\\circledcirc\",!0),W(\"math\",$,Z,\"\\u22a1\",\"\\\\boxdot\",!0),W(\"math\",j,Z,\"\\u25b3\",\"\\\\bigtriangleup\"),W(\"math\",j,Z,\"\\u25bd\",\"\\\\bigtriangledown\"),W(\"math\",j,Z,\"\\u2020\",\"\\\\dagger\"),W(\"math\",j,Z,\"\\u22c4\",\"\\\\diamond\"),W(\"math\",j,Z,\"\\u22c6\",\"\\\\star\"),W(\"math\",j,Z,\"\\u25c3\",\"\\\\triangleleft\"),W(\"math\",j,Z,\"\\u25b9\",\"\\\\triangleright\"),W(\"math\",j,\"open\",\"{\",\"\\\\{\"),W(\"text\",j,\"textord\",\"{\",\"\\\\{\"),W(\"text\",j,\"textord\",\"{\",\"\\\\textbraceleft\"),W(\"math\",j,\"close\",\"}\",\"\\\\}\"),W(\"text\",j,\"textord\",\"}\",\"\\\\}\"),W(\"text\",j,\"textord\",\"}\",\"\\\\textbraceright\"),W(\"math\",j,\"open\",\"{\",\"\\\\lbrace\"),W(\"math\",j,\"close\",\"}\",\"\\\\rbrace\"),W(\"math\",j,\"open\",\"[\",\"\\\\lbrack\"),W(\"text\",j,\"textord\",\"[\",\"\\\\lbrack\"),W(\"math\",j,\"close\",\"]\",\"\\\\rbrack\"),W(\"text\",j,\"textord\",\"]\",\"\\\\rbrack\"),W(\"math\",j,\"open\",\"(\",\"\\\\lparen\"),W(\"math\",j,\"close\",\")\",\"\\\\rparen\"),W(\"text\",j,\"textord\",\"<\",\"\\\\textless\"),W(\"text\",j,\"textord\",\">\",\"\\\\textgreater\"),W(\"math\",j,\"open\",\"\\u230a\",\"\\\\lfloor\",!0),W(\"math\",j,\"close\",\"\\u230b\",\"\\\\rfloor\",!0),W(\"math\",j,\"open\",\"\\u2308\",\"\\\\lceil\",!0),W(\"math\",j,\"close\",\"\\u2309\",\"\\\\rceil\",!0),W(\"math\",j,\"textord\",\"\\\\\",\"\\\\backslash\"),W(\"math\",j,\"textord\",\"\\u2223\",\"|\"),W(\"math\",j,\"textord\",\"\\u2223\",\"\\\\vert\"),W(\"text\",j,\"textord\",\"|\",\"\\\\textbar\"),W(\"math\",j,\"textord\",\"\\u2225\",\"\\\\|\"),W(\"math\",j,\"textord\",\"\\u2225\",\"\\\\Vert\"),W(\"text\",j,\"textord\",\"\\u2225\",\"\\\\textbardbl\"),W(\"text\",j,\"textord\",\"~\",\"\\\\textasciitilde\"),W(\"text\",j,\"textord\",\"\\\\\",\"\\\\textbackslash\"),W(\"text\",j,\"textord\",\"^\",\"\\\\textasciicircum\"),W(\"math\",j,Q,\"\\u2191\",\"\\\\uparrow\",!0),W(\"math\",j,Q,\"\\u21d1\",\"\\\\Uparrow\",!0),W(\"math\",j,Q,\"\\u2193\",\"\\\\downarrow\",!0),W(\"math\",j,Q,\"\\u21d3\",\"\\\\Downarrow\",!0),W(\"math\",j,Q,\"\\u2195\",\"\\\\updownarrow\",!0),W(\"math\",j,Q,\"\\u21d5\",\"\\\\Updownarrow\",!0),W(\"math\",j,J,\"\\u2210\",\"\\\\coprod\"),W(\"math\",j,J,\"\\u22c1\",\"\\\\bigvee\"),W(\"math\",j,J,\"\\u22c0\",\"\\\\bigwedge\"),W(\"math\",j,J,\"\\u2a04\",\"\\\\biguplus\"),W(\"math\",j,J,\"\\u22c2\",\"\\\\bigcap\"),W(\"math\",j,J,\"\\u22c3\",\"\\\\bigcup\"),W(\"math\",j,J,\"\\u222b\",\"\\\\int\"),W(\"math\",j,J,\"\\u222b\",\"\\\\intop\"),W(\"math\",j,J,\"\\u222c\",\"\\\\iint\"),W(\"math\",j,J,\"\\u222d\",\"\\\\iiint\"),W(\"math\",j,J,\"\\u220f\",\"\\\\prod\"),W(\"math\",j,J,\"\\u2211\",\"\\\\sum\"),W(\"math\",j,J,\"\\u2a02\",\"\\\\bigotimes\"),W(\"math\",j,J,\"\\u2a01\",\"\\\\bigoplus\"),W(\"math\",j,J,\"\\u2a00\",\"\\\\bigodot\"),W(\"math\",j,J,\"\\u222e\",\"\\\\oint\"),W(\"math\",j,J,\"\\u222f\",\"\\\\oiint\"),W(\"math\",j,J,\"\\u2230\",\"\\\\oiiint\"),W(\"math\",j,J,\"\\u2a06\",\"\\\\bigsqcup\"),W(\"math\",j,J,\"\\u222b\",\"\\\\smallint\"),W(\"text\",j,\"inner\",\"\\u2026\",\"\\\\textellipsis\"),W(\"math\",j,\"inner\",\"\\u2026\",\"\\\\mathellipsis\"),W(\"text\",j,\"inner\",\"\\u2026\",\"\\\\ldots\",!0),W(\"math\",j,\"inner\",\"\\u2026\",\"\\\\ldots\",!0),W(\"math\",j,\"inner\",\"\\u22ef\",\"\\\\@cdots\",!0),W(\"math\",j,\"inner\",\"\\u22f1\",\"\\\\ddots\",!0),W(\"math\",j,\"textord\",\"\\u22ee\",\"\\\\varvdots\"),W(\"math\",j,\"accent-token\",\"\\u02ca\",\"\\\\acute\"),W(\"math\",j,\"accent-token\",\"\\u02cb\",\"\\\\grave\"),W(\"math\",j,\"accent-token\",\"\\xa8\",\"\\\\ddot\"),W(\"math\",j,\"accent-token\",\"~\",\"\\\\tilde\"),W(\"math\",j,\"accent-token\",\"\\u02c9\",\"\\\\bar\"),W(\"math\",j,\"accent-token\",\"\\u02d8\",\"\\\\breve\"),W(\"math\",j,\"accent-token\",\"\\u02c7\",\"\\\\check\"),W(\"math\",j,\"accent-token\",\"^\",\"\\\\hat\"),W(\"math\",j,\"accent-token\",\"\\u20d7\",\"\\\\vec\"),W(\"math\",j,\"accent-token\",\"\\u02d9\",\"\\\\dot\"),W(\"math\",j,\"accent-token\",\"\\u02da\",\"\\\\mathring\"),W(\"math\",j,K,\"\\u0131\",\"\\\\imath\",!0),W(\"math\",j,K,\"\\u0237\",\"\\\\jmath\",!0),W(\"text\",j,\"textord\",\"\\u0131\",\"\\\\i\",!0),W(\"text\",j,\"textord\",\"\\u0237\",\"\\\\j\",!0),W(\"text\",j,\"textord\",\"\\xdf\",\"\\\\ss\",!0),W(\"text\",j,\"textord\",\"\\xe6\",\"\\\\ae\",!0),W(\"text\",j,\"textord\",\"\\xe6\",\"\\\\ae\",!0),W(\"text\",j,\"textord\",\"\\u0153\",\"\\\\oe\",!0),W(\"text\",j,\"textord\",\"\\xf8\",\"\\\\o\",!0),W(\"text\",j,\"textord\",\"\\xc6\",\"\\\\AE\",!0),W(\"text\",j,\"textord\",\"\\u0152\",\"\\\\OE\",!0),W(\"text\",j,\"textord\",\"\\xd8\",\"\\\\O\",!0),W(\"text\",j,\"accent-token\",\"\\u02ca\",\"\\\\'\"),W(\"text\",j,\"accent-token\",\"\\u02cb\",\"\\\\`\"),W(\"text\",j,\"accent-token\",\"\\u02c6\",\"\\\\^\"),W(\"text\",j,\"accent-token\",\"\\u02dc\",\"\\\\~\"),W(\"text\",j,\"accent-token\",\"\\u02c9\",\"\\\\=\"),W(\"text\",j,\"accent-token\",\"\\u02d8\",\"\\\\u\"),W(\"text\",j,\"accent-token\",\"\\u02d9\",\"\\\\.\"),W(\"text\",j,\"accent-token\",\"\\u02da\",\"\\\\r\"),W(\"text\",j,\"accent-token\",\"\\u02c7\",\"\\\\v\"),W(\"text\",j,\"accent-token\",\"\\xa8\",'\\\\\"'),W(\"text\",j,\"accent-token\",\"\\u02dd\",\"\\\\H\"),W(\"text\",j,\"accent-token\",\"\\u25ef\",\"\\\\textcircled\");var tt={\"--\":!0,\"---\":!0,\"``\":!0,\"''\":!0};W(\"text\",j,\"textord\",\"\\u2013\",\"--\"),W(\"text\",j,\"textord\",\"\\u2013\",\"\\\\textendash\"),W(\"text\",j,\"textord\",\"\\u2014\",\"---\"),W(\"text\",j,\"textord\",\"\\u2014\",\"\\\\textemdash\"),W(\"text\",j,\"textord\",\"\\u2018\",\"`\"),W(\"text\",j,\"textord\",\"\\u2018\",\"\\\\textquoteleft\"),W(\"text\",j,\"textord\",\"\\u2019\",\"'\"),W(\"text\",j,\"textord\",\"\\u2019\",\"\\\\textquoteright\"),W(\"text\",j,\"textord\",\"\\u201c\",\"``\"),W(\"text\",j,\"textord\",\"\\u201c\",\"\\\\textquotedblleft\"),W(\"text\",j,\"textord\",\"\\u201d\",\"''\"),W(\"text\",j,\"textord\",\"\\u201d\",\"\\\\textquotedblright\"),W(\"math\",j,\"textord\",\"\\xb0\",\"\\\\degree\",!0),W(\"text\",j,\"textord\",\"\\xb0\",\"\\\\degree\"),W(\"text\",j,\"textord\",\"\\xb0\",\"\\\\textdegree\",!0),W(\"math\",j,K,\"\\xa3\",\"\\\\pounds\"),W(\"math\",j,K,\"\\xa3\",\"\\\\mathsterling\",!0),W(\"text\",j,K,\"\\xa3\",\"\\\\pounds\"),W(\"text\",j,K,\"\\xa3\",\"\\\\textsterling\",!0),W(\"math\",$,\"textord\",\"\\u2720\",\"\\\\maltese\"),W(\"text\",$,\"textord\",\"\\u2720\",\"\\\\maltese\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\ \"),W(\"text\",j,\"spacing\",\"\\xa0\",\" \"),W(\"text\",j,\"spacing\",\"\\xa0\",\"~\");for(var et=0;et<'0123456789/@.\"'.length;et++){var rt='0123456789/@.\"'.charAt(et);W(\"math\",j,\"textord\",rt,rt)}for(var at=0;at<'0123456789!@*()-=+[]<>|\";:?/.,'.length;at++){var nt='0123456789!@*()-=+[]<>|\";:?/.,'.charAt(at);W(\"text\",j,\"textord\",nt,nt)}for(var ot=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",it=0;it<ot.length;it++){var st=ot.charAt(it);W(\"math\",j,K,st,st),W(\"text\",j,\"textord\",st,st)}W(\"math\",$,\"textord\",\"C\",\"\\u2102\"),W(\"text\",$,\"textord\",\"C\",\"\\u2102\"),W(\"math\",$,\"textord\",\"H\",\"\\u210d\"),W(\"text\",$,\"textord\",\"H\",\"\\u210d\"),W(\"math\",$,\"textord\",\"N\",\"\\u2115\"),W(\"text\",$,\"textord\",\"N\",\"\\u2115\"),W(\"math\",$,\"textord\",\"P\",\"\\u2119\"),W(\"text\",$,\"textord\",\"P\",\"\\u2119\"),W(\"math\",$,\"textord\",\"Q\",\"\\u211a\"),W(\"text\",$,\"textord\",\"Q\",\"\\u211a\"),W(\"math\",$,\"textord\",\"R\",\"\\u211d\"),W(\"text\",$,\"textord\",\"R\",\"\\u211d\"),W(\"math\",$,\"textord\",\"Z\",\"\\u2124\"),W(\"text\",$,\"textord\",\"Z\",\"\\u2124\"),W(\"math\",j,K,\"h\",\"\\u210e\"),W(\"text\",j,K,\"h\",\"\\u210e\");for(var ht=\"\",lt=0;lt<ot.length;lt++){var mt=ot.charAt(lt);W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56320+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56372+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56424+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56580+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56736+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56788+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56840+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56944+lt)),W(\"text\",j,\"textord\",mt,ht),lt<26&&(W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56632+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56476+lt)),W(\"text\",j,\"textord\",mt,ht))}W(\"math\",j,K,\"k\",ht=String.fromCharCode(55349,56668)),W(\"text\",j,\"textord\",\"k\",ht);for(var ct=0;ct<10;ct++){var ut=ct.toString();W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57294+ct)),W(\"text\",j,\"textord\",ut,ht),W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57314+ct)),W(\"text\",j,\"textord\",ut,ht),W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57324+ct)),W(\"text\",j,\"textord\",ut,ht),W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57334+ct)),W(\"text\",j,\"textord\",ut,ht)}for(var dt=0;dt<\"\\xc7\\xd0\\xde\\xe7\\xfe\".length;dt++){var pt=\"\\xc7\\xd0\\xde\\xe7\\xfe\".charAt(dt);W(\"math\",j,K,pt,pt),W(\"text\",j,\"textord\",pt,pt)}W(\"text\",j,\"textord\",\"\\xf0\",\"\\xf0\"),W(\"text\",j,\"textord\",\"\\u2013\",\"\\u2013\"),W(\"text\",j,\"textord\",\"\\u2014\",\"\\u2014\"),W(\"text\",j,\"textord\",\"\\u2018\",\"\\u2018\"),W(\"text\",j,\"textord\",\"\\u2019\",\"\\u2019\"),W(\"text\",j,\"textord\",\"\\u201c\",\"\\u201c\"),W(\"text\",j,\"textord\",\"\\u201d\",\"\\u201d\");var ft=[[\"mathbf\",\"textbf\",\"Main-Bold\"],[\"mathbf\",\"textbf\",\"Main-Bold\"],[\"mathdefault\",\"textit\",\"Math-Italic\"],[\"mathdefault\",\"textit\",\"Math-Italic\"],[\"boldsymbol\",\"boldsymbol\",\"Main-BoldItalic\"],[\"boldsymbol\",\"boldsymbol\",\"Main-BoldItalic\"],[\"mathscr\",\"textscr\",\"Script-Regular\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"mathfrak\",\"textfrak\",\"Fraktur-Regular\"],[\"mathfrak\",\"textfrak\",\"Fraktur-Regular\"],[\"mathbb\",\"textbb\",\"AMS-Regular\"],[\"mathbb\",\"textbb\",\"AMS-Regular\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"mathsf\",\"textsf\",\"SansSerif-Regular\"],[\"mathsf\",\"textsf\",\"SansSerif-Regular\"],[\"mathboldsf\",\"textboldsf\",\"SansSerif-Bold\"],[\"mathboldsf\",\"textboldsf\",\"SansSerif-Bold\"],[\"mathitsf\",\"textitsf\",\"SansSerif-Italic\"],[\"mathitsf\",\"textitsf\",\"SansSerif-Italic\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"mathtt\",\"texttt\",\"Typewriter-Regular\"],[\"mathtt\",\"texttt\",\"Typewriter-Regular\"]],gt=[[\"mathbf\",\"textbf\",\"Main-Bold\"],[\"\",\"\",\"\"],[\"mathsf\",\"textsf\",\"SansSerif-Regular\"],[\"mathboldsf\",\"textboldsf\",\"SansSerif-Bold\"],[\"mathtt\",\"texttt\",\"Typewriter-Regular\"]],xt=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],vt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],bt=function(t,e){return e.size<2?t:xt[t-1][e.size-1]},yt=function(){function t(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||\"\",this.fontFamily=e.fontFamily||\"\",this.fontWeight=e.fontWeight||\"\",this.fontShape=e.fontShape||\"\",this.sizeMultiplier=vt[this.size-1],this.maxSize=e.maxSize,this._fontMetrics=void 0}var e=t.prototype;return e.extend=function(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize};for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);return new t(r)},e.havingStyle=function(t){return this.style===t?this:this.extend({style:t,size:bt(this.textSize,t)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:vt[t-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var r=bt(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})},e.havingBaseSizing=function(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})},e.withColor=function(t){return this.extend({color:t})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(t){return this.extend({font:t})},e.withTextFontFamily=function(t){return this.extend({fontFamily:t,font:\"\"})},e.withTextFontWeight=function(t){return this.extend({fontWeight:t,font:\"\"})},e.withTextFontShape=function(t){return this.extend({fontShape:t,font:\"\"})},e.sizingClasses=function(t){return t.size!==this.size?[\"sizing\",\"reset-size\"+t.size,\"size\"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==t.BASESIZE?[\"sizing\",\"reset-size\"+this.size,\"size\"+t.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(t){var e;if(!U[e=t>=5?0:t>=3?1:2]){var r=U[e]={cssEmPerMu:D.quad[e]/18};for(var a in D)D.hasOwnProperty(a)&&(r[a]=D[a][e])}return U[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?\"transparent\":this.color},t}();yt.BASESIZE=6;var wt=yt,kt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},St={ex:!0,em:!0,mu:!0},zt=function(t,e){var r;if(t.unit in kt)r=kt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if(\"mu\"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,\"ex\"===t.unit)r=a.fontMetrics().xHeight;else{if(\"em\"!==t.unit)throw new i(\"Invalid unit: '\"+t.unit+\"'\");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Mt=[\"\\\\imath\",\"\\u0131\",\"\\\\jmath\",\"\\u0237\",\"\\\\pounds\",\"\\\\mathsterling\",\"\\\\textsterling\",\"\\xa3\"],Tt=function(t,e,r){return _[r][t]&&_[r][t].replace&&(t=_[r][t].replace),{value:t,metrics:V(t,e,r)}},At=function(t,e,r,a,n){var o,i=Tt(t,e,r),s=i.metrics;if(t=i.value,s){var h=s.italic;(\"text\"===r||a&&\"mathit\"===a.font)&&(h=0),o=new E(t,s.height,s.depth,h,s.skew,s.width,n)}else\"undefined\"!=typeof console&&console.warn(\"No character metrics for '\"+t+\"' in style '\"+e+\"'\"),o=new E(t,0,0,0,0,0,n);if(a){o.maxFontSize=a.sizeMultiplier,a.style.isTight()&&o.classes.push(\"mtight\");var l=a.getColor();l&&(o.style.color=l)}return o},Bt=function(t,e){if(A(t.classes)!==A(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},qt=function(t){for(var e=0,r=0,a=0,n=0;n<t.children.length;n++){var o=t.children[n];o.height>e&&(e=o.height),o.depth>r&&(r=o.depth),o.maxFontSize>a&&(a=o.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},Ct=function(t,e,r,a){var n=new N(t,e,r,a);return qt(n),n},Nt=function(t,e,r,a){return new N(t,e,r,a)},It=function(t){var e=new T(t);return qt(e),e},Ot=function(t,e,r){var a=\"\";switch(t){case\"amsrm\":a=\"AMS\";break;case\"textrm\":a=\"Main\";break;case\"textsf\":a=\"SansSerif\";break;case\"texttt\":a=\"Typewriter\";break;default:a=t}return a+\"-\"+(\"textbf\"===e&&\"textit\"===r?\"BoldItalic\":\"textbf\"===e?\"Bold\":\"textit\"===e?\"Italic\":\"Regular\")},Et={mathbf:{variant:\"bold\",fontName:\"Main-Bold\"},mathrm:{variant:\"normal\",fontName:\"Main-Regular\"},textit:{variant:\"italic\",fontName:\"Main-Italic\"},mathit:{variant:\"italic\",fontName:\"Main-Italic\"},mathbb:{variant:\"double-struck\",fontName:\"AMS-Regular\"},mathcal:{variant:\"script\",fontName:\"Caligraphic-Regular\"},mathfrak:{variant:\"fraktur\",fontName:\"Fraktur-Regular\"},mathscr:{variant:\"script\",fontName:\"Script-Regular\"},mathsf:{variant:\"sans-serif\",fontName:\"SansSerif-Regular\"},mathtt:{variant:\"monospace\",fontName:\"Typewriter-Regular\"}},Rt={vec:[\"vec\",.471,.714],oiintSize1:[\"oiintSize1\",.957,.499],oiintSize2:[\"oiintSize2\",1.472,.659],oiiintSize1:[\"oiiintSize1\",1.304,.499],oiiintSize2:[\"oiiintSize2\",1.98,.659]},Lt={fontMap:Et,makeSymbol:At,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),r&&r.font&&\"boldsymbol\"===r.font&&Tt(t,\"Main-Bold\",e).metrics?At(t,\"Main-Bold\",e,r,a.concat([\"mathbf\"])):\"\\\\\"===t||\"main\"===_[e][t].font?At(t,\"Main-Regular\",e,r,a):At(t,\"AMS-Regular\",e,r,a.concat([\"amsrm\"]))},makeSpan:Ct,makeSvgSpan:Nt,makeLineSpan:function(t,e,r){var a=Ct([t],[],e);return a.height=r||e.fontMetrics().defaultRuleThickness,a.style.borderBottomWidth=a.height+\"em\",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return qt(n),n},makeFragment:It,wrapFragment:function(t,e){return t instanceof T?Ct([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if(\"individualShift\"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,o=1;o<e.length;o++){var i=-e[o].shift-n-e[o].elem.depth,s=i-(e[o-1].elem.height+e[o-1].elem.depth);n+=i,r.push({type:\"kern\",size:s}),r.push(e[o])}return{children:r,depth:a}}var h;if(\"top\"===t.positionType){for(var l=t.positionData,m=0;m<t.children.length;m++){var c=t.children[m];l-=\"kern\"===c.type?c.size:c.elem.height+c.elem.depth}h=l}else if(\"bottom\"===t.positionType)h=-t.positionData;else{var u=t.children[0];if(\"elem\"!==u.type)throw new Error('First child must have type \"elem\".');if(\"shift\"===t.positionType)h=-u.elem.depth-t.positionData;else{if(\"firstBaseline\"!==t.positionType)throw new Error(\"Invalid positionType \"+t.positionType+\".\");h=-u.elem.depth}}return{children:t.children,depth:h}}(t),a=r.children,n=r.depth,o=0,i=0;i<a.length;i++){var s=a[i];if(\"elem\"===s.type){var h=s.elem;o=Math.max(o,h.maxFontSize,h.height)}}o+=2;var l=Ct([\"pstrut\"],[]);l.style.height=o+\"em\";for(var m=[],c=n,u=n,d=n,p=0;p<a.length;p++){var f=a[p];if(\"kern\"===f.type)d+=f.size;else{var g=f.elem,x=f.wrapperClasses||[],v=f.wrapperStyle||{},b=Ct(x,[l,g],void 0,v);b.style.top=-o-d-g.depth+\"em\",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),d+=g.height+g.depth}c=Math.min(c,d),u=Math.max(u,d)}var y,w=Ct([\"vlist\"],m);if(w.style.height=u+\"em\",c<0){var k=Ct([],[]),S=Ct([\"vlist\"],[k]);S.style.height=-c+\"em\";var z=Ct([\"vlist-s\"],[new E(\"\\u200b\")]);y=[Ct([\"vlist-r\"],[w,z]),Ct([\"vlist-r\"],[S])]}else y=[Ct([\"vlist-r\"],[w])];var M=Ct([\"vlist-t\"],y);return 2===y.length&&M.classes.push(\"vlist-t2\"),M.height=u,M.depth=-c,M},makeOrd:function(t,e,r){var a,n=t.mode,o=t.text,s=[\"mord\"],h=\"math\"===n||\"text\"===n&&e.font,l=h?e.font:e.fontFamily;if(55349===o.charCodeAt(0)){var m=function(t,e){var r=1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536,a=\"math\"===e?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[ft[n][2],ft[n][a]]}if(120782<=r&&r<=120831){var o=Math.floor((r-120782)/10);return[gt[o][2],gt[o][a]]}if(120485===r||120486===r)return[ft[0][2],ft[0][a]];if(120486<r&&r<120782)return[\"\",\"\"];throw new i(\"Unsupported character: \"+t)}(o,n),u=m[0],d=m[1];return At(o,u,n,e,s.concat(d))}if(l){var p,f;if(\"boldsymbol\"===l||\"mathnormal\"===l){var g=\"boldsymbol\"===l?function(t,e,r,a){return Tt(t,\"Math-BoldItalic\",e).metrics?{fontName:\"Math-BoldItalic\",fontClass:\"boldsymbol\"}:{fontName:\"Main-Bold\",fontClass:\"mathbf\"}}(o,n):(a=o,c.contains(Mt,a)?{fontName:\"Main-Italic\",fontClass:\"mathit\"}:/[0-9]/.test(a.charAt(0))?{fontName:\"Caligraphic-Regular\",fontClass:\"mathcal\"}:{fontName:\"Math-Italic\",fontClass:\"mathdefault\"});p=g.fontName,f=[g.fontClass]}else c.contains(Mt,o)?(p=\"Main-Italic\",f=[\"mathit\"]):h?(p=Et[l].fontName,f=[l]):(p=Ot(l,e.fontWeight,e.fontShape),f=[l,e.fontWeight,e.fontShape]);if(Tt(o,p,n).metrics)return At(o,p,n,e,s.concat(f));if(tt.hasOwnProperty(o)&&\"Typewriter\"===p.substr(0,10)){for(var x=[],v=0;v<o.length;v++)x.push(At(o[v],p,n,e,s.concat(f)));return It(x)}}if(\"mathord\"===r){var b=function(t,e,r,a){return/[0-9]/.test(t.charAt(0))||c.contains(Mt,t)?{fontName:\"Main-Italic\",fontClass:\"mathit\"}:{fontName:\"Math-Italic\",fontClass:\"mathdefault\"}}(o);return At(o,b.fontName,n,e,s.concat([b.fontClass]))}if(\"textord\"===r){var y=_[n][o]&&_[n][o].font;if(\"ams\"===y){var w=Ot(\"amsrm\",e.fontWeight,e.fontShape);return At(o,w,n,e,s.concat(\"amsrm\",e.fontWeight,e.fontShape))}if(\"main\"!==y&&y){var k=Ot(y,e.fontWeight,e.fontShape);return At(o,k,n,e,s.concat(k,e.fontWeight,e.fontShape))}var S=Ot(\"textrm\",e.fontWeight,e.fontShape);return At(o,S,n,e,s.concat(e.fontWeight,e.fontShape))}throw new Error(\"unexpected type: \"+r+\" in makeOrd\")},makeGlue:function(t,e){var r=Ct([\"mspace\"],[],e),a=zt(t,e);return r.style.marginRight=a+\"em\",r},staticSvg:function(t,e){var r=Rt[t],a=r[0],n=r[1],o=r[2],i=new L(a),s=new R([i],{width:n+\"em\",height:o+\"em\",style:\"width:\"+n+\"em\",viewBox:\"0 0 \"+1e3*n+\" \"+1e3*o,preserveAspectRatio:\"xMinYMin\"}),h=Nt([\"overlay\"],[s],e);return h.height=o,h.style.height=o+\"em\",h.style.width=n+\"em\",h},svgData:Rt,tryCombineChars:function(t){for(var e=0;e<t.length-1;e++){var r=t[e],a=t[e+1];r instanceof E&&a instanceof E&&Bt(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,t.splice(e+1,1),e--)}return t}};function Ht(t,e){var r=Pt(t,e);if(!r)throw new Error(\"Expected node of type \"+e+\", but got \"+(t?\"node of type \"+t.type:String(t)));return r}function Pt(t,e){return t&&t.type===e?t:null}function Dt(t,e){var r=function(t,e){return t&&\"atom\"===t.type&&t.family===e?t:null}(t,e);if(!r)throw new Error('Expected node of type \"atom\" and family \"'+e+'\", but got '+(t?\"atom\"===t.type?\"atom of family \"+t.family:\"node of type \"+t.type:String(t)));return r}function Ft(t){return t&&(\"atom\"===t.type||X.hasOwnProperty(t.type))?t:null}var Vt={number:3,unit:\"mu\"},Ut={number:4,unit:\"mu\"},Gt={number:5,unit:\"mu\"},Xt={mord:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mop:{mord:Vt,mop:Vt,mrel:Gt,minner:Vt},mbin:{mord:Ut,mop:Ut,mopen:Ut,minner:Ut},mrel:{mord:Gt,mop:Gt,mopen:Gt,minner:Gt},mopen:{},mclose:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mpunct:{mord:Vt,mop:Vt,mrel:Gt,mopen:Vt,mclose:Vt,mpunct:Vt,minner:Vt},minner:{mord:Vt,mop:Vt,mbin:Ut,mrel:Gt,mopen:Vt,mpunct:Vt,minner:Vt}},Yt={mord:{mop:Vt},mop:{mord:Vt,mop:Vt},mbin:{},mrel:{},mopen:{},mclose:{mop:Vt},mpunct:{},minner:{mop:Vt}},_t={},Wt={},jt={};function $t(t){for(var e=t.type,r=(t.nodeType,t.names),a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs,argTypes:a.argTypes,greediness:void 0===a.greediness?1:a.greediness,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,consumeMode:a.consumeMode,handler:n},h=0;h<r.length;++h)_t[r[h]]=s;e&&(o&&(Wt[e]=o),i&&(jt[e]=i))}function Zt(t){$t({type:t.type,names:[],props:{numArgs:0},handler:function(){throw new Error(\"Should never be called.\")},htmlBuilder:t.htmlBuilder,mathmlBuilder:t.mathmlBuilder})}var Kt=function(t){var e=Pt(t,\"ordgroup\");return e?e.body:[t]},Jt=Lt.makeSpan,Qt=[\"leftmost\",\"mbin\",\"mopen\",\"mrel\",\"mop\",\"mpunct\"],te=[\"rightmost\",\"mrel\",\"mclose\",\"mpunct\"],ee={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT},re={mord:\"mord\",mop:\"mop\",mbin:\"mbin\",mrel:\"mrel\",mopen:\"mopen\",mclose:\"mclose\",mpunct:\"mpunct\",minner:\"minner\"},ae=function(t,e,r,a){void 0===a&&(a=[null,null]);for(var n=[],o=0;o<t.length;o++){var i=he(t[o],e);if(i instanceof T){var s=i.children;n.push.apply(n,s)}else n.push(i)}if(!r)return n;var h=e;if(1===t.length){var l=Pt(t[0],\"sizing\")||Pt(t[0],\"styling\");l&&(\"sizing\"===l.type?h=e.havingSize(l.size):\"styling\"===l.type&&(h=e.havingStyle(ee[l.style])))}var m=Jt([a[0]||\"leftmost\"],[],e),u=Jt([a[1]||\"rightmost\"],[],e);return ne(n,function(t,e){var r=e.classes[0],a=t.classes[0];\"mbin\"===r&&c.contains(te,a)?e.classes[0]=\"mord\":\"mbin\"===a&&c.contains(Qt,r)&&(t.classes[0]=\"mord\")},{node:m},u),ne(n,function(t,e){var r=ie(e),a=ie(t),n=r&&a?t.hasClass(\"mtight\")?Yt[r][a]:Xt[r][a]:null;if(n)return Lt.makeGlue(n,h)},{node:m},u),n},ne=function t(e,r,a,n){n&&e.push(n);for(var o=0;o<e.length;o++){var i=e[o],s=oe(i);if(s)t(s.children,r,a);else if(\"mspace\"!==i.classes[0]){var h=r(i,a.node);h&&(a.insertAfter?a.insertAfter(h):(e.unshift(h),o++)),a.node=i,a.insertAfter=function(t){return function(r){e.splice(t+1,0,r),o++}}(o)}}n&&e.pop()},oe=function(t){return t instanceof T||t instanceof I?t:null},ie=function(t,e){return t?(e&&(t=function t(e,r){var a=oe(e);if(a){var n=a.children;if(n.length){if(\"right\"===r)return t(n[n.length-1],\"right\");if(\"left\"===r)return t(n[0],\"left\")}}return e}(t,e)),re[t.classes[0]]||null):null},se=function(t,e){var r=[\"nulldelimiter\"].concat(t.baseSizingClasses());return Jt(e.concat(r))},he=function(t,e,r){if(!t)return Jt();if(Wt[t.type]){var a=Wt[t.type](t,e);if(r&&e.size!==r.size){a=Jt(e.sizingClasses(r),[a],e);var n=e.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new i(\"Got group of unknown type: '\"+t.type+\"'\")};function le(t,e){var r=Jt([\"base\"],t,e),a=Jt([\"strut\"]);return a.style.height=r.height+r.depth+\"em\",a.style.verticalAlign=-r.depth+\"em\",r.children.unshift(a),r}function me(t,e){var r=null;1===t.length&&\"tag\"===t[0].type&&(r=t[0].tag,t=t[0].body);for(var a,n=ae(t,e,!0),o=[],i=[],s=0;s<n.length;s++)if(i.push(n[s]),n[s].hasClass(\"mbin\")||n[s].hasClass(\"mrel\")||n[s].hasClass(\"allowbreak\")){for(var h=!1;s<n.length-1&&n[s+1].hasClass(\"mspace\")&&!n[s+1].hasClass(\"newline\");)s++,i.push(n[s]),n[s].hasClass(\"nobreak\")&&(h=!0);h||(o.push(le(i,e)),i=[])}else n[s].hasClass(\"newline\")&&(i.pop(),i.length>0&&(o.push(le(i,e)),i=[]),o.push(n[s]));i.length>0&&o.push(le(i,e)),r&&((a=le(ae(r,e,!0))).classes=[\"tag\"],o.push(a));var l=Jt([\"katex-html\"],o);if(l.setAttribute(\"aria-hidden\",\"true\"),a){var m=a.children[0];m.style.height=l.height+l.depth+\"em\",m.style.verticalAlign=-l.depth+\"em\"}return l}function ce(t){return new T(t)}var ue=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/1998/Math/MathML\",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t=\"<\"+this.type;for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=\" \"+e+'=\"',t+=c.escape(this.attributes[e]),t+='\"');t+=\">\";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+=\"</\"+this.type+\">\"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join(\"\")},t}(),de=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),pe={MathNode:ue,TextNode:de,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?\"\\u200a\":t>=.1666&&t<=.1667?\"\\u2009\":t>=.2222&&t<=.2223?\"\\u2005\":t>=.2777&&t<=.2778?\"\\u2005\\u200a\":t>=-.05556&&t<=-.05555?\"\\u200a\\u2063\":t>=-.1667&&t<=-.1666?\"\\u2009\\u2063\":t>=-.2223&&t<=-.2222?\"\\u205f\\u2063\":t>=-.2778&&t<=-.2777?\"\\u2005\\u2063\":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS(\"http://www.w3.org/1998/Math/MathML\",\"mspace\");return t.setAttribute(\"width\",this.width+\"em\"),t},e.toMarkup=function(){return this.character?\"<mtext>\"+this.character+\"</mtext>\":'<mspace width=\"'+this.width+'em\"/>'},e.toText=function(){return this.character?this.character:\" \"},t}(),newDocumentFragment:ce},fe=function(t,e,r){return!_[e][t]||!_[e][t].replace||55349===t.charCodeAt(0)||tt.hasOwnProperty(t)&&r&&(r.fontFamily&&\"tt\"===r.fontFamily.substr(4,2)||r.font&&\"tt\"===r.font.substr(4,2))||(t=_[e][t].replace),new pe.TextNode(t)},ge=function(t){return 1===t.length?t[0]:new pe.MathNode(\"mrow\",t)},xe=function(t,e){if(\"texttt\"===e.fontFamily)return\"monospace\";if(\"textsf\"===e.fontFamily)return\"textit\"===e.fontShape&&\"textbf\"===e.fontWeight?\"sans-serif-bold-italic\":\"textit\"===e.fontShape?\"sans-serif-italic\":\"textbf\"===e.fontWeight?\"bold-sans-serif\":\"sans-serif\";if(\"textit\"===e.fontShape&&\"textbf\"===e.fontWeight)return\"bold-italic\";if(\"textit\"===e.fontShape)return\"italic\";if(\"textbf\"===e.fontWeight)return\"bold\";var r=e.font;if(!r||\"mathnormal\"===r)return null;var a=t.mode;if(\"mathit\"===r)return\"italic\";if(\"boldsymbol\"===r)return\"bold-italic\";var n=t.text;return c.contains([\"\\\\imath\",\"\\\\jmath\"],n)?null:(_[a][n]&&_[a][n].replace&&(n=_[a][n].replace),V(n,Lt.fontMap[r].fontName,a)?Lt.fontMap[r].variant:null)},ve=function(t,e){for(var r,a=[],n=0;n<t.length;n++){var o=ye(t[n],e);if(o instanceof ue&&r instanceof ue){if(\"mtext\"===o.type&&\"mtext\"===r.type&&o.getAttribute(\"mathvariant\")===r.getAttribute(\"mathvariant\")){var i;(i=r.children).push.apply(i,o.children);continue}if(\"mn\"===o.type&&\"mn\"===r.type){var s;(s=r.children).push.apply(s,o.children);continue}if(\"mi\"===o.type&&1===o.children.length&&\"mn\"===r.type){var h=o.children[0];if(h instanceof de&&\".\"===h.text){var l;(l=r.children).push.apply(l,o.children);continue}}else if(\"mi\"===r.type&&1===r.children.length){var m=r.children[0];if(m instanceof de&&\"\\u0338\"===m.text&&(\"mo\"===o.type||\"mi\"===o.type||\"mn\"===o.type)){var c=o.children[0];c instanceof de&&c.text.length>0&&(c.text=c.text.slice(0,1)+\"\\u0338\"+c.text.slice(1),a.pop())}}}a.push(o),r=o}return a},be=function(t,e){return ge(ve(t,e))},ye=function(t,e){if(!t)return new pe.MathNode(\"mrow\");if(jt[t.type])return jt[t.type](t,e);throw new i(\"Got group of unknown type: '\"+t.type+\"'\")};var we=function(t){return new wt({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize})},ke=function(t,e){if(e.displayMode){var r=[\"katex-display\"];e.leqno&&r.push(\"leqno\"),e.fleqn&&r.push(\"fleqn\"),t=Lt.makeSpan(r,[t])}return t},Se=function(t,e,r){var a=we(r),n=function(t,e,r){var a,n=ve(t,r);a=1===n.length&&n[0]instanceof ue&&c.contains([\"mrow\",\"mtable\"],n[0].type)?n[0]:new pe.MathNode(\"mrow\",n);var o=new pe.MathNode(\"annotation\",[new pe.TextNode(e)]);o.setAttribute(\"encoding\",\"application/x-tex\");var i=new pe.MathNode(\"semantics\",[a,o]),s=new pe.MathNode(\"math\",[i]);return Lt.makeSpan([\"katex-mathml\"],[s])}(t,e,a),o=me(t,a),i=Lt.makeSpan([\"katex\"],[n,o]);return ke(i,r)},ze={widehat:\"^\",widecheck:\"\\u02c7\",widetilde:\"~\",utilde:\"~\",overleftarrow:\"\\u2190\",underleftarrow:\"\\u2190\",xleftarrow:\"\\u2190\",overrightarrow:\"\\u2192\",underrightarrow:\"\\u2192\",xrightarrow:\"\\u2192\",underbrace:\"\\u23df\",overbrace:\"\\u23de\",overgroup:\"\\u23e0\",undergroup:\"\\u23e1\",overleftrightarrow:\"\\u2194\",underleftrightarrow:\"\\u2194\",xleftrightarrow:\"\\u2194\",Overrightarrow:\"\\u21d2\",xRightarrow:\"\\u21d2\",overleftharpoon:\"\\u21bc\",xleftharpoonup:\"\\u21bc\",overrightharpoon:\"\\u21c0\",xrightharpoonup:\"\\u21c0\",xLeftarrow:\"\\u21d0\",xLeftrightarrow:\"\\u21d4\",xhookleftarrow:\"\\u21a9\",xhookrightarrow:\"\\u21aa\",xmapsto:\"\\u21a6\",xrightharpoondown:\"\\u21c1\",xleftharpoondown:\"\\u21bd\",xrightleftharpoons:\"\\u21cc\",xleftrightharpoons:\"\\u21cb\",xtwoheadleftarrow:\"\\u219e\",xtwoheadrightarrow:\"\\u21a0\",xlongequal:\"=\",xtofrom:\"\\u21c4\",xrightleftarrows:\"\\u21c4\",xrightequilibrium:\"\\u21cc\",xleftequilibrium:\"\\u21cb\"},Me={overrightarrow:[[\"rightarrow\"],.888,522,\"xMaxYMin\"],overleftarrow:[[\"leftarrow\"],.888,522,\"xMinYMin\"],underrightarrow:[[\"rightarrow\"],.888,522,\"xMaxYMin\"],underleftarrow:[[\"leftarrow\"],.888,522,\"xMinYMin\"],xrightarrow:[[\"rightarrow\"],1.469,522,\"xMaxYMin\"],xleftarrow:[[\"leftarrow\"],1.469,522,\"xMinYMin\"],Overrightarrow:[[\"doublerightarrow\"],.888,560,\"xMaxYMin\"],xRightarrow:[[\"doublerightarrow\"],1.526,560,\"xMaxYMin\"],xLeftarrow:[[\"doubleleftarrow\"],1.526,560,\"xMinYMin\"],overleftharpoon:[[\"leftharpoon\"],.888,522,\"xMinYMin\"],xleftharpoonup:[[\"leftharpoon\"],.888,522,\"xMinYMin\"],xleftharpoondown:[[\"leftharpoondown\"],.888,522,\"xMinYMin\"],overrightharpoon:[[\"rightharpoon\"],.888,522,\"xMaxYMin\"],xrightharpoonup:[[\"rightharpoon\"],.888,522,\"xMaxYMin\"],xrightharpoondown:[[\"rightharpoondown\"],.888,522,\"xMaxYMin\"],xlongequal:[[\"longequal\"],.888,334,\"xMinYMin\"],xtwoheadleftarrow:[[\"twoheadleftarrow\"],.888,334,\"xMinYMin\"],xtwoheadrightarrow:[[\"twoheadrightarrow\"],.888,334,\"xMaxYMin\"],overleftrightarrow:[[\"leftarrow\",\"rightarrow\"],.888,522],overbrace:[[\"leftbrace\",\"midbrace\",\"rightbrace\"],1.6,548],underbrace:[[\"leftbraceunder\",\"midbraceunder\",\"rightbraceunder\"],1.6,548],underleftrightarrow:[[\"leftarrow\",\"rightarrow\"],.888,522],xleftrightarrow:[[\"leftarrow\",\"rightarrow\"],1.75,522],xLeftrightarrow:[[\"doubleleftarrow\",\"doublerightarrow\"],1.75,560],xrightleftharpoons:[[\"leftharpoondownplus\",\"rightharpoonplus\"],1.75,716],xleftrightharpoons:[[\"leftharpoonplus\",\"rightharpoondownplus\"],1.75,716],xhookleftarrow:[[\"leftarrow\",\"righthook\"],1.08,522],xhookrightarrow:[[\"lefthook\",\"rightarrow\"],1.08,522],overlinesegment:[[\"leftlinesegment\",\"rightlinesegment\"],.888,522],underlinesegment:[[\"leftlinesegment\",\"rightlinesegment\"],.888,522],overgroup:[[\"leftgroup\",\"rightgroup\"],.888,342],undergroup:[[\"leftgroupunder\",\"rightgroupunder\"],.888,342],xmapsto:[[\"leftmapsto\",\"rightarrow\"],1.5,522],xtofrom:[[\"leftToFrom\",\"rightToFrom\"],1.75,528],xrightleftarrows:[[\"baraboveleftarrow\",\"rightarrowabovebar\"],1.75,901],xrightequilibrium:[[\"baraboveshortleftharpoon\",\"rightharpoonaboveshortbar\"],1.75,716],xleftequilibrium:[[\"shortbaraboveleftharpoon\",\"shortrightharpoonabovebar\"],1.75,716]},Te=function(t){return\"ordgroup\"===t.type?t.body.length:1},Ae=function(t,e,r,a){var n,o=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Lt.makeSpan([\"stretchy\",e],[],a),\"fbox\"===e){var i=a.color&&a.getColor();i&&(n.style.borderColor=i)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new H({x1:\"0\",y1:\"0\",x2:\"100%\",y2:\"100%\",\"stroke-width\":\"0.046em\"})),/^x?cancel$/.test(e)&&s.push(new H({x1:\"0\",y1:\"100%\",x2:\"100%\",y2:\"0\",\"stroke-width\":\"0.046em\"}));var h=new R(s,{width:\"100%\",height:o+\"em\"});n=Lt.makeSvgSpan([],[h],a)}return n.height=o,n.style.height=o+\"em\",n},Be=function(t){var e=new pe.MathNode(\"mo\",[new pe.TextNode(ze[t.substr(1)])]);return e.setAttribute(\"stretchy\",\"true\"),e},qe=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains([\"widehat\",\"widecheck\",\"widetilde\",\"utilde\"],a)){var n,o,i,s=Te(t.base);if(s>5)\"widehat\"===a||\"widecheck\"===a?(n=420,r=2364,i=.42,o=a+\"4\"):(n=312,r=2340,i=.34,o=\"tilde4\");else{var h=[1,1,2,2,3,3][s];\"widehat\"===a||\"widecheck\"===a?(r=[0,1062,2364,2364,2364][h],n=[0,239,300,360,420][h],i=[0,.24,.3,.3,.36,.42][h],o=a+h):(r=[0,600,1033,2339,2340][h],n=[0,260,286,306,312][h],i=[0,.26,.286,.3,.306,.34][h],o=\"tilde\"+h)}var l=new L(o),m=new R([l],{width:\"100%\",height:i+\"em\",viewBox:\"0 0 \"+r+\" \"+n,preserveAspectRatio:\"none\"});return{span:Lt.makeSvgSpan([],[m],e),minWidth:0,height:i}}var u,d,p=[],f=Me[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=[\"hide-tail\"],d=[f[3]];else if(2===y)u=[\"halfarrow-left\",\"halfarrow-right\"],d=[\"xMinYMin\",\"xMaxYMin\"];else{if(3!==y)throw new Error(\"Correct katexImagesData or update code here to support\\n \"+y+\" children.\");u=[\"brace-left\",\"brace-center\",\"brace-right\"],d=[\"xMinYMin\",\"xMidYMin\",\"xMaxYMin\"]}for(var w=0;w<y;w++){var k=new L(g[w]),S=new R([k],{width:\"400em\",height:b+\"em\",viewBox:\"0 0 \"+r+\" \"+v,preserveAspectRatio:d[w]+\" slice\"}),z=Lt.makeSvgSpan([u[w]],[S],e);if(1===y)return{span:z,minWidth:x,height:b};z.style.height=b+\"em\",p.push(z)}return{span:Lt.makeSpan([\"stretchy\"],p,e),minWidth:x,height:b}}(),a=r.span,n=r.minWidth,o=r.height;return a.height=o,a.style.height=o+\"em\",n>0&&(a.style.minWidth=n+\"em\"),a},Ce=function(t,e){var r,a,n,o=Pt(t,\"supsub\");o?(r=(a=Ht(o.base,\"accent\")).base,o.base=r,n=function(t){if(t instanceof N)return t;throw new Error(\"Expected span<HtmlDomNode> but got \"+String(t)+\".\")}(he(o,e)),o.base=a):r=(a=Ht(t,\"accent\")).base;var i=he(r,e.havingCrampedStyle()),s=0;if(a.isShifty&&c.isCharacterBox(r)){var h=c.getBaseElem(r);s=function(t){if(t instanceof E)return t;throw new Error(\"Expected symbolNode but got \"+String(t)+\".\")}(he(h,e.havingCrampedStyle())).skew}var l,m=Math.min(i.height,e.fontMetrics().xHeight);if(a.isStretchy)l=qe(a,e),l=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:i},{type:\"elem\",elem:l,wrapperClasses:[\"svg-align\"],wrapperStyle:s>0?{width:\"calc(100% - \"+2*s+\"em)\",marginLeft:2*s+\"em\"}:void 0}]},e);else{var u,d;\"\\\\vec\"===a.label?(u=Lt.staticSvg(\"vec\",e),d=Lt.svgData.vec[1]):((u=Lt.makeSymbol(a.label,\"Main-Regular\",a.mode,e)).italic=0,d=u.width),l=Lt.makeSpan([\"accent-body\"],[u]);var p=\"\\\\textcircled\"===a.label;p&&(l.classes.push(\"accent-full\"),m=i.height);var f=s;p||(f-=d/2),l.style.left=f+\"em\",\"\\\\textcircled\"===a.label&&(l.style.top=\".2em\"),l=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:i},{type:\"kern\",size:-m},{type:\"elem\",elem:l}]},e)}var g=Lt.makeSpan([\"mord\",\"accent\"],[l],e);return n?(n.children[0]=g,n.height=Math.max(g.height,n.height),n.classes[0]=\"mord\",n):g},Ne=function(t,e){var r=t.isStretchy?Be(t.label):new pe.MathNode(\"mo\",[fe(t.label,t.mode)]),a=new pe.MathNode(\"mover\",[ye(t.base,e),r]);return a.setAttribute(\"accent\",\"true\"),a},Ie=new RegExp([\"\\\\acute\",\"\\\\grave\",\"\\\\ddot\",\"\\\\tilde\",\"\\\\bar\",\"\\\\breve\",\"\\\\check\",\"\\\\hat\",\"\\\\vec\",\"\\\\dot\",\"\\\\mathring\"].map(function(t){return\"\\\\\"+t}).join(\"|\"));$t({type:\"accent\",names:[\"\\\\acute\",\"\\\\grave\",\"\\\\ddot\",\"\\\\tilde\",\"\\\\bar\",\"\\\\breve\",\"\\\\check\",\"\\\\hat\",\"\\\\vec\",\"\\\\dot\",\"\\\\mathring\",\"\\\\widecheck\",\"\\\\widehat\",\"\\\\widetilde\",\"\\\\overrightarrow\",\"\\\\overleftarrow\",\"\\\\Overrightarrow\",\"\\\\overleftrightarrow\",\"\\\\overgroup\",\"\\\\overlinesegment\",\"\\\\overleftharpoon\",\"\\\\overrightharpoon\"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!Ie.test(t.funcName),n=!a||\"\\\\widehat\"===t.funcName||\"\\\\widetilde\"===t.funcName||\"\\\\widecheck\"===t.funcName;return{type:\"accent\",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:\"accent\",names:[\"\\\\'\",\"\\\\`\",\"\\\\^\",\"\\\\~\",\"\\\\=\",\"\\\\u\",\"\\\\.\",'\\\\\"',\"\\\\r\",\"\\\\H\",\"\\\\v\",\"\\\\textcircled\"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:\"accent\",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:\"accentUnder\",names:[\"\\\\underleftarrow\",\"\\\\underrightarrow\",\"\\\\underleftrightarrow\",\"\\\\undergroup\",\"\\\\underlinesegment\",\"\\\\utilde\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"accentUnder\",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=he(t.base,e),a=qe(t,e),n=\"\\\\utilde\"===t.label?.12:0,o=Lt.makeVList({positionType:\"bottom\",positionData:a.height+n,children:[{type:\"elem\",elem:a,wrapperClasses:[\"svg-align\"]},{type:\"kern\",size:n},{type:\"elem\",elem:r}]},e);return Lt.makeSpan([\"mord\",\"accentunder\"],[o],e)},mathmlBuilder:function(t,e){var r=Be(t.label),a=new pe.MathNode(\"munder\",[ye(t.base,e),r]);return a.setAttribute(\"accentunder\",\"true\"),a}});var Oe=function(t){var e=new pe.MathNode(\"mpadded\",t?[t]:[]);return e.setAttribute(\"width\",\"+0.6em\"),e.setAttribute(\"lspace\",\"0.3em\"),e};$t({type:\"xArrow\",names:[\"\\\\xleftarrow\",\"\\\\xrightarrow\",\"\\\\xLeftarrow\",\"\\\\xRightarrow\",\"\\\\xleftrightarrow\",\"\\\\xLeftrightarrow\",\"\\\\xhookleftarrow\",\"\\\\xhookrightarrow\",\"\\\\xmapsto\",\"\\\\xrightharpoondown\",\"\\\\xrightharpoonup\",\"\\\\xleftharpoondown\",\"\\\\xleftharpoonup\",\"\\\\xrightleftharpoons\",\"\\\\xleftrightharpoons\",\"\\\\xlongequal\",\"\\\\xtwoheadrightarrow\",\"\\\\xtwoheadleftarrow\",\"\\\\xtofrom\",\"\\\\xrightleftarrows\",\"\\\\xrightequilibrium\",\"\\\\xleftequilibrium\"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:\"xArrow\",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),o=Lt.wrapFragment(he(t.body,n,e),e);o.classes.push(\"x-arrow-pad\"),t.below&&(n=e.havingStyle(a.sub()),(r=Lt.wrapFragment(he(t.below,n,e),e)).classes.push(\"x-arrow-pad\"));var i,s=qe(t,e),h=-e.fontMetrics().axisHeight+.5*s.height,l=-e.fontMetrics().axisHeight-.5*s.height-.111;if((o.depth>.25||\"\\\\xleftequilibrium\"===t.label)&&(l-=o.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;i=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:o,shift:l},{type:\"elem\",elem:s,shift:h},{type:\"elem\",elem:r,shift:m}]},e)}else i=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:o,shift:l},{type:\"elem\",elem:s,shift:h}]},e);return i.children[0].children[0].children[1].classes.push(\"svg-align\"),Lt.makeSpan([\"mrel\",\"x-arrow\"],[i],e)},mathmlBuilder:function(t,e){var r,a=Be(t.label);if(t.body){var n=Oe(ye(t.body,e));if(t.below){var o=Oe(ye(t.below,e));r=new pe.MathNode(\"munderover\",[a,o,n])}else r=new pe.MathNode(\"mover\",[a,n])}else if(t.below){var i=Oe(ye(t.below,e));r=new pe.MathNode(\"munder\",[a,i])}else r=Oe(),r=new pe.MathNode(\"mover\",[a,r]);return r}}),$t({type:\"textord\",names:[\"\\\\@char\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],\"ordgroup\").body,n=\"\",o=0;o<a.length;o++){n+=Ht(a[o],\"textord\").text}var s=parseInt(n);if(isNaN(s))throw new i(\"\\\\@char has non-numeric argument \"+n);return{type:\"textord\",mode:r.mode,text:String.fromCharCode(s)}}});var Ee=function(t,e){var r=ae(t.body,e.withColor(t.color),!1);return Lt.makeFragment(r)},Re=function(t,e){var r=ve(t.body,e.withColor(t.color)),a=new pe.MathNode(\"mstyle\",r);return a.setAttribute(\"mathcolor\",t.color),a};$t({type:\"color\",names:[\"\\\\textcolor\"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:[\"color\",\"original\"]},handler:function(t,e){var r=t.parser,a=Ht(e[0],\"color-token\").color,n=e[1];return{type:\"color\",mode:r.mode,color:a,body:Kt(n)}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:\"color\",names:[\"\\\\color\"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:[\"color\"]},handler:function(t,e){var r=t.parser,a=t.breakOnTokenText,n=Ht(e[0],\"color-token\").color,o=r.parseExpression(!0,a);return{type:\"color\",mode:r.mode,color:n,body:o}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:\"cr\",names:[\"\\\\cr\",\"\\\\newline\"],props:{numArgs:0,numOptionalArgs:1,argTypes:[\"size\"],allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=r[0],i=\"\\\\cr\"===n,s=!1;return i||(s=!a.settings.displayMode||!a.settings.useStrictBehavior(\"newLineInDisplayMode\",\"In LaTeX, \\\\\\\\ or \\\\newline does nothing in display mode\")),{type:\"cr\",mode:a.mode,newLine:s,newRow:i,size:o&&Ht(o,\"size\").value}},htmlBuilder:function(t,e){if(t.newRow)throw new i(\"\\\\cr valid only within a tabular/array environment\");var r=Lt.makeSpan([\"mspace\"],[],e);return t.newLine&&(r.classes.push(\"newline\"),t.size&&(r.style.marginTop=zt(t.size,e)+\"em\")),r},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mspace\");return t.newLine&&(r.setAttribute(\"linebreak\",\"newline\"),t.size&&r.setAttribute(\"height\",zt(t.size,e)+\"em\")),r}});var Le=function(t,e,r){var a=V(_.math[t]&&_.math[t].replace||t,e,r);if(!a)throw new Error(\"Unsupported symbol \"+t+\" and font size \"+e+\".\");return a},He=function(t,e,r,a){var n=r.havingBaseStyle(e),o=Lt.makeSpan(a.concat(n.sizingClasses(r)),[t],r),i=n.sizeMultiplier/r.sizeMultiplier;return o.height*=i,o.depth*=i,o.maxFontSize=n.sizeMultiplier,o},Pe=function(t,e,r){var a=e.havingBaseStyle(r),n=(1-e.sizeMultiplier/a.sizeMultiplier)*e.fontMetrics().axisHeight;t.classes.push(\"delimcenter\"),t.style.top=n+\"em\",t.height-=n,t.depth+=n},De=function(t,e,r,a,n,o){var i=function(t,e,r,a){return Lt.makeSymbol(t,\"Size\"+e+\"-Regular\",r,a)}(t,e,n,a),s=He(Lt.makeSpan([\"delimsizing\",\"size\"+e],[i],a),w.TEXT,a,o);return r&&Pe(s,a,w.TEXT),s},Fe=function(t,e,r){var a;return a=\"Size1-Regular\"===e?\"delim-size1\":\"delim-size4\",{type:\"elem\",elem:Lt.makeSpan([\"delimsizinginner\",a],[Lt.makeSpan([],[Lt.makeSymbol(t,e,r)])])}},Ve=function(t,e,r,a,n,o){var i,s,h,l;i=h=l=t,s=null;var m=\"Size1-Regular\";\"\\\\uparrow\"===t?h=l=\"\\u23d0\":\"\\\\Uparrow\"===t?h=l=\"\\u2016\":\"\\\\downarrow\"===t?i=h=\"\\u23d0\":\"\\\\Downarrow\"===t?i=h=\"\\u2016\":\"\\\\updownarrow\"===t?(i=\"\\\\uparrow\",h=\"\\u23d0\",l=\"\\\\downarrow\"):\"\\\\Updownarrow\"===t?(i=\"\\\\Uparrow\",h=\"\\u2016\",l=\"\\\\Downarrow\"):\"[\"===t||\"\\\\lbrack\"===t?(i=\"\\u23a1\",h=\"\\u23a2\",l=\"\\u23a3\",m=\"Size4-Regular\"):\"]\"===t||\"\\\\rbrack\"===t?(i=\"\\u23a4\",h=\"\\u23a5\",l=\"\\u23a6\",m=\"Size4-Regular\"):\"\\\\lfloor\"===t||\"\\u230a\"===t?(h=i=\"\\u23a2\",l=\"\\u23a3\",m=\"Size4-Regular\"):\"\\\\lceil\"===t||\"\\u2308\"===t?(i=\"\\u23a1\",h=l=\"\\u23a2\",m=\"Size4-Regular\"):\"\\\\rfloor\"===t||\"\\u230b\"===t?(h=i=\"\\u23a5\",l=\"\\u23a6\",m=\"Size4-Regular\"):\"\\\\rceil\"===t||\"\\u2309\"===t?(i=\"\\u23a4\",h=l=\"\\u23a5\",m=\"Size4-Regular\"):\"(\"===t||\"\\\\lparen\"===t?(i=\"\\u239b\",h=\"\\u239c\",l=\"\\u239d\",m=\"Size4-Regular\"):\")\"===t||\"\\\\rparen\"===t?(i=\"\\u239e\",h=\"\\u239f\",l=\"\\u23a0\",m=\"Size4-Regular\"):\"\\\\{\"===t||\"\\\\lbrace\"===t?(i=\"\\u23a7\",s=\"\\u23a8\",l=\"\\u23a9\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\}\"===t||\"\\\\rbrace\"===t?(i=\"\\u23ab\",s=\"\\u23ac\",l=\"\\u23ad\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\lgroup\"===t||\"\\u27ee\"===t?(i=\"\\u23a7\",l=\"\\u23a9\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\rgroup\"===t||\"\\u27ef\"===t?(i=\"\\u23ab\",l=\"\\u23ad\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\lmoustache\"===t||\"\\u23b0\"===t?(i=\"\\u23a7\",l=\"\\u23ad\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\rmoustache\"!==t&&\"\\u23b1\"!==t||(i=\"\\u23ab\",l=\"\\u23a9\",h=\"\\u23aa\",m=\"Size4-Regular\");var c=Le(i,m,n),u=c.height+c.depth,d=Le(h,m,n),p=d.height+d.depth,f=Le(l,m,n),g=f.height+f.depth,x=0,v=1;if(null!==s){var b=Le(s,m,n);x=b.height+b.depth,v=2}var y=u+g+x,k=Math.ceil((e-y)/(v*p)),S=y+k*v*p,z=a.fontMetrics().axisHeight;r&&(z*=a.sizeMultiplier);var M=S/2-z,T=[];if(T.push(Fe(l,m,n)),null===s)for(var A=0;A<k;A++)T.push(Fe(h,m,n));else{for(var B=0;B<k;B++)T.push(Fe(h,m,n));T.push(Fe(s,m,n));for(var q=0;q<k;q++)T.push(Fe(h,m,n))}T.push(Fe(i,m,n));var C=a.havingBaseStyle(w.TEXT),N=Lt.makeVList({positionType:\"bottom\",positionData:M,children:T},C);return He(Lt.makeSpan([\"delimsizing\",\"mult\"],[N],C),w.TEXT,a,o)},Ue=function(t,e,r,a){var n;\"sqrtTall\"===t&&(n=\"M702 80H400000v40H742v\"+(r-54-80)+\"l-4 4-4 4c-.667.7\\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 80H400000v40H742z\");var o=new L(t,n),i=new R([o],{width:\"400em\",height:e+\"em\",viewBox:\"0 0 400000 \"+r,preserveAspectRatio:\"xMinYMin slice\"});return Lt.makeSvgSpan([\"hide-tail\"],[i],a)},Ge=[\"(\",\"\\\\lparen\",\")\",\"\\\\rparen\",\"[\",\"\\\\lbrack\",\"]\",\"\\\\rbrack\",\"\\\\{\",\"\\\\lbrace\",\"\\\\}\",\"\\\\rbrace\",\"\\\\lfloor\",\"\\\\rfloor\",\"\\u230a\",\"\\u230b\",\"\\\\lceil\",\"\\\\rceil\",\"\\u2308\",\"\\u2309\",\"\\\\surd\"],Xe=[\"\\\\uparrow\",\"\\\\downarrow\",\"\\\\updownarrow\",\"\\\\Uparrow\",\"\\\\Downarrow\",\"\\\\Updownarrow\",\"|\",\"\\\\|\",\"\\\\vert\",\"\\\\Vert\",\"\\\\lvert\",\"\\\\rvert\",\"\\\\lVert\",\"\\\\rVert\",\"\\\\lgroup\",\"\\\\rgroup\",\"\\u27ee\",\"\\u27ef\",\"\\\\lmoustache\",\"\\\\rmoustache\",\"\\u23b0\",\"\\u23b1\"],Ye=[\"<\",\">\",\"\\\\langle\",\"\\\\rangle\",\"/\",\"\\\\backslash\",\"\\\\lt\",\"\\\\gt\"],_e=[0,1.2,1.8,2.4,3],We=[{type:\"small\",style:w.SCRIPTSCRIPT},{type:\"small\",style:w.SCRIPT},{type:\"small\",style:w.TEXT},{type:\"large\",size:1},{type:\"large\",size:2},{type:\"large\",size:3},{type:\"large\",size:4}],je=[{type:\"small\",style:w.SCRIPTSCRIPT},{type:\"small\",style:w.SCRIPT},{type:\"small\",style:w.TEXT},{type:\"stack\"}],$e=[{type:\"small\",style:w.SCRIPTSCRIPT},{type:\"small\",style:w.SCRIPT},{type:\"small\",style:w.TEXT},{type:\"large\",size:1},{type:\"large\",size:2},{type:\"large\",size:3},{type:\"large\",size:4},{type:\"stack\"}],Ze=function(t){if(\"small\"===t.type)return\"Main-Regular\";if(\"large\"===t.type)return\"Size\"+t.size+\"-Regular\";if(\"stack\"===t.type)return\"Size4-Regular\";throw new Error(\"Add support for delim type '\"+t.type+\"' here.\")},Ke=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&\"stack\"!==r[n].type;n++){var o=Le(t,Ze(r[n]),\"math\"),i=o.height+o.depth;if(\"small\"===r[n].type&&(i*=a.havingBaseStyle(r[n].style).sizeMultiplier),i>e)return r[n]}return r[r.length-1]},Je=function(t,e,r,a,n,o){var i;\"<\"===t||\"\\\\lt\"===t||\"\\u27e8\"===t?t=\"\\\\langle\":\">\"!==t&&\"\\\\gt\"!==t&&\"\\u27e9\"!==t||(t=\"\\\\rangle\"),i=c.contains(Ye,t)?We:c.contains(Ge,t)?$e:je;var s=Ke(t,e,i,a);return\"small\"===s.type?function(t,e,r,a,n,o){var i=Lt.makeSymbol(t,\"Main-Regular\",n,a),s=He(i,e,a,o);return r&&Pe(s,a,e),s}(t,s.style,r,a,n,o):\"large\"===s.type?De(t,s.size,r,a,n,o):Ve(t,e,r,a,n,o)},Qe=function(t,e){var r,a,n=e.havingBaseSizing(),o=Ke(\"\\\\surd\",t*n.sizeMultiplier,$e,n),i=n.sizeMultiplier,s=0,h=0,l=0;return\"small\"===o.type?(t<1?i=1:t<1.4&&(i=.7),h=1/i,(r=Ue(\"sqrtMain\",s=1.08/i,l=1080,e)).style.minWidth=\"0.853em\",a=.833/i):\"large\"===o.type?(l=1080*_e[o.size],h=_e[o.size]/i,s=(_e[o.size]+.08)/i,(r=Ue(\"sqrtSize\"+o.size,s,l,e)).style.minWidth=\"1.02em\",a=1/i):(s=t+.08,h=t,l=Math.floor(1e3*t)+80,(r=Ue(\"sqrtTall\",s,l,e)).style.minWidth=\"0.742em\",a=1.056),r.height=h,r.style.height=s+\"em\",{span:r,advanceWidth:a,ruleWidth:e.fontMetrics().sqrtRuleThickness*i}},tr=function(t,e,r,a,n){if(\"<\"===t||\"\\\\lt\"===t||\"\\u27e8\"===t?t=\"\\\\langle\":\">\"!==t&&\"\\\\gt\"!==t&&\"\\u27e9\"!==t||(t=\"\\\\rangle\"),c.contains(Ge,t)||c.contains(Ye,t))return De(t,e,!1,r,a,n);if(c.contains(Xe,t))return Ve(t,_e[e],!1,r,a,n);throw new i(\"Illegal delimiter: '\"+t+\"'\")},er=Je,rr=function(t,e,r,a,n,o){var i=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,h=Math.max(e-i,r+i),l=Math.max(h/500*901,2*h-s);return Je(t,l,!0,a,n,o)},ar={\"\\\\bigl\":{mclass:\"mopen\",size:1},\"\\\\Bigl\":{mclass:\"mopen\",size:2},\"\\\\biggl\":{mclass:\"mopen\",size:3},\"\\\\Biggl\":{mclass:\"mopen\",size:4},\"\\\\bigr\":{mclass:\"mclose\",size:1},\"\\\\Bigr\":{mclass:\"mclose\",size:2},\"\\\\biggr\":{mclass:\"mclose\",size:3},\"\\\\Biggr\":{mclass:\"mclose\",size:4},\"\\\\bigm\":{mclass:\"mrel\",size:1},\"\\\\Bigm\":{mclass:\"mrel\",size:2},\"\\\\biggm\":{mclass:\"mrel\",size:3},\"\\\\Biggm\":{mclass:\"mrel\",size:4},\"\\\\big\":{mclass:\"mord\",size:1},\"\\\\Big\":{mclass:\"mord\",size:2},\"\\\\bigg\":{mclass:\"mord\",size:3},\"\\\\Bigg\":{mclass:\"mord\",size:4}},nr=[\"(\",\"\\\\lparen\",\")\",\"\\\\rparen\",\"[\",\"\\\\lbrack\",\"]\",\"\\\\rbrack\",\"\\\\{\",\"\\\\lbrace\",\"\\\\}\",\"\\\\rbrace\",\"\\\\lfloor\",\"\\\\rfloor\",\"\\u230a\",\"\\u230b\",\"\\\\lceil\",\"\\\\rceil\",\"\\u2308\",\"\\u2309\",\"<\",\">\",\"\\\\langle\",\"\\u27e8\",\"\\\\rangle\",\"\\u27e9\",\"\\\\lt\",\"\\\\gt\",\"\\\\lvert\",\"\\\\rvert\",\"\\\\lVert\",\"\\\\rVert\",\"\\\\lgroup\",\"\\\\rgroup\",\"\\u27ee\",\"\\u27ef\",\"\\\\lmoustache\",\"\\\\rmoustache\",\"\\u23b0\",\"\\u23b1\",\"/\",\"\\\\backslash\",\"|\",\"\\\\vert\",\"\\\\|\",\"\\\\Vert\",\"\\\\uparrow\",\"\\\\Uparrow\",\"\\\\downarrow\",\"\\\\Downarrow\",\"\\\\updownarrow\",\"\\\\Updownarrow\",\".\"];function or(t,e){var r=Ft(t);if(r&&c.contains(nr,r.text))return r;throw new i(\"Invalid delimiter: '\"+(r?r.text:JSON.stringify(t))+\"' after '\"+e.funcName+\"'\",t)}function ir(t){if(!t.body)throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\")}$t({type:\"delimsizing\",names:[\"\\\\bigl\",\"\\\\Bigl\",\"\\\\biggl\",\"\\\\Biggl\",\"\\\\bigr\",\"\\\\Bigr\",\"\\\\biggr\",\"\\\\Biggr\",\"\\\\bigm\",\"\\\\Bigm\",\"\\\\biggm\",\"\\\\Biggm\",\"\\\\big\",\"\\\\Big\",\"\\\\bigg\",\"\\\\Bigg\"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);return{type:\"delimsizing\",mode:t.parser.mode,size:ar[t.funcName].size,mclass:ar[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return\".\"===t.delim?Lt.makeSpan([t.mclass]):tr(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];\".\"!==t.delim&&e.push(fe(t.delim,t.mode));var r=new pe.MathNode(\"mo\",e);return\"mopen\"===t.mclass||\"mclose\"===t.mclass?r.setAttribute(\"fence\",\"true\"):r.setAttribute(\"fence\",\"false\"),r}}),$t({type:\"leftright-right\",names:[\"\\\\right\"],props:{numArgs:1},handler:function(t,e){return{type:\"leftright-right\",mode:t.parser.mode,delim:or(e[0],t).text}}}),$t({type:\"leftright\",names:[\"\\\\left\"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect(\"\\\\right\",!1);var o=Ht(a.parseFunction(),\"leftright-right\");return{type:\"leftright\",mode:a.mode,body:n,left:r.text,right:o.delim}},htmlBuilder:function(t,e){ir(t);for(var r,a,n=ae(t.body,e,!0,[\"mopen\",\"mclose\"]),o=0,i=0,s=!1,h=0;h<n.length;h++)n[h].isMiddle?s=!0:(o=Math.max(n[h].height,o),i=Math.max(n[h].depth,i));if(o*=e.sizeMultiplier,i*=e.sizeMultiplier,r=\".\"===t.left?se(e,[\"mopen\"]):rr(t.left,o,i,e,t.mode,[\"mopen\"]),n.unshift(r),s)for(var l=1;l<n.length;l++){var m=n[l].isMiddle;m&&(n[l]=rr(m.delim,o,i,m.options,t.mode,[]))}return a=\".\"===t.right?se(e,[\"mclose\"]):rr(t.right,o,i,e,t.mode,[\"mclose\"]),n.push(a),Lt.makeSpan([\"minner\"],n,e)},mathmlBuilder:function(t,e){ir(t);var r=ve(t.body,e);if(\".\"!==t.left){var a=new pe.MathNode(\"mo\",[fe(t.left,t.mode)]);a.setAttribute(\"fence\",\"true\"),r.unshift(a)}if(\".\"!==t.right){var n=new pe.MathNode(\"mo\",[fe(t.right,t.mode)]);n.setAttribute(\"fence\",\"true\"),r.push(n)}return ge(r)}}),$t({type:\"middle\",names:[\"\\\\middle\"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);if(!t.parser.leftrightDepth)throw new i(\"\\\\middle without preceding \\\\left\",r);return{type:\"middle\",mode:t.parser.mode,delim:r.text}},htmlBuilder:function(t,e){var r;if(\".\"===t.delim)r=se(e,[]);else{r=tr(t.delim,1,e,t.mode,[]);var a={delim:t.delim,options:e};r.isMiddle=a}return r},mathmlBuilder:function(t,e){var r=\"\\\\vert\"===t.delim||\"|\"===t.delim?fe(\"|\",\"text\"):fe(t.delim,t.mode),a=new pe.MathNode(\"mo\",[r]);return a.setAttribute(\"fence\",\"true\"),a.setAttribute(\"lspace\",\"0.05em\"),a.setAttribute(\"rspace\",\"0.05em\"),a}});var sr=function(t,e){var r,a,n=Lt.wrapFragment(he(t.body,e),e),o=t.label.substr(1),i=e.sizeMultiplier,s=0,h=c.isCharacterBox(t.body);if(\"sout\"===o)(r=Lt.makeSpan([\"stretchy\",\"sout\"])).height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else{/cancel/.test(o)?h||n.classes.push(\"cancel-pad\"):n.classes.push(\"boxpad\");var l=0;l=/box/.test(o)?\"colorbox\"===o?.3:.34:h?.2:0,r=Ae(n,o,l,e),s=n.depth+l,t.backgroundColor&&(r.style.backgroundColor=t.backgroundColor,t.borderColor&&(r.style.borderColor=t.borderColor))}return a=t.backgroundColor?Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:r,shift:s},{type:\"elem\",elem:n,shift:0}]},e):Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:n,shift:0},{type:\"elem\",elem:r,shift:s,wrapperClasses:/cancel/.test(o)?[\"svg-align\"]:[]}]},e),/cancel/.test(o)&&(a.height=n.height,a.depth=n.depth),/cancel/.test(o)&&!h?Lt.makeSpan([\"mord\",\"cancel-lap\"],[a],e):Lt.makeSpan([\"mord\"],[a],e)},hr=function(t,e){var r=new pe.MathNode(t.label.indexOf(\"colorbox\")>-1?\"mpadded\":\"menclose\",[ye(t.body,e)]);switch(t.label){case\"\\\\cancel\":r.setAttribute(\"notation\",\"updiagonalstrike\");break;case\"\\\\bcancel\":r.setAttribute(\"notation\",\"downdiagonalstrike\");break;case\"\\\\sout\":r.setAttribute(\"notation\",\"horizontalstrike\");break;case\"\\\\fbox\":r.setAttribute(\"notation\",\"box\");break;case\"\\\\fcolorbox\":case\"\\\\colorbox\":if(r.setAttribute(\"width\",\"+6pt\"),r.setAttribute(\"height\",\"+6pt\"),r.setAttribute(\"lspace\",\"3pt\"),r.setAttribute(\"voffset\",\"3pt\"),\"\\\\fcolorbox\"===t.label){var a=e.fontMetrics().defaultRuleThickness;r.setAttribute(\"style\",\"border: \"+a+\"em solid \"+String(t.borderColor))}break;case\"\\\\xcancel\":r.setAttribute(\"notation\",\"updiagonalstrike downdiagonalstrike\")}return t.backgroundColor&&r.setAttribute(\"mathbackground\",t.backgroundColor),r};$t({type:\"enclose\",names:[\"\\\\colorbox\"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:[\"color\",\"text\"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],\"color-token\").color,i=e[1];return{type:\"enclose\",mode:a.mode,label:n,backgroundColor:o,body:i}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:\"enclose\",names:[\"\\\\fcolorbox\"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:[\"color\",\"color\",\"text\"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],\"color-token\").color,i=Ht(e[1],\"color-token\").color,s=e[2];return{type:\"enclose\",mode:a.mode,label:n,backgroundColor:i,borderColor:o,body:s}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:\"enclose\",names:[\"\\\\fbox\"],props:{numArgs:1,argTypes:[\"text\"],allowedInText:!0},handler:function(t,e){return{type:\"enclose\",mode:t.parser.mode,label:\"\\\\fbox\",body:e[0]}}}),$t({type:\"enclose\",names:[\"\\\\cancel\",\"\\\\bcancel\",\"\\\\xcancel\",\"\\\\sout\"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=e[0];return{type:\"enclose\",mode:a.mode,label:n,body:o}},htmlBuilder:sr,mathmlBuilder:hr});var lr={};function mr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},h=0;h<r.length;++h)lr[r[h]]=s;o&&(Wt[e]=o),i&&(jt[e]=i)}function cr(t){var e=[];t.consumeSpaces();for(var r=t.nextToken.text;\"\\\\hline\"===r||\"\\\\hdashline\"===r;)t.consume(),e.push(\"\\\\hdashline\"===r),t.consumeSpaces(),r=t.nextToken.text;return e}function ur(t,e,r){var a=e.hskipBeforeAndAfter,n=e.addJot,o=e.cols,s=e.arraystretch,h=e.colSeparationType;if(t.gullet.beginGroup(),t.gullet.macros.set(\"\\\\\\\\\",\"\\\\cr\"),!s){var l=t.gullet.expandMacroAsText(\"\\\\arraystretch\");if(null==l)s=1;else if(!(s=parseFloat(l))||s<0)throw new i(\"Invalid \\\\arraystretch: \"+l)}var m=[],c=[m],u=[],d=[];for(d.push(cr(t));;){var p=t.parseExpression(!1,\"\\\\cr\");p={type:\"ordgroup\",mode:t.mode,body:p},r&&(p={type:\"styling\",mode:t.mode,style:r,body:[p]}),m.push(p);var f=t.nextToken.text;if(\"&\"===f)t.consume();else{if(\"\\\\end\"===f){1===m.length&&\"styling\"===p.type&&0===p.body[0].body.length&&c.pop(),d.length<c.length+1&&d.push([]);break}if(\"\\\\cr\"!==f)throw new i(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\",t.nextToken);var g=Ht(t.parseFunction(),\"cr\");u.push(g.size),d.push(cr(t)),m=[],c.push(m)}}return t.gullet.endGroup(),{type:\"array\",mode:t.mode,addJot:n,arraystretch:s,body:c,cols:o,rowGaps:u,hskipBeforeAndAfter:a,hLinesBeforeRow:d,colSeparationType:h}}function dr(t){return\"d\"===t.substr(0,1)?\"display\":\"text\"}var pr=function(t,e){var r,a,n=t.body.length,o=t.hLinesBeforeRow,s=0,h=new Array(n),l=[],m=1/e.fontMetrics().ptPerEm,u=5*m,d=12*m,p=3*m,f=t.arraystretch*d,g=.7*f,x=.3*f,v=0;function b(t){for(var e=0;e<t.length;++e)e>0&&(v+=.25),l.push({pos:v,isDashed:t[e]})}for(b(o[0]),r=0;r<t.body.length;++r){var y=t.body[r],w=g,k=x;s<y.length&&(s=y.length);var S=new Array(y.length);for(a=0;a<y.length;++a){var z=he(y[a],e);k<z.depth&&(k=z.depth),w<z.height&&(w=z.height),S[a]=z}var M=t.rowGaps[r],T=0;M&&(T=zt(M,e))>0&&(k<(T+=x)&&(k=T),T=0),t.addJot&&(k+=p),S.height=w,S.depth=k,v+=w,S.pos=v,v+=k+T,h[r]=S,b(o[r+1])}var A,B,q=v/2+e.fontMetrics().axisHeight,C=t.cols||[],N=[];for(a=0,B=0;a<s||B<C.length;++a,++B){for(var I=C[B]||{},O=!0;\"separator\"===I.type;){if(O||((A=Lt.makeSpan([\"arraycolsep\"],[])).style.width=e.fontMetrics().doubleRuleSep+\"em\",N.push(A)),\"|\"===I.separator){var E=Lt.makeSpan([\"vertical-separator\"],[],e);E.style.height=v+\"em\",E.style.verticalAlign=-(v-q)+\"em\",N.push(E)}else{if(\":\"!==I.separator)throw new i(\"Invalid separator type: \"+I.separator);var R=Lt.makeSpan([\"vertical-separator\",\"vs-dashed\"],[],e);R.style.height=v+\"em\",R.style.verticalAlign=-(v-q)+\"em\",N.push(R)}I=C[++B]||{},O=!1}if(!(a>=s)){var L=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.pregap,u))&&((A=Lt.makeSpan([\"arraycolsep\"],[])).style.width=L+\"em\",N.push(A));var H=[];for(r=0;r<n;++r){var P=h[r],D=P[a];if(D){var F=P.pos-q;D.depth=P.depth,D.height=P.height,H.push({type:\"elem\",elem:D,shift:F})}}H=Lt.makeVList({positionType:\"individualShift\",children:H},e),H=Lt.makeSpan([\"col-align-\"+(I.align||\"c\")],[H]),N.push(H),(a<s-1||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.postgap,u))&&((A=Lt.makeSpan([\"arraycolsep\"],[])).style.width=L+\"em\",N.push(A))}}if(h=Lt.makeSpan([\"mtable\"],N),l.length>0){for(var V=Lt.makeLineSpan(\"hline\",e,.05),U=Lt.makeLineSpan(\"hdashline\",e,.05),G=[{type:\"elem\",elem:h,shift:0}];l.length>0;){var X=l.pop(),Y=X.pos-q;X.isDashed?G.push({type:\"elem\",elem:U,shift:Y}):G.push({type:\"elem\",elem:V,shift:Y})}h=Lt.makeVList({positionType:\"individualShift\",children:G},e)}return Lt.makeSpan([\"mord\"],[h],e)},fr={c:\"center \",l:\"left \",r:\"right \"},gr=function(t,e){var r=new pe.MathNode(\"mtable\",t.body.map(function(t){return new pe.MathNode(\"mtr\",t.map(function(t){return new pe.MathNode(\"mtd\",[ye(t,e)])}))})),a=.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute(\"rowspacing\",a+\"em\");var n=\"\",o=\"\";if(t.cols){var i=t.cols,s=\"\",h=!1,l=0,m=i.length;\"separator\"===i[0].type&&(n+=\"top \",l=1),\"separator\"===i[i.length-1].type&&(n+=\"bottom \",m-=1);for(var c=l;c<m;c++)\"align\"===i[c].type?(o+=fr[i[c].align],h&&(s+=\"none \"),h=!0):\"separator\"===i[c].type&&h&&(s+=\"|\"===i[c].separator?\"solid \":\"dashed \",h=!1);r.setAttribute(\"columnalign\",o.trim()),/[sd]/.test(s)&&r.setAttribute(\"columnlines\",s.trim())}if(\"align\"===t.colSeparationType){for(var u=t.cols||[],d=\"\",p=1;p<u.length;p++)d+=p%2?\"0em \":\"1em \";r.setAttribute(\"columnspacing\",d.trim())}else\"alignat\"===t.colSeparationType?r.setAttribute(\"columnspacing\",\"0em\"):r.setAttribute(\"columnspacing\",\"1em\");var f=\"\",g=t.hLinesBeforeRow;n+=g[0].length>0?\"left \":\"\",n+=g[g.length-1].length>0?\"right \":\"\";for(var x=1;x<g.length-1;x++)f+=0===g[x].length?\"none \":g[x][0]?\"dashed \":\"solid \";if(/[sd]/.test(f)&&r.setAttribute(\"rowlines\",f.trim()),\"\"===n)return r;var v=new pe.MathNode(\"menclose\",[r]);return v.setAttribute(\"notation\",n.trim()),v},xr=function(t,e){var r,a=[],n=ur(t.parser,{cols:a,addJot:!0},\"display\"),o=0,s={type:\"ordgroup\",mode:t.mode,body:[]},h=Pt(e[0],\"ordgroup\");if(h){for(var l=\"\",m=0;m<h.body.length;m++){l+=Ht(h.body[m],\"textord\").text}r=Number(l),o=2*r}var c=!o;n.body.forEach(function(t){for(var e=1;e<t.length;e+=2){var a=Ht(t[e],\"styling\");Ht(a.body[0],\"ordgroup\").body.unshift(s)}if(c)o<t.length&&(o=t.length);else{var n=t.length/2;if(r<n)throw new i(\"Too many math in a row: expected \"+r+\", but got \"+n,t[0])}});for(var u=0;u<o;++u){var d=\"r\",p=0;u%2==1?d=\"l\":u>0&&c&&(p=1),a[u]={type:\"align\",align:d,pregap:p,postgap:0}}return n.colSeparationType=c?\"align\":\"alignat\",n};mr({type:\"array\",names:[\"array\",\"darray\"],props:{numArgs:1},handler:function(t,e){var r={cols:(Ft(e[0])?[e[0]]:Ht(e[0],\"ordgroup\").body).map(function(t){var e=function(t){var e=Ft(t);if(!e)throw new Error(\"Expected node of symbol group type, but got \"+(t?\"node of type \"+t.type:String(t)));return e}(t).text;if(-1!==\"lcr\".indexOf(e))return{type:\"align\",align:e};if(\"|\"===e)return{type:\"separator\",separator:\"|\"};if(\":\"===e)return{type:\"separator\",separator:\":\"};throw new i(\"Unknown column alignment: \"+e,t)}),hskipBeforeAndAfter:!0};return ur(t.parser,r,dr(t.envName))},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"matrix\",\"pmatrix\",\"bmatrix\",\"Bmatrix\",\"vmatrix\",\"Vmatrix\"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:[\"(\",\")\"],bmatrix:[\"[\",\"]\"],Bmatrix:[\"\\\\{\",\"\\\\}\"],vmatrix:[\"|\",\"|\"],Vmatrix:[\"\\\\Vert\",\"\\\\Vert\"]}[t.envName],r=ur(t.parser,{hskipBeforeAndAfter:!1},dr(t.envName));return e?{type:\"leftright\",mode:t.mode,body:[r],left:e[0],right:e[1]}:r},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"cases\",\"dcases\"],props:{numArgs:0},handler:function(t){var e=ur(t.parser,{arraystretch:1.2,cols:[{type:\"align\",align:\"l\",pregap:0,postgap:1},{type:\"align\",align:\"l\",pregap:0,postgap:0}]},dr(t.envName));return{type:\"leftright\",mode:t.mode,body:[e],left:\"\\\\{\",right:\".\"}},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"aligned\"],props:{numArgs:0},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"gathered\"],props:{numArgs:0},handler:function(t){return ur(t.parser,{cols:[{type:\"align\",align:\"c\"}],addJot:!0},\"display\")},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"alignedat\"],props:{numArgs:1},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),$t({type:\"text\",names:[\"\\\\hline\",\"\\\\hdashline\"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new i(t.funcName+\" valid only within array environment\")}});var vr=lr;$t({type:\"environment\",names:[\"\\\\begin\",\"\\\\end\"],props:{numArgs:1,argTypes:[\"text\"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if(\"ordgroup\"!==n.type)throw new i(\"Invalid environment name\",n);for(var o=\"\",s=0;s<n.body.length;++s)o+=Ht(n.body[s],\"textord\").text;if(\"\\\\begin\"===a){if(!vr.hasOwnProperty(o))throw new i(\"No such environment: \"+o,n);var h=vr[o],l=r.parseArguments(\"\\\\begin{\"+o+\"}\",h),m=l.args,c=l.optArgs,u={mode:r.mode,envName:o,parser:r},d=h.handler(u,m,c);r.expect(\"\\\\end\",!1);var p=r.nextToken,f=Ht(r.parseFunction(),\"environment\");if(f.name!==o)throw new i(\"Mismatch: \\\\begin{\"+o+\"} matched by \\\\end{\"+f.name+\"}\",p);return d}return{type:\"environment\",mode:r.mode,name:o,nameGroup:n}}});var br=Lt.makeSpan;function yr(t,e){var r=ae(t.body,e,!0);return br([t.mclass],r,e)}function wr(t,e){var r=ve(t.body,e);return pe.newDocumentFragment(r)}$t({type:\"mclass\",names:[\"\\\\mathord\",\"\\\\mathbin\",\"\\\\mathrel\",\"\\\\mathopen\",\"\\\\mathclose\",\"\\\\mathpunct\",\"\\\\mathinner\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"mclass\",mode:r.mode,mclass:\"m\"+a.substr(5),body:Kt(n)}},htmlBuilder:yr,mathmlBuilder:wr});var kr=function(t){var e=\"ordgroup\"===t.type&&t.body.length?t.body[0]:t;return\"atom\"!==e.type||\"bin\"!==e.family&&\"rel\"!==e.family?\"mord\":\"m\"+e.family};$t({type:\"mclass\",names:[\"\\\\@binrel\"],props:{numArgs:2},handler:function(t,e){return{type:\"mclass\",mode:t.parser.mode,mclass:kr(e[0]),body:[e[1]]}}}),$t({type:\"mclass\",names:[\"\\\\stackrel\",\"\\\\overset\",\"\\\\underset\"],props:{numArgs:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[1],i=e[0];r=\"\\\\stackrel\"!==n?kr(o):\"mrel\";var s={type:\"op\",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:\"\\\\stackrel\"!==n,body:Kt(o)},h={type:\"supsub\",mode:i.mode,base:s,sup:\"\\\\underset\"===n?null:i,sub:\"\\\\underset\"===n?i:null};return{type:\"mclass\",mode:a.mode,mclass:r,body:[h]}},htmlBuilder:yr,mathmlBuilder:wr});var Sr=function(t,e){var r=t.font,a=e.withFont(r);return he(t.body,a)},zr=function(t,e){var r=t.font,a=e.withFont(r);return ye(t.body,a)},Mr={\"\\\\Bbb\":\"\\\\mathbb\",\"\\\\bold\":\"\\\\mathbf\",\"\\\\frak\":\"\\\\mathfrak\",\"\\\\bm\":\"\\\\boldsymbol\"};$t({type:\"font\",names:[\"\\\\mathrm\",\"\\\\mathit\",\"\\\\mathbf\",\"\\\\mathnormal\",\"\\\\mathbb\",\"\\\\mathcal\",\"\\\\mathfrak\",\"\\\\mathscr\",\"\\\\mathsf\",\"\\\\mathtt\",\"\\\\Bbb\",\"\\\\bold\",\"\\\\frak\"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0],o=a;return o in Mr&&(o=Mr[o]),{type:\"font\",mode:r.mode,font:o.slice(1),body:n}},htmlBuilder:Sr,mathmlBuilder:zr}),$t({type:\"mclass\",names:[\"\\\\boldsymbol\",\"\\\\bm\"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"mclass\",mode:r.mode,mclass:kr(a),body:[{type:\"font\",mode:r.mode,font:\"boldsymbol\",body:a}]}}}),$t({type:\"font\",names:[\"\\\\rm\",\"\\\\sf\",\"\\\\tt\",\"\\\\bf\",\"\\\\it\"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=t.breakOnTokenText,o=r.mode,i=r.parseExpression(!0,n);return{type:\"font\",mode:o,font:\"math\"+a.slice(1),body:{type:\"ordgroup\",mode:r.mode,body:i}}},htmlBuilder:Sr,mathmlBuilder:zr});var Tr=function(t,e){var r=e;return\"display\"===t?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:\"text\"===t&&r.size===w.DISPLAY.size?r=w.TEXT:\"script\"===t?r=w.SCRIPT:\"scriptscript\"===t&&(r=w.SCRIPTSCRIPT),r},Ar=function(t,e){var r,a=Tr(t.size,e.style),n=a.fracNum(),o=a.fracDen();r=e.havingStyle(n);var i=he(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,h=3.5/e.fontMetrics().ptPerEm;i.height=i.height<s?s:i.height,i.depth=i.depth<h?h:i.depth}r=e.havingStyle(o);var l,m,c,u,d,p,f,g,x,v,b=he(t.denom,r,e);if(t.hasBarLine?(t.barSize?(m=zt(t.barSize,e),l=Lt.makeLineSpan(\"frac-line\",e,m)):l=Lt.makeLineSpan(\"frac-line\",e),m=l.height,c=l.height):(l=null,m=0,c=e.fontMetrics().defaultRuleThickness),a.size===w.DISPLAY.size||\"display\"===t.size?(u=e.fontMetrics().num1,d=m>0?3*c:7*c,p=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,d=c):(u=e.fontMetrics().num3,d=3*c),p=e.fontMetrics().denom2),l){var y=e.fontMetrics().axisHeight;u-i.depth-(y+.5*m)<d&&(u+=d-(u-i.depth-(y+.5*m))),y-.5*m-(b.height-p)<d&&(p+=d-(y-.5*m-(b.height-p)));var k=-(y-.5*m);f=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:b,shift:p},{type:\"elem\",elem:l,shift:k},{type:\"elem\",elem:i,shift:-u}]},e)}else{var S=u-i.depth-(b.height-p);S<d&&(u+=.5*(d-S),p+=.5*(d-S)),f=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:b,shift:p},{type:\"elem\",elem:i,shift:-u}]},e)}return r=e.havingStyle(a),f.height*=r.sizeMultiplier/e.sizeMultiplier,f.depth*=r.sizeMultiplier/e.sizeMultiplier,g=a.size===w.DISPLAY.size?e.fontMetrics().delim1:e.fontMetrics().delim2,x=null==t.leftDelim?se(e,[\"mopen\"]):er(t.leftDelim,g,!0,e.havingStyle(a),t.mode,[\"mopen\"]),v=t.continued?Lt.makeSpan([]):null==t.rightDelim?se(e,[\"mclose\"]):er(t.rightDelim,g,!0,e.havingStyle(a),t.mode,[\"mclose\"]),Lt.makeSpan([\"mord\"].concat(r.sizingClasses(e)),[x,Lt.makeSpan([\"mfrac\"],[f]),v],e)},Br=function(t,e){var r=new pe.MathNode(\"mfrac\",[ye(t.numer,e),ye(t.denom,e)]);if(t.hasBarLine){if(t.barSize){var a=zt(t.barSize,e);r.setAttribute(\"linethickness\",a+\"em\")}}else r.setAttribute(\"linethickness\",\"0px\");var n=Tr(t.size,e.style);if(n.size!==e.style.size){r=new pe.MathNode(\"mstyle\",[r]);var o=n.size===w.DISPLAY.size?\"true\":\"false\";r.setAttribute(\"displaystyle\",o),r.setAttribute(\"scriptlevel\",\"0\")}if(null!=t.leftDelim||null!=t.rightDelim){var i=[];if(null!=t.leftDelim){var s=new pe.MathNode(\"mo\",[new pe.TextNode(t.leftDelim.replace(\"\\\\\",\"\"))]);s.setAttribute(\"fence\",\"true\"),i.push(s)}if(i.push(r),null!=t.rightDelim){var h=new pe.MathNode(\"mo\",[new pe.TextNode(t.rightDelim.replace(\"\\\\\",\"\"))]);h.setAttribute(\"fence\",\"true\"),i.push(h)}return ge(i)}return r};$t({type:\"genfrac\",names:[\"\\\\cfrac\",\"\\\\dfrac\",\"\\\\frac\",\"\\\\tfrac\",\"\\\\dbinom\",\"\\\\binom\",\"\\\\tbinom\",\"\\\\\\\\atopfrac\",\"\\\\\\\\bracefrac\",\"\\\\\\\\brackfrac\"],props:{numArgs:2,greediness:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[0],i=e[1],s=null,h=null,l=\"auto\";switch(n){case\"\\\\cfrac\":case\"\\\\dfrac\":case\"\\\\frac\":case\"\\\\tfrac\":r=!0;break;case\"\\\\\\\\atopfrac\":r=!1;break;case\"\\\\dbinom\":case\"\\\\binom\":case\"\\\\tbinom\":r=!1,s=\"(\",h=\")\";break;case\"\\\\\\\\bracefrac\":r=!1,s=\"\\\\{\",h=\"\\\\}\";break;case\"\\\\\\\\brackfrac\":r=!1,s=\"[\",h=\"]\";break;default:throw new Error(\"Unrecognized genfrac command\")}switch(n){case\"\\\\cfrac\":case\"\\\\dfrac\":case\"\\\\dbinom\":l=\"display\";break;case\"\\\\tfrac\":case\"\\\\tbinom\":l=\"text\"}return{type:\"genfrac\",mode:a.mode,continued:\"\\\\cfrac\"===n,numer:o,denom:i,hasBarLine:r,leftDelim:s,rightDelim:h,size:l,barSize:null}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:\"infix\",names:[\"\\\\over\",\"\\\\choose\",\"\\\\atop\",\"\\\\brace\",\"\\\\brack\"],props:{numArgs:0,infix:!0},handler:function(t){var e,r=t.parser,a=t.funcName,n=t.token;switch(a){case\"\\\\over\":e=\"\\\\frac\";break;case\"\\\\choose\":e=\"\\\\binom\";break;case\"\\\\atop\":e=\"\\\\\\\\atopfrac\";break;case\"\\\\brace\":e=\"\\\\\\\\bracefrac\";break;case\"\\\\brack\":e=\"\\\\\\\\brackfrac\";break;default:throw new Error(\"Unrecognized infix genfrac command\")}return{type:\"infix\",mode:r.mode,replaceWith:e,token:n}}});var qr=[\"display\",\"text\",\"script\",\"scriptscript\"],Cr=function(t){var e=null;return t.length>0&&(e=\".\"===(e=t)?null:e),e};$t({type:\"genfrac\",names:[\"\\\\genfrac\"],props:{numArgs:6,greediness:6,argTypes:[\"math\",\"math\",\"size\",\"text\",\"math\",\"math\"]},handler:function(t,e){var r=t.parser,a=e[4],n=e[5],o=Pt(e[0],\"atom\");o&&(o=Dt(e[0],\"open\"));var i=o?Cr(o.text):null,s=Pt(e[1],\"atom\");s&&(s=Dt(e[1],\"close\"));var h,l=s?Cr(s.text):null,m=Ht(e[2],\"size\"),c=null;h=!!m.isBlank||(c=m.value).number>0;var u=\"auto\",d=Pt(e[3],\"ordgroup\");if(d){if(d.body.length>0){var p=Ht(d.body[0],\"textord\");u=qr[Number(p.text)]}}else d=Ht(e[3],\"textord\"),u=qr[Number(d.text)];return{type:\"genfrac\",mode:r.mode,numer:a,denom:n,continued:!1,hasBarLine:h,barSize:c,leftDelim:i,rightDelim:l,size:u}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:\"infix\",names:[\"\\\\above\"],props:{numArgs:1,argTypes:[\"size\"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:\"infix\",mode:r.mode,replaceWith:\"\\\\\\\\abovefrac\",size:Ht(e[0],\"size\").value,token:a}}}),$t({type:\"genfrac\",names:[\"\\\\\\\\abovefrac\"],props:{numArgs:3,argTypes:[\"math\",\"size\",\"math\"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error(\"Expected non-null, but got \"+String(t));return t}(Ht(e[1],\"infix\").size),o=e[2],i=n.number>0;return{type:\"genfrac\",mode:r.mode,numer:a,denom:o,continued:!1,hasBarLine:i,barSize:n,leftDelim:null,rightDelim:null,size:\"auto\"}},htmlBuilder:Ar,mathmlBuilder:Br});var Nr=function(t,e){var r,a,n=e.style,o=Pt(t,\"supsub\");o?(r=o.sup?he(o.sup,e.havingStyle(n.sup()),e):he(o.sub,e.havingStyle(n.sub()),e),a=Ht(o.base,\"horizBrace\")):a=Ht(t,\"horizBrace\");var i,s=he(a.base,e.havingBaseStyle(w.DISPLAY)),h=qe(a,e);if(a.isOver?(i=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:s},{type:\"kern\",size:.1},{type:\"elem\",elem:h}]},e)).children[0].children[0].children[1].classes.push(\"svg-align\"):(i=Lt.makeVList({positionType:\"bottom\",positionData:s.depth+.1+h.height,children:[{type:\"elem\",elem:h},{type:\"kern\",size:.1},{type:\"elem\",elem:s}]},e)).children[0].children[0].children[0].classes.push(\"svg-align\"),r){var l=Lt.makeSpan([\"mord\",a.isOver?\"mover\":\"munder\"],[i],e);i=a.isOver?Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:l},{type:\"kern\",size:.2},{type:\"elem\",elem:r}]},e):Lt.makeVList({positionType:\"bottom\",positionData:l.depth+.2+r.height+r.depth,children:[{type:\"elem\",elem:r},{type:\"kern\",size:.2},{type:\"elem\",elem:l}]},e)}return Lt.makeSpan([\"mord\",a.isOver?\"mover\":\"munder\"],[i],e)};$t({type:\"horizBrace\",names:[\"\\\\overbrace\",\"\\\\underbrace\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:\"horizBrace\",mode:r.mode,label:a,isOver:/^\\\\over/.test(a),base:e[0]}},htmlBuilder:Nr,mathmlBuilder:function(t,e){var r=Be(t.label);return new pe.MathNode(t.isOver?\"mover\":\"munder\",[ye(t.base,e),r])}}),$t({type:\"href\",names:[\"\\\\href\"],props:{numArgs:2,argTypes:[\"url\",\"original\"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ht(e[0],\"url\").url;return{type:\"href\",mode:r.mode,href:n,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e,!1);return Lt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=be(t.body,e);return r instanceof ue||(r=new ue(\"mrow\",[r])),r.setAttribute(\"href\",t.href),r}}),$t({type:\"href\",names:[\"\\\\url\"],props:{numArgs:1,argTypes:[\"url\"],allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],\"url\").url,n=[],o=0;o<a.length;o++){var i=a[o];\"~\"===i&&(i=\"\\\\textasciitilde\"),n.push({type:\"textord\",mode:\"text\",text:i})}var s={type:\"text\",mode:r.mode,font:\"\\\\texttt\",body:n};return{type:\"href\",mode:r.mode,href:a,body:Kt(s)}}}),$t({type:\"htmlmathml\",names:[\"\\\\html@mathml\"],props:{numArgs:2,allowedInText:!0},handler:function(t,e){return{type:\"htmlmathml\",mode:t.parser.mode,html:Kt(e[0]),mathml:Kt(e[1])}},htmlBuilder:function(t,e){var r=ae(t.html,e,!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){return be(t.mathml,e)}}),$t({type:\"kern\",names:[\"\\\\kern\",\"\\\\mkern\",\"\\\\hskip\",\"\\\\mskip\"],props:{numArgs:1,argTypes:[\"size\"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ht(e[0],\"size\");if(r.settings.strict){var o=\"m\"===a[1],i=\"mu\"===n.value.unit;o?(i||r.settings.reportNonstrict(\"mathVsTextUnits\",\"LaTeX's \"+a+\" supports only mu units, not \"+n.value.unit+\" units\"),\"math\"!==r.mode&&r.settings.reportNonstrict(\"mathVsTextUnits\",\"LaTeX's \"+a+\" works only in math mode\")):i&&r.settings.reportNonstrict(\"mathVsTextUnits\",\"LaTeX's \"+a+\" doesn't support mu units\")}return{type:\"kern\",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Lt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=zt(t.dimension,e);return new pe.SpaceNode(r)}}),$t({type:\"lap\",names:[\"\\\\mathllap\",\"\\\\mathrlap\",\"\\\\mathclap\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"lap\",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;\"clap\"===t.alignment?(r=Lt.makeSpan([],[he(t.body,e)]),r=Lt.makeSpan([\"inner\"],[r],e)):r=Lt.makeSpan([\"inner\"],[he(t.body,e)]);var a=Lt.makeSpan([\"fix\"],[]),n=Lt.makeSpan([t.alignment],[r,a],e),o=Lt.makeSpan([\"strut\"]);return o.style.height=n.height+n.depth+\"em\",o.style.verticalAlign=-n.depth+\"em\",n.children.unshift(o),n=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:n}]},e),Lt.makeSpan([\"mord\"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mpadded\",[ye(t.body,e)]);if(\"rlap\"!==t.alignment){var a=\"llap\"===t.alignment?\"-1\":\"-0.5\";r.setAttribute(\"lspace\",a+\"width\")}return r.setAttribute(\"width\",\"0px\"),r}}),$t({type:\"styling\",names:[\"\\\\(\",\"$\"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1,consumeMode:\"math\"},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode(\"math\");var o=\"\\\\(\"===r?\"\\\\)\":\"$\",i=a.parseExpression(!1,o);return a.expect(o,!1),a.switchMode(n),a.consume(),{type:\"styling\",mode:a.mode,style:\"text\",body:i}}}),$t({type:\"text\",names:[\"\\\\)\",\"\\\\]\"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new i(\"Mismatched \"+t.funcName)}});var Ir=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};$t({type:\"mathchoice\",names:[\"\\\\mathchoice\"],props:{numArgs:4},handler:function(t,e){return{type:\"mathchoice\",mode:t.parser.mode,display:Kt(e[0]),text:Kt(e[1]),script:Kt(e[2]),scriptscript:Kt(e[3])}},htmlBuilder:function(t,e){var r=Ir(t,e),a=ae(r,e,!1);return Lt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Ir(t,e);return be(r,e)}});var Or=[\"\\\\smallint\"],Er=function(t,e){var r,a,n,o=!1,i=Pt(t,\"supsub\");i?(r=i.sup,a=i.sub,n=Ht(i.base,\"op\"),o=!0):n=Ht(t,\"op\");var s,h=e.style,l=!1;if(h.size===w.DISPLAY.size&&n.symbol&&!c.contains(Or,n.name)&&(l=!0),n.symbol){var m=l?\"Size2-Regular\":\"Size1-Regular\",u=\"\";if(\"\\\\oiint\"!==n.name&&\"\\\\oiiint\"!==n.name||(u=n.name.substr(1),n.name=\"oiint\"===u?\"\\\\iint\":\"\\\\iiint\"),s=Lt.makeSymbol(n.name,m,\"math\",e,[\"mop\",\"op-symbol\",l?\"large-op\":\"small-op\"]),u.length>0){var d=s.italic,p=Lt.staticSvg(u+\"Size\"+(l?\"2\":\"1\"),e);s=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:s,shift:0},{type:\"elem\",elem:p,shift:l?.08:0}]},e),n.name=\"\\\\\"+u,s.classes.unshift(\"mop\"),s.italic=d}}else if(n.body){var f=ae(n.body,e,!0);1===f.length&&f[0]instanceof E?(s=f[0]).classes[0]=\"mop\":s=Lt.makeSpan([\"mop\"],Lt.tryCombineChars(f),e)}else{for(var g=[],x=1;x<n.name.length;x++)g.push(Lt.mathsym(n.name[x],n.mode));s=Lt.makeSpan([\"mop\"],g,e)}var v=0,b=0;if((s instanceof E||\"\\\\oiint\"===n.name||\"\\\\oiiint\"===n.name)&&!n.suppressBaseShift&&(v=(s.height-s.depth)/2-e.fontMetrics().axisHeight,b=s.italic),o){var y,k,S;if(s=Lt.makeSpan([],[s]),r){var z=he(r,e.havingStyle(h.sup()),e);k={elem:z,kern:Math.max(e.fontMetrics().bigOpSpacing1,e.fontMetrics().bigOpSpacing3-z.depth)}}if(a){var M=he(a,e.havingStyle(h.sub()),e);y={elem:M,kern:Math.max(e.fontMetrics().bigOpSpacing2,e.fontMetrics().bigOpSpacing4-M.height)}}if(k&&y){var T=e.fontMetrics().bigOpSpacing5+y.elem.height+y.elem.depth+y.kern+s.depth+v;S=Lt.makeVList({positionType:\"bottom\",positionData:T,children:[{type:\"kern\",size:e.fontMetrics().bigOpSpacing5},{type:\"elem\",elem:y.elem,marginLeft:-b+\"em\"},{type:\"kern\",size:y.kern},{type:\"elem\",elem:s},{type:\"kern\",size:k.kern},{type:\"elem\",elem:k.elem,marginLeft:b+\"em\"},{type:\"kern\",size:e.fontMetrics().bigOpSpacing5}]},e)}else if(y){var A=s.height-v;S=Lt.makeVList({positionType:\"top\",positionData:A,children:[{type:\"kern\",size:e.fontMetrics().bigOpSpacing5},{type:\"elem\",elem:y.elem,marginLeft:-b+\"em\"},{type:\"kern\",size:y.kern},{type:\"elem\",elem:s}]},e)}else{if(!k)return s;var B=s.depth+v;S=Lt.makeVList({positionType:\"bottom\",positionData:B,children:[{type:\"elem\",elem:s},{type:\"kern\",size:k.kern},{type:\"elem\",elem:k.elem,marginLeft:b+\"em\"},{type:\"kern\",size:e.fontMetrics().bigOpSpacing5}]},e)}return Lt.makeSpan([\"mop\",\"op-limits\"],[S],e)}return v&&(s.style.position=\"relative\",s.style.top=v+\"em\"),s},Rr=function(t,e){var r;if(t.symbol)r=new ue(\"mo\",[fe(t.name,t.mode)]),c.contains(Or,t.name)&&r.setAttribute(\"largeop\",\"false\");else if(t.body)r=new ue(\"mo\",ve(t.body,e));else{r=new ue(\"mi\",[new de(t.name.slice(1))]);var a=new ue(\"mo\",[fe(\"\\u2061\",\"text\")]);r=t.parentIsSupSub?new ue(\"mo\",[r,a]):ce([r,a])}return r},Lr={\"\\u220f\":\"\\\\prod\",\"\\u2210\":\"\\\\coprod\",\"\\u2211\":\"\\\\sum\",\"\\u22c0\":\"\\\\bigwedge\",\"\\u22c1\":\"\\\\bigvee\",\"\\u22c2\":\"\\\\bigcap\",\"\\u22c3\":\"\\\\bigcup\",\"\\u2a00\":\"\\\\bigodot\",\"\\u2a01\":\"\\\\bigoplus\",\"\\u2a02\":\"\\\\bigotimes\",\"\\u2a04\":\"\\\\biguplus\",\"\\u2a06\":\"\\\\bigsqcup\"};$t({type:\"op\",names:[\"\\\\coprod\",\"\\\\bigvee\",\"\\\\bigwedge\",\"\\\\biguplus\",\"\\\\bigcap\",\"\\\\bigcup\",\"\\\\intop\",\"\\\\prod\",\"\\\\sum\",\"\\\\bigotimes\",\"\\\\bigoplus\",\"\\\\bigodot\",\"\\\\bigsqcup\",\"\\\\smallint\",\"\\u220f\",\"\\u2210\",\"\\u2211\",\"\\u22c0\",\"\\u22c1\",\"\\u22c2\",\"\\u22c3\",\"\\u2a00\",\"\\u2a01\",\"\\u2a02\",\"\\u2a04\",\"\\u2a06\"],props:{numArgs:0},handler:function(t,e){var r=t.parser,a=t.funcName;return 1===a.length&&(a=Lr[a]),{type:\"op\",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"op\",names:[\"\\\\mathop\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"op\",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Kt(a)}},htmlBuilder:Er,mathmlBuilder:Rr});var Hr={\"\\u222b\":\"\\\\int\",\"\\u222c\":\"\\\\iint\",\"\\u222d\":\"\\\\iiint\",\"\\u222e\":\"\\\\oint\",\"\\u222f\":\"\\\\oiint\",\"\\u2230\":\"\\\\oiiint\"};function Pr(t,e,r){for(var a=ae(t,e,!1),n=e.sizeMultiplier/r.sizeMultiplier,o=0;o<a.length;o++){var i=a[o].classes.indexOf(\"sizing\");i<0?Array.prototype.push.apply(a[o].classes,e.sizingClasses(r)):a[o].classes[i+1]===\"reset-size\"+e.size&&(a[o].classes[i+1]=\"reset-size\"+r.size),a[o].height*=n,a[o].depth*=n}return Lt.makeFragment(a)}$t({type:\"op\",names:[\"\\\\arcsin\",\"\\\\arccos\",\"\\\\arctan\",\"\\\\arctg\",\"\\\\arcctg\",\"\\\\arg\",\"\\\\ch\",\"\\\\cos\",\"\\\\cosec\",\"\\\\cosh\",\"\\\\cot\",\"\\\\cotg\",\"\\\\coth\",\"\\\\csc\",\"\\\\ctg\",\"\\\\cth\",\"\\\\deg\",\"\\\\dim\",\"\\\\exp\",\"\\\\hom\",\"\\\\ker\",\"\\\\lg\",\"\\\\ln\",\"\\\\log\",\"\\\\sec\",\"\\\\sin\",\"\\\\sinh\",\"\\\\sh\",\"\\\\tan\",\"\\\\tanh\",\"\\\\tg\",\"\\\\th\"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:\"op\",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"op\",names:[\"\\\\det\",\"\\\\gcd\",\"\\\\inf\",\"\\\\lim\",\"\\\\max\",\"\\\\min\",\"\\\\Pr\",\"\\\\sup\"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:\"op\",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"op\",names:[\"\\\\int\",\"\\\\iint\",\"\\\\iiint\",\"\\\\oint\",\"\\\\oiint\",\"\\\\oiiint\",\"\\u222b\",\"\\u222c\",\"\\u222d\",\"\\u222e\",\"\\u222f\",\"\\u2230\"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return 1===r.length&&(r=Hr[r]),{type:\"op\",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"operatorname\",names:[\"\\\\operatorname\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"operatorname\",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){if(t.body.length>0){for(var r=t.body.map(function(t){var e=t.text;return\"string\"==typeof e?{type:\"textord\",mode:t.mode,text:e}:t}),a=ae(r,e.withFont(\"mathrm\"),!0),n=0;n<a.length;n++){var o=a[n];o instanceof E&&(o.text=o.text.replace(/\\u2212/,\"-\").replace(/\\u2217/,\"*\"))}return Lt.makeSpan([\"mop\"],a,e)}return Lt.makeSpan([\"mop\"],[],e)},mathmlBuilder:function(t,e){for(var r=ve(t.body,e.withFont(\"mathrm\")),a=!0,n=0;n<r.length;n++){var o=r[n];if(o instanceof pe.SpaceNode);else if(o instanceof pe.MathNode)switch(o.type){case\"mi\":case\"mn\":case\"ms\":case\"mspace\":case\"mtext\":break;case\"mo\":var i=o.children[0];1===o.children.length&&i instanceof pe.TextNode?i.text=i.text.replace(/\\u2212/,\"-\").replace(/\\u2217/,\"*\"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(function(t){return t.toText()}).join(\"\");r=[new pe.TextNode(s)]}var h=new pe.MathNode(\"mi\",r);h.setAttribute(\"mathvariant\",\"normal\");var l=new pe.MathNode(\"mo\",[fe(\"\\u2061\",\"text\")]);return pe.newDocumentFragment([h,l])}}),Zt({type:\"ordgroup\",htmlBuilder:function(t,e){return t.semisimple?Lt.makeFragment(ae(t.body,e,!1)):Lt.makeSpan([\"mord\"],ae(t.body,e,!0),e)},mathmlBuilder:function(t,e){return be(t.body,e)}}),$t({type:\"overline\",names:[\"\\\\overline\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"overline\",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle()),a=Lt.makeLineSpan(\"overline-line\",e),n=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r},{type:\"kern\",size:3*a.height},{type:\"elem\",elem:a},{type:\"kern\",size:a.height}]},e);return Lt.makeSpan([\"mord\",\"overline\"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mo\",[new pe.TextNode(\"\\u203e\")]);r.setAttribute(\"stretchy\",\"true\");var a=new pe.MathNode(\"mover\",[ye(t.body,e),r]);return a.setAttribute(\"accent\",\"true\"),a}}),$t({type:\"phantom\",names:[\"\\\\phantom\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"phantom\",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e.withPhantom(),!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){var r=ve(t.body,e);return new pe.MathNode(\"mphantom\",r)}}),$t({type:\"hphantom\",names:[\"\\\\hphantom\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"hphantom\",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r}]},e),Lt.makeSpan([\"mord\"],[r],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode(\"mphantom\",r),n=new pe.MathNode(\"mpadded\",[a]);return n.setAttribute(\"height\",\"0px\"),n.setAttribute(\"depth\",\"0px\"),n}}),$t({type:\"vphantom\",names:[\"\\\\vphantom\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"vphantom\",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan([\"inner\"],[he(t.body,e.withPhantom())]),a=Lt.makeSpan([\"fix\"],[]);return Lt.makeSpan([\"mord\",\"rlap\"],[r,a],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode(\"mphantom\",r),n=new pe.MathNode(\"mpadded\",[a]);return n.setAttribute(\"width\",\"0px\"),n}});var Dr=[\"\\\\tiny\",\"\\\\sixptsize\",\"\\\\scriptsize\",\"\\\\footnotesize\",\"\\\\small\",\"\\\\normalsize\",\"\\\\large\",\"\\\\Large\",\"\\\\LARGE\",\"\\\\huge\",\"\\\\Huge\"],Fr=function(t,e){var r=e.havingSize(t.size);return Pr(t.body,r,e)};$t({type:\"sizing\",names:Dr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!1,r);return{type:\"sizing\",mode:n.mode,size:Dr.indexOf(a)+1,body:o}},htmlBuilder:Fr,mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ve(t.body,r),n=new pe.MathNode(\"mstyle\",a);return n.setAttribute(\"mathsize\",r.sizeMultiplier+\"em\"),n}}),$t({type:\"raisebox\",names:[\"\\\\raisebox\"],props:{numArgs:2,argTypes:[\"size\",\"text\"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ht(e[0],\"size\").value,n=e[1];return{type:\"raisebox\",mode:r.mode,dy:a,body:n}},htmlBuilder:function(t,e){var r={type:\"text\",mode:t.mode,body:Kt(t.body),font:\"mathrm\"},a={type:\"sizing\",mode:t.mode,body:[r],size:6},n=Fr(a,e),o=zt(t.dy,e);return Lt.makeVList({positionType:\"shift\",positionData:-o,children:[{type:\"elem\",elem:n}]},e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mpadded\",[ye(t.body,e)]),a=t.dy.number+t.dy.unit;return r.setAttribute(\"voffset\",a),r}}),$t({type:\"rule\",names:[\"\\\\rule\"],props:{numArgs:2,numOptionalArgs:1,argTypes:[\"size\",\"size\",\"size\"]},handler:function(t,e,r){var a=t.parser,n=r[0],o=Ht(e[0],\"size\"),i=Ht(e[1],\"size\");return{type:\"rule\",mode:a.mode,shift:n&&Ht(n,\"size\").value,width:o.value,height:i.value}},htmlBuilder:function(t,e){var r=Lt.makeSpan([\"mord\",\"rule\"],[],e),a=zt(t.width,e),n=zt(t.height,e),o=t.shift?zt(t.shift,e):0;return r.style.borderRightWidth=a+\"em\",r.style.borderTopWidth=n+\"em\",r.style.bottom=o+\"em\",r.width=a,r.height=n+o,r.depth=-o,r.maxFontSize=1.125*n*e.sizeMultiplier,r},mathmlBuilder:function(t,e){var r=zt(t.width,e),a=zt(t.height,e),n=t.shift?zt(t.shift,e):0,o=e.color&&e.getColor()||\"black\",i=new pe.MathNode(\"mspace\");i.setAttribute(\"mathbackground\",o),i.setAttribute(\"width\",r+\"em\"),i.setAttribute(\"height\",a+\"em\");var s=new pe.MathNode(\"mpadded\",[i]);return n>=0?s.setAttribute(\"height\",\"+\"+n+\"em\"):(s.setAttribute(\"height\",n+\"em\"),s.setAttribute(\"depth\",\"+\"+-n+\"em\")),s.setAttribute(\"voffset\",n+\"em\"),s}}),$t({type:\"smash\",names:[\"\\\\smash\"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,o=!1,i=r[0]&&Ht(r[0],\"ordgroup\");if(i)for(var s=\"\",h=0;h<i.body.length;++h){if(\"t\"===(s=i.body[h].text))n=!0;else{if(\"b\"!==s){n=!1,o=!1;break}o=!0}}else n=!0,o=!0;var l=e[0];return{type:\"smash\",mode:a.mode,body:l,smashHeight:n,smashDepth:o}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(t.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var o=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r}]},e);return Lt.makeSpan([\"mord\"],[o],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mpadded\",[ye(t.body,e)]);return t.smashHeight&&r.setAttribute(\"height\",\"0px\"),t.smashDepth&&r.setAttribute(\"depth\",\"0px\"),r}}),$t({type:\"sqrt\",names:[\"\\\\sqrt\"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=r[0],o=e[0];return{type:\"sqrt\",mode:a.mode,body:o,index:n}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle());0===r.height&&(r.height=e.fontMetrics().xHeight),r=Lt.wrapFragment(r,e);var a=e.fontMetrics().defaultRuleThickness,n=a;e.style.id<w.TEXT.id&&(n=e.fontMetrics().xHeight);var o=a+n/4,i=r.height+r.depth+o+a,s=Qe(i,e),h=s.span,l=s.ruleWidth,m=s.advanceWidth,c=h.height-l;c>r.height+r.depth+o&&(o=(o+c-r.height-r.depth)/2);var u=h.height-r.height-o-l;r.style.paddingLeft=m+\"em\";var d=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r,wrapperClasses:[\"svg-align\"]},{type:\"kern\",size:-(r.height+u)},{type:\"elem\",elem:h},{type:\"kern\",size:l}]},e);if(t.index){var p=e.havingStyle(w.SCRIPTSCRIPT),f=he(t.index,p,e),g=.6*(d.height-d.depth),x=Lt.makeVList({positionType:\"shift\",positionData:-g,children:[{type:\"elem\",elem:f}]},e),v=Lt.makeSpan([\"root\"],[x]);return Lt.makeSpan([\"mord\",\"sqrt\"],[v,d],e)}return Lt.makeSpan([\"mord\",\"sqrt\"],[d],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new pe.MathNode(\"mroot\",[ye(r,e),ye(a,e)]):new pe.MathNode(\"msqrt\",[ye(r,e)])}});var Vr={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};$t({type:\"styling\",names:[\"\\\\displaystyle\",\"\\\\textstyle\",\"\\\\scriptstyle\",\"\\\\scriptscriptstyle\"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!0,r),i=a.slice(1,a.length-5);return{type:\"styling\",mode:n.mode,style:i,body:o}},htmlBuilder:function(t,e){var r=Vr[t.style],a=e.havingStyle(r).withFont(\"\");return Pr(t.body,a,e)},mathmlBuilder:function(t,e){var r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT}[t.style],a=e.havingStyle(r),n=ve(t.body,a),o=new pe.MathNode(\"mstyle\",n),i={display:[\"0\",\"true\"],text:[\"0\",\"false\"],script:[\"1\",\"false\"],scriptscript:[\"2\",\"false\"]}[t.style];return o.setAttribute(\"scriptlevel\",i[0]),o.setAttribute(\"displaystyle\",i[1]),o}});Zt({type:\"supsub\",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?\"op\"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Er:null:\"accent\"===r.type?c.isCharacterBox(r.base)?Ce:null:\"horizBrace\"===r.type&&!t.sub===r.isOver?Nr:null:null}(t,e);if(r)return r(t,e);var a,n,o,i=t.base,s=t.sup,h=t.sub,l=he(i,e),m=e.fontMetrics(),u=0,d=0,p=i&&c.isCharacterBox(i);if(s){var f=e.havingStyle(e.style.sup());a=he(s,f,e),p||(u=l.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(h){var g=e.havingStyle(e.style.sub());n=he(h,g,e),p||(d=l.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}o=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+\"em\",y=null;if(n){var k=t.base&&\"op\"===t.base.type&&t.base.name&&(\"\\\\oiint\"===t.base.name||\"\\\\oiiint\"===t.base.name);(l instanceof E||k)&&(y=-l.italic+\"em\")}if(a&&n){u=Math.max(u,o,a.depth+.25*m.xHeight),d=Math.max(d,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-d)<S){d=S-(u-a.depth)+n.height;var z=.8*m.xHeight-(u-a.depth);z>0&&(u+=z,d-=z)}var M=[{type:\"elem\",elem:n,shift:d,marginRight:b,marginLeft:y},{type:\"elem\",elem:a,shift:-u,marginRight:b}];x=Lt.makeVList({positionType:\"individualShift\",children:M},e)}else if(n){d=Math.max(d,m.sub1,n.height-.8*m.xHeight);var T=[{type:\"elem\",elem:n,marginLeft:y,marginRight:b}];x=Lt.makeVList({positionType:\"shift\",positionData:d,children:T},e)}else{if(!a)throw new Error(\"supsub must have either sup or sub.\");u=Math.max(u,o,a.depth+.25*m.xHeight),x=Lt.makeVList({positionType:\"shift\",positionData:-u,children:[{type:\"elem\",elem:a,marginRight:b}]},e)}var A=ie(l,\"right\")||\"mord\";return Lt.makeSpan([A],[l,Lt.makeSpan([\"msupsub\"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1,n=Pt(t.base,\"horizBrace\");n&&!!t.sup===n.isOver&&(a=!0,r=n.isOver),t.base&&\"op\"===t.base.type&&(t.base.parentIsSupSub=!0);var o,i=[ye(t.base,e)];if(t.sub&&i.push(ye(t.sub,e)),t.sup&&i.push(ye(t.sup,e)),a)o=r?\"mover\":\"munder\";else if(t.sub)if(t.sup){var s=t.base;o=s&&\"op\"===s.type&&s.limits&&e.style===w.DISPLAY?\"munderover\":\"msubsup\"}else{var h=t.base;o=h&&\"op\"===h.type&&h.limits&&(e.style===w.DISPLAY||h.alwaysHandleSupSub)?\"munder\":\"msub\"}else{var l=t.base;o=l&&\"op\"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?\"mover\":\"msup\"}return new pe.MathNode(o,i)}}),Zt({type:\"atom\",htmlBuilder:function(t,e){return Lt.mathsym(t.text,t.mode,e,[\"m\"+t.family])},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mo\",[fe(t.text,t.mode)]);if(\"bin\"===t.family){var a=xe(t,e);\"bold-italic\"===a&&r.setAttribute(\"mathvariant\",a)}else\"punct\"===t.family?r.setAttribute(\"separator\",\"true\"):\"open\"!==t.family&&\"close\"!==t.family||r.setAttribute(\"stretchy\",\"false\");return r}});var Ur={mi:\"italic\",mn:\"normal\",mtext:\"normal\"};Zt({type:\"mathord\",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,\"mathord\")},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mi\",[fe(t.text,t.mode,e)]),a=xe(t,e)||\"italic\";return a!==Ur[r.type]&&r.setAttribute(\"mathvariant\",a),r}}),Zt({type:\"textord\",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,\"textord\")},mathmlBuilder:function(t,e){var r,a=fe(t.text,t.mode,e),n=xe(t,e)||\"normal\";return r=\"text\"===t.mode?new pe.MathNode(\"mtext\",[a]):/[0-9]/.test(t.text)?new pe.MathNode(\"mn\",[a]):\"\\\\prime\"===t.text?new pe.MathNode(\"mo\",[a]):new pe.MathNode(\"mi\",[a]),n!==Ur[r.type]&&r.setAttribute(\"mathvariant\",n),r}});var Gr={\"\\\\nobreak\":\"nobreak\",\"\\\\allowbreak\":\"allowbreak\"},Xr={\" \":{},\"\\\\ \":{},\"~\":{className:\"nobreak\"},\"\\\\space\":{},\"\\\\nobreakspace\":{className:\"nobreak\"}};Zt({type:\"spacing\",htmlBuilder:function(t,e){if(Xr.hasOwnProperty(t.text)){var r=Xr[t.text].className||\"\";if(\"text\"===t.mode){var a=Lt.makeOrd(t,e,\"textord\");return a.classes.push(r),a}return Lt.makeSpan([\"mspace\",r],[Lt.mathsym(t.text,t.mode,e)],e)}if(Gr.hasOwnProperty(t.text))return Lt.makeSpan([\"mspace\",Gr[t.text]],[],e);throw new i('Unknown type of space \"'+t.text+'\"')},mathmlBuilder:function(t,e){if(!Xr.hasOwnProperty(t.text)){if(Gr.hasOwnProperty(t.text))return new pe.MathNode(\"mspace\");throw new i('Unknown type of space \"'+t.text+'\"')}return new pe.MathNode(\"mtext\",[new pe.TextNode(\"\\xa0\")])}});var Yr=function(){var t=new pe.MathNode(\"mtd\",[]);return t.setAttribute(\"width\",\"50%\"),t};Zt({type:\"tag\",mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mtable\",[new pe.MathNode(\"mtr\",[Yr(),new pe.MathNode(\"mtd\",[be(t.body,e)]),Yr(),new pe.MathNode(\"mtd\",[be(t.tag,e)])])]);return r.setAttribute(\"width\",\"100%\"),r}});var _r={\"\\\\text\":void 0,\"\\\\textrm\":\"textrm\",\"\\\\textsf\":\"textsf\",\"\\\\texttt\":\"texttt\",\"\\\\textnormal\":\"textrm\"},Wr={\"\\\\textbf\":\"textbf\",\"\\\\textmd\":\"textmd\"},jr={\"\\\\textit\":\"textit\",\"\\\\textup\":\"textup\"},$r=function(t,e){var r=t.font;return r?_r[r]?e.withTextFontFamily(_r[r]):Wr[r]?e.withTextFontWeight(Wr[r]):e.withTextFontShape(jr[r]):e};$t({type:\"text\",names:[\"\\\\text\",\"\\\\textrm\",\"\\\\textsf\",\"\\\\texttt\",\"\\\\textnormal\",\"\\\\textbf\",\"\\\\textmd\",\"\\\\textit\",\"\\\\textup\"],props:{numArgs:1,argTypes:[\"text\"],greediness:2,allowedInText:!0,consumeMode:\"text\"},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"text\",mode:r.mode,body:Kt(n),font:a}},htmlBuilder:function(t,e){var r=$r(t,e),a=ae(t.body,r,!0);return Lt.makeSpan([\"mord\",\"text\"],Lt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=$r(t,e);return be(t.body,r)}}),$t({type:\"underline\",names:[\"\\\\underline\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:\"underline\",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=he(t.body,e),a=Lt.makeLineSpan(\"underline-line\",e),n=Lt.makeVList({positionType:\"top\",positionData:r.height,children:[{type:\"kern\",size:a.height},{type:\"elem\",elem:a},{type:\"kern\",size:3*a.height},{type:\"elem\",elem:r}]},e);return Lt.makeSpan([\"mord\",\"underline\"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mo\",[new pe.TextNode(\"\\u203e\")]);r.setAttribute(\"stretchy\",\"true\");var a=new pe.MathNode(\"munder\",[ye(t.body,e),r]);return a.setAttribute(\"accentunder\",\"true\"),a}}),$t({type:\"verb\",names:[\"\\\\verb\"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new i(\"\\\\verb ended by end of line instead of matching delimiter\")},htmlBuilder:function(t,e){for(var r=Zr(t),a=[],n=e.havingStyle(e.style.text()),o=0;o<r.length;o++){var i=r[o];\"~\"===i&&(i=\"\\\\textasciitilde\"),a.push(Lt.makeSymbol(i,\"Typewriter-Regular\",t.mode,n,[\"mord\",\"texttt\"]))}return Lt.makeSpan([\"mord\",\"text\"].concat(n.sizingClasses(e)),Lt.tryCombineChars(a),n)},mathmlBuilder:function(t,e){var r=new pe.TextNode(Zr(t)),a=new pe.MathNode(\"mtext\",[r]);return a.setAttribute(\"mathvariant\",\"monospace\"),a}});var Zr=function(t){return t.body.replace(/ /g,t.star?\"\\u2423\":\"\\xa0\")},Kr=_t,Jr=new RegExp(\"^(\\\\\\\\[a-zA-Z@]+)[ \\r\\n\\t]*$\"),Qr=new RegExp(\"[\\u0300-\\u036f]+$\"),ta=\"([ \\r\\n\\t]+)|([!-\\\\[\\\\]-\\u2027\\u202a-\\ud7ff\\uf900-\\uffff][\\u0300-\\u036f]*|[\\ud800-\\udbff][\\udc00-\\udfff][\\u0300-\\u036f]*|\\\\\\\\verb\\\\*([^]).*?\\\\3|\\\\\\\\verb([^*a-zA-Z]).*?\\\\4|\\\\\\\\[a-zA-Z@]+[ \\r\\n\\t]*|\\\\\\\\[^\\ud800-\\udfff])\",ea=function(){function t(t,e){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=e,this.tokenRegex=new RegExp(ta,\"g\"),this.catcodes={\"%\":14}}var e=t.prototype;return e.setCatcode=function(t,e){this.catcodes[t]=e},e.lex=function(){var t=this.input,e=this.tokenRegex.lastIndex;if(e===t.length)return new n(\"EOF\",new a(this,e,e));var r=this.tokenRegex.exec(t);if(null===r||r.index!==e)throw new i(\"Unexpected character: '\"+t[e]+\"'\",new n(t[e],new a(this,e,e+1)));var o=r[2]||\" \";if(14===this.catcodes[o]){var s=t.indexOf(\"\\n\",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict(\"commentAtEnd\",\"% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)\")):this.tokenRegex.lastIndex=s+1,this.lex()}var h=o.match(Jr);return h&&(o=h[1]),new n(o,new a(this,e,this.tokenRegex.lastIndex))},t}(),ra=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=e,this.builtins=t,this.undefStack=[]}var e=t.prototype;return e.beginGroup=function(){this.undefStack.push({})},e.endGroup=function(){if(0===this.undefStack.length)throw new i(\"Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug\");var t=this.undefStack.pop();for(var e in t)t.hasOwnProperty(e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])},e.has=function(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)},e.get=function(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]},e.set=function(t,e,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][t];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),aa={},na=aa;function oa(t,e){aa[t]=e}oa(\"\\\\@firstoftwo\",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),oa(\"\\\\@secondoftwo\",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),oa(\"\\\\@ifnextchar\",function(t){var e=t.consumeArgs(3),r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),oa(\"\\\\@ifstar\",\"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\"),oa(\"\\\\TextOrMath\",function(t){var e=t.consumeArgs(2);return\"text\"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var ia={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};oa(\"\\\\char\",function(t){var e,r=t.popToken(),a=\"\";if(\"'\"===r.text)e=8,r=t.popToken();else if('\"'===r.text)e=16,r=t.popToken();else if(\"`\"===r.text)if(\"\\\\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if(\"EOF\"===r.text)throw new i(\"\\\\char` missing argument\");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=ia[r.text])||a>=e)throw new i(\"Invalid base-\"+e+\" digit \"+r.text);for(var n;null!=(n=ia[t.future().text])&&n<e;)a*=e,a+=n,t.popToken()}return\"\\\\@char{\"+a+\"}\"});var sa=function(t,e){var r=t.consumeArgs(1)[0];if(1!==r.length)throw new i(\"\\\\gdef's first argument must be a macro name\");var a=r[0].text,n=0;for(r=t.consumeArgs(1)[0];1===r.length&&\"#\"===r[0].text;){if(1!==(r=t.consumeArgs(1)[0]).length)throw new i('Invalid argument number length \"'+r.length+'\"');if(!/^[1-9]$/.test(r[0].text))throw new i('Invalid argument number \"'+r[0].text+'\"');if(n++,parseInt(r[0].text)!==n)throw new i('Argument number \"'+r[0].text+'\" out of order');r=t.consumeArgs(1)[0]}return t.macros.set(a,{tokens:r,numArgs:n},e),\"\"};oa(\"\\\\gdef\",function(t){return sa(t,!0)}),oa(\"\\\\def\",function(t){return sa(t,!1)}),oa(\"\\\\global\",function(t){var e=t.consumeArgs(1)[0];if(1!==e.length)throw new i(\"Invalid command after \\\\global\");var r=e[0].text;if(\"\\\\def\"===r)return sa(t,!0);throw new i(\"Invalid command '\"+r+\"' after \\\\global\")});var ha=function(t,e,r){var a=t.consumeArgs(1)[0];if(1!==a.length)throw new i(\"\\\\newcommand's first argument must be a macro name\");var n=a[0].text,o=t.isDefined(n);if(o&&!e)throw new i(\"\\\\newcommand{\"+n+\"} attempting to redefine \"+n+\"; use \\\\renewcommand\");if(!o&&!r)throw new i(\"\\\\renewcommand{\"+n+\"} when command \"+n+\" does not yet exist; use \\\\newcommand\");var s=0;if(1===(a=t.consumeArgs(1)[0]).length&&\"[\"===a[0].text){for(var h=\"\",l=t.expandNextToken();\"]\"!==l.text&&\"EOF\"!==l.text;)h+=l.text,l=t.expandNextToken();if(!h.match(/^\\s*[0-9]+\\s*$/))throw new i(\"Invalid number of arguments: \"+h);s=parseInt(h),a=t.consumeArgs(1)[0]}return t.macros.set(n,{tokens:a,numArgs:s}),\"\"};oa(\"\\\\newcommand\",function(t){return ha(t,!1,!0)}),oa(\"\\\\renewcommand\",function(t){return ha(t,!0,!1)}),oa(\"\\\\providecommand\",function(t){return ha(t,!0,!0)}),oa(\"\\\\bgroup\",\"{\"),oa(\"\\\\egroup\",\"}\"),oa(\"\\\\lq\",\"`\"),oa(\"\\\\rq\",\"'\"),oa(\"\\\\aa\",\"\\\\r a\"),oa(\"\\\\AA\",\"\\\\r A\"),oa(\"\\\\textcopyright\",\"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`\\xa9}\"),oa(\"\\\\copyright\",\"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\"),oa(\"\\\\textregistered\",\"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`\\xae}\"),oa(\"\\u212c\",\"\\\\mathscr{B}\"),oa(\"\\u2130\",\"\\\\mathscr{E}\"),oa(\"\\u2131\",\"\\\\mathscr{F}\"),oa(\"\\u210b\",\"\\\\mathscr{H}\"),oa(\"\\u2110\",\"\\\\mathscr{I}\"),oa(\"\\u2112\",\"\\\\mathscr{L}\"),oa(\"\\u2133\",\"\\\\mathscr{M}\"),oa(\"\\u211b\",\"\\\\mathscr{R}\"),oa(\"\\u212d\",\"\\\\mathfrak{C}\"),oa(\"\\u210c\",\"\\\\mathfrak{H}\"),oa(\"\\u2128\",\"\\\\mathfrak{Z}\"),oa(\"\\\\Bbbk\",\"\\\\Bbb{k}\"),oa(\"\\xb7\",\"\\\\cdotp\"),oa(\"\\\\llap\",\"\\\\mathllap{\\\\textrm{#1}}\"),oa(\"\\\\rlap\",\"\\\\mathrlap{\\\\textrm{#1}}\"),oa(\"\\\\clap\",\"\\\\mathclap{\\\\textrm{#1}}\"),oa(\"\\\\not\",'\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}}{\\\\char\"338}'),oa(\"\\\\neq\",\"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`\\u2260}}\"),oa(\"\\\\ne\",\"\\\\neq\"),oa(\"\\u2260\",\"\\\\neq\"),oa(\"\\\\notin\",\"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}{\\\\mathrel{\\\\char`\\u2209}}\"),oa(\"\\u2209\",\"\\\\notin\"),oa(\"\\u2258\",\"\\\\html@mathml{\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}}{\\\\mathrel{\\\\char`\\u2258}}\"),oa(\"\\u2259\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\"),oa(\"\\u225a\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225a}}\"),oa(\"\\u225b\",\"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}{\\\\mathrel{\\\\char`\\u225b}}\"),oa(\"\\u225d\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}{\\\\mathrel{\\\\char`\\u225d}}\"),oa(\"\\u225e\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}{\\\\mathrel{\\\\char`\\u225e}}\"),oa(\"\\u225f\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225f}}\"),oa(\"\\u27c2\",\"\\\\perp\"),oa(\"\\u203c\",\"\\\\mathclose{!\\\\mkern-0.8mu!}\"),oa(\"\\u220c\",\"\\\\notni\"),oa(\"\\u231c\",\"\\\\ulcorner\"),oa(\"\\u231d\",\"\\\\urcorner\"),oa(\"\\u231e\",\"\\\\llcorner\"),oa(\"\\u231f\",\"\\\\lrcorner\"),oa(\"\\xa9\",\"\\\\copyright\"),oa(\"\\xae\",\"\\\\textregistered\"),oa(\"\\ufe0f\",\"\\\\textregistered\"),oa(\"\\\\vdots\",\"\\\\mathord{\\\\varvdots\\\\rule{0pt}{15pt}}\"),oa(\"\\u22ee\",\"\\\\vdots\"),oa(\"\\\\varGamma\",\"\\\\mathit{\\\\Gamma}\"),oa(\"\\\\varDelta\",\"\\\\mathit{\\\\Delta}\"),oa(\"\\\\varTheta\",\"\\\\mathit{\\\\Theta}\"),oa(\"\\\\varLambda\",\"\\\\mathit{\\\\Lambda}\"),oa(\"\\\\varXi\",\"\\\\mathit{\\\\Xi}\"),oa(\"\\\\varPi\",\"\\\\mathit{\\\\Pi}\"),oa(\"\\\\varSigma\",\"\\\\mathit{\\\\Sigma}\"),oa(\"\\\\varUpsilon\",\"\\\\mathit{\\\\Upsilon}\"),oa(\"\\\\varPhi\",\"\\\\mathit{\\\\Phi}\"),oa(\"\\\\varPsi\",\"\\\\mathit{\\\\Psi}\"),oa(\"\\\\varOmega\",\"\\\\mathit{\\\\Omega}\"),oa(\"\\\\colon\",\"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\"),oa(\"\\\\boxed\",\"\\\\fbox{$\\\\displaystyle{#1}$}\"),oa(\"\\\\iff\",\"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\"),oa(\"\\\\implies\",\"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\"),oa(\"\\\\impliedby\",\"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");var la={\",\":\"\\\\dotsc\",\"\\\\not\":\"\\\\dotsb\",\"+\":\"\\\\dotsb\",\"=\":\"\\\\dotsb\",\"<\":\"\\\\dotsb\",\">\":\"\\\\dotsb\",\"-\":\"\\\\dotsb\",\"*\":\"\\\\dotsb\",\":\":\"\\\\dotsb\",\"\\\\DOTSB\":\"\\\\dotsb\",\"\\\\coprod\":\"\\\\dotsb\",\"\\\\bigvee\":\"\\\\dotsb\",\"\\\\bigwedge\":\"\\\\dotsb\",\"\\\\biguplus\":\"\\\\dotsb\",\"\\\\bigcap\":\"\\\\dotsb\",\"\\\\bigcup\":\"\\\\dotsb\",\"\\\\prod\":\"\\\\dotsb\",\"\\\\sum\":\"\\\\dotsb\",\"\\\\bigotimes\":\"\\\\dotsb\",\"\\\\bigoplus\":\"\\\\dotsb\",\"\\\\bigodot\":\"\\\\dotsb\",\"\\\\bigsqcup\":\"\\\\dotsb\",\"\\\\And\":\"\\\\dotsb\",\"\\\\longrightarrow\":\"\\\\dotsb\",\"\\\\Longrightarrow\":\"\\\\dotsb\",\"\\\\longleftarrow\":\"\\\\dotsb\",\"\\\\Longleftarrow\":\"\\\\dotsb\",\"\\\\longleftrightarrow\":\"\\\\dotsb\",\"\\\\Longleftrightarrow\":\"\\\\dotsb\",\"\\\\mapsto\":\"\\\\dotsb\",\"\\\\longmapsto\":\"\\\\dotsb\",\"\\\\hookrightarrow\":\"\\\\dotsb\",\"\\\\doteq\":\"\\\\dotsb\",\"\\\\mathbin\":\"\\\\dotsb\",\"\\\\mathrel\":\"\\\\dotsb\",\"\\\\relbar\":\"\\\\dotsb\",\"\\\\Relbar\":\"\\\\dotsb\",\"\\\\xrightarrow\":\"\\\\dotsb\",\"\\\\xleftarrow\":\"\\\\dotsb\",\"\\\\DOTSI\":\"\\\\dotsi\",\"\\\\int\":\"\\\\dotsi\",\"\\\\oint\":\"\\\\dotsi\",\"\\\\iint\":\"\\\\dotsi\",\"\\\\iiint\":\"\\\\dotsi\",\"\\\\iiiint\":\"\\\\dotsi\",\"\\\\idotsint\":\"\\\\dotsi\",\"\\\\DOTSX\":\"\\\\dotsx\"};oa(\"\\\\dots\",function(t){var e=\"\\\\dotso\",r=t.expandAfterFuture().text;return r in la?e=la[r]:\"\\\\not\"===r.substr(0,4)?e=\"\\\\dotsb\":r in _.math&&c.contains([\"bin\",\"rel\"],_.math[r].group)&&(e=\"\\\\dotsb\"),e});var ma={\")\":!0,\"]\":!0,\"\\\\rbrack\":!0,\"\\\\}\":!0,\"\\\\rbrace\":!0,\"\\\\rangle\":!0,\"\\\\rceil\":!0,\"\\\\rfloor\":!0,\"\\\\rgroup\":!0,\"\\\\rmoustache\":!0,\"\\\\right\":!0,\"\\\\bigr\":!0,\"\\\\biggr\":!0,\"\\\\Bigr\":!0,\"\\\\Biggr\":!0,$:!0,\";\":!0,\".\":!0,\",\":!0};oa(\"\\\\dotso\",function(t){return t.future().text in ma?\"\\\\ldots\\\\,\":\"\\\\ldots\"}),oa(\"\\\\dotsc\",function(t){var e=t.future().text;return e in ma&&\",\"!==e?\"\\\\ldots\\\\,\":\"\\\\ldots\"}),oa(\"\\\\cdots\",function(t){return t.future().text in ma?\"\\\\@cdots\\\\,\":\"\\\\@cdots\"}),oa(\"\\\\dotsb\",\"\\\\cdots\"),oa(\"\\\\dotsm\",\"\\\\cdots\"),oa(\"\\\\dotsi\",\"\\\\!\\\\cdots\"),oa(\"\\\\dotsx\",\"\\\\ldots\\\\,\"),oa(\"\\\\DOTSI\",\"\\\\relax\"),oa(\"\\\\DOTSB\",\"\\\\relax\"),oa(\"\\\\DOTSX\",\"\\\\relax\"),oa(\"\\\\tmspace\",\"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\"),oa(\"\\\\,\",\"\\\\tmspace+{3mu}{.1667em}\"),oa(\"\\\\thinspace\",\"\\\\,\"),oa(\"\\\\>\",\"\\\\mskip{4mu}\"),oa(\"\\\\:\",\"\\\\tmspace+{4mu}{.2222em}\"),oa(\"\\\\medspace\",\"\\\\:\"),oa(\"\\\\;\",\"\\\\tmspace+{5mu}{.2777em}\"),oa(\"\\\\thickspace\",\"\\\\;\"),oa(\"\\\\!\",\"\\\\tmspace-{3mu}{.1667em}\"),oa(\"\\\\negthinspace\",\"\\\\!\"),oa(\"\\\\negmedspace\",\"\\\\tmspace-{4mu}{.2222em}\"),oa(\"\\\\negthickspace\",\"\\\\tmspace-{5mu}{.277em}\"),oa(\"\\\\enspace\",\"\\\\kern.5em \"),oa(\"\\\\enskip\",\"\\\\hskip.5em\\\\relax\"),oa(\"\\\\quad\",\"\\\\hskip1em\\\\relax\"),oa(\"\\\\qquad\",\"\\\\hskip2em\\\\relax\"),oa(\"\\\\tag\",\"\\\\@ifstar\\\\tag@literal\\\\tag@paren\"),oa(\"\\\\tag@paren\",\"\\\\tag@literal{({#1})}\"),oa(\"\\\\tag@literal\",function(t){if(t.macros.get(\"\\\\df@tag\"))throw new i(\"Multiple \\\\tag\");return\"\\\\gdef\\\\df@tag{\\\\text{#1}}\"}),oa(\"\\\\bmod\",\"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\\\\mathbin{\\\\rm mod}\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\"),oa(\"\\\\pod\",\"\\\\allowbreak\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\"),oa(\"\\\\pmod\",\"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\"),oa(\"\\\\mod\",\"\\\\allowbreak\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\rm mod}\\\\,\\\\,#1\"),oa(\"\\\\pmb\",\"\\\\html@mathml{\\\\@binrel{#1}{\\\\mathrlap{#1}\\\\mathrlap{\\\\mkern0.4mu\\\\raisebox{0.4mu}{$#1$}}{\\\\mkern0.8mu#1}}}{\\\\mathbf{#1}}\"),oa(\"\\\\\\\\\",\"\\\\newline\"),oa(\"\\\\TeX\",\"\\\\textrm{\\\\html@mathml{T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX}{TeX}}\");var ca=P[\"Main-Regular\"][\"T\".charCodeAt(0)][1]-.7*P[\"Main-Regular\"][\"A\".charCodeAt(0)][1]+\"em\";oa(\"\\\\LaTeX\",\"\\\\textrm{\\\\html@mathml{L\\\\kern-.36em\\\\raisebox{\"+ca+\"}{\\\\scriptsize A}\\\\kern-.15em\\\\TeX}{LaTeX}}\"),oa(\"\\\\KaTeX\",\"\\\\textrm{\\\\html@mathml{K\\\\kern-.17em\\\\raisebox{\"+ca+\"}{\\\\scriptsize A}\\\\kern-.15em\\\\TeX}{KaTeX}}\"),oa(\"\\\\hspace\",\"\\\\@ifstar\\\\@hspacer\\\\@hspace\"),oa(\"\\\\@hspace\",\"\\\\hskip #1\\\\relax\"),oa(\"\\\\@hspacer\",\"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\"),oa(\"\\\\ordinarycolon\",\":\"),oa(\"\\\\vcentcolon\",\"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\"),oa(\"\\\\dblcolon\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}{\\\\mathop{\\\\char\"2237}}'),oa(\"\\\\coloneqq\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}{\\\\mathop{\\\\char\"2254}}'),oa(\"\\\\Coloneqq\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}{\\\\mathop{\\\\char\"2237\\\\char\"3d}}'),oa(\"\\\\coloneq\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}{\\\\mathop{\\\\char\"3a\\\\char\"2212}}'),oa(\"\\\\Coloneq\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}{\\\\mathop{\\\\char\"2237\\\\char\"2212}}'),oa(\"\\\\eqqcolon\",'\\\\html@mathml{\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}{\\\\mathop{\\\\char\"2255}}'),oa(\"\\\\Eqqcolon\",'\\\\html@mathml{\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}{\\\\mathop{\\\\char\"3d\\\\char\"2237}}'),oa(\"\\\\eqcolon\",'\\\\html@mathml{\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}{\\\\mathop{\\\\char\"2239}}'),oa(\"\\\\Eqcolon\",'\\\\html@mathml{\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}{\\\\mathop{\\\\char\"2212\\\\char\"2237}}'),oa(\"\\\\colonapprox\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}{\\\\mathop{\\\\char\"3a\\\\char\"2248}}'),oa(\"\\\\Colonapprox\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}{\\\\mathop{\\\\char\"2237\\\\char\"2248}}'),oa(\"\\\\colonsim\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}{\\\\mathop{\\\\char\"3a\\\\char\"223c}}'),oa(\"\\\\Colonsim\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}{\\\\mathop{\\\\char\"2237\\\\char\"223c}}'),oa(\"\\u2237\",\"\\\\dblcolon\"),oa(\"\\u2239\",\"\\\\eqcolon\"),oa(\"\\u2254\",\"\\\\coloneqq\"),oa(\"\\u2255\",\"\\\\eqqcolon\"),oa(\"\\u2a74\",\"\\\\Coloneqq\"),oa(\"\\\\ratio\",\"\\\\vcentcolon\"),oa(\"\\\\coloncolon\",\"\\\\dblcolon\"),oa(\"\\\\colonequals\",\"\\\\coloneqq\"),oa(\"\\\\coloncolonequals\",\"\\\\Coloneqq\"),oa(\"\\\\equalscolon\",\"\\\\eqqcolon\"),oa(\"\\\\equalscoloncolon\",\"\\\\Eqqcolon\"),oa(\"\\\\colonminus\",\"\\\\coloneq\"),oa(\"\\\\coloncolonminus\",\"\\\\Coloneq\"),oa(\"\\\\minuscolon\",\"\\\\eqcolon\"),oa(\"\\\\minuscoloncolon\",\"\\\\Eqcolon\"),oa(\"\\\\coloncolonapprox\",\"\\\\Colonapprox\"),oa(\"\\\\coloncolonsim\",\"\\\\Colonsim\"),oa(\"\\\\simcolon\",\"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\"),oa(\"\\\\simcoloncolon\",\"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\"),oa(\"\\\\approxcolon\",\"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\"),oa(\"\\\\approxcoloncolon\",\"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\"),oa(\"\\\\notni\",\"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220c}}\"),oa(\"\\\\limsup\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{lim\\\\,sup}}\\\\limits\"),oa(\"\\\\liminf\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{lim\\\\,inf}}\\\\limits\"),oa(\"\\\\gvertneqq\",\"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\"),oa(\"\\\\lvertneqq\",\"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\"),oa(\"\\\\ngeqq\",\"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\"),oa(\"\\\\ngeqslant\",\"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\"),oa(\"\\\\nleqq\",\"\\\\html@mathml{\\\\@nleqq}{\\u2270}\"),oa(\"\\\\nleqslant\",\"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\"),oa(\"\\\\nshortmid\",\"\\\\html@mathml{\\\\@nshortmid}{\\u2224}\"),oa(\"\\\\nshortparallel\",\"\\\\html@mathml{\\\\@nshortparallel}{\\u2226}\"),oa(\"\\\\nsubseteqq\",\"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\"),oa(\"\\\\nsupseteqq\",\"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\"),oa(\"\\\\varsubsetneq\",\"\\\\html@mathml{\\\\@varsubsetneq}{\\u228a}\"),oa(\"\\\\varsubsetneqq\",\"\\\\html@mathml{\\\\@varsubsetneqq}{\\u2acb}\"),oa(\"\\\\varsupsetneq\",\"\\\\html@mathml{\\\\@varsupsetneq}{\\u228b}\"),oa(\"\\\\varsupsetneqq\",\"\\\\html@mathml{\\\\@varsupsetneqq}{\\u2acc}\"),oa(\"\\\\llbracket\",\"\\\\html@mathml{\\\\mathopen{[\\\\mkern-3.2mu[}}{\\\\mathopen{\\\\char`\\u27e6}}\"),oa(\"\\\\rrbracket\",\"\\\\html@mathml{\\\\mathclose{]\\\\mkern-3.2mu]}}{\\\\mathclose{\\\\char`\\u27e7}}\"),oa(\"\\u27e6\",\"\\\\llbracket\"),oa(\"\\u27e7\",\"\\\\rrbracket\"),oa(\"\\\\lBrace\",\"\\\\html@mathml{\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}{\\\\mathopen{\\\\char`\\u2983}}\"),oa(\"\\\\rBrace\",\"\\\\html@mathml{\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}{\\\\mathclose{\\\\char`\\u2984}}\"),oa(\"\\u2983\",\"\\\\lBrace\"),oa(\"\\u2984\",\"\\\\rBrace\"),oa(\"\\\\darr\",\"\\\\downarrow\"),oa(\"\\\\dArr\",\"\\\\Downarrow\"),oa(\"\\\\Darr\",\"\\\\Downarrow\"),oa(\"\\\\lang\",\"\\\\langle\"),oa(\"\\\\rang\",\"\\\\rangle\"),oa(\"\\\\uarr\",\"\\\\uparrow\"),oa(\"\\\\uArr\",\"\\\\Uparrow\"),oa(\"\\\\Uarr\",\"\\\\Uparrow\"),oa(\"\\\\N\",\"\\\\mathbb{N}\"),oa(\"\\\\R\",\"\\\\mathbb{R}\"),oa(\"\\\\Z\",\"\\\\mathbb{Z}\"),oa(\"\\\\alef\",\"\\\\aleph\"),oa(\"\\\\alefsym\",\"\\\\aleph\"),oa(\"\\\\Alpha\",\"\\\\mathrm{A}\"),oa(\"\\\\Beta\",\"\\\\mathrm{B}\"),oa(\"\\\\bull\",\"\\\\bullet\"),oa(\"\\\\Chi\",\"\\\\mathrm{X}\"),oa(\"\\\\clubs\",\"\\\\clubsuit\"),oa(\"\\\\cnums\",\"\\\\mathbb{C}\"),oa(\"\\\\Complex\",\"\\\\mathbb{C}\"),oa(\"\\\\Dagger\",\"\\\\ddagger\"),oa(\"\\\\diamonds\",\"\\\\diamondsuit\"),oa(\"\\\\empty\",\"\\\\emptyset\"),oa(\"\\\\Epsilon\",\"\\\\mathrm{E}\"),oa(\"\\\\Eta\",\"\\\\mathrm{H}\"),oa(\"\\\\exist\",\"\\\\exists\"),oa(\"\\\\harr\",\"\\\\leftrightarrow\"),oa(\"\\\\hArr\",\"\\\\Leftrightarrow\"),oa(\"\\\\Harr\",\"\\\\Leftrightarrow\"),oa(\"\\\\hearts\",\"\\\\heartsuit\"),oa(\"\\\\image\",\"\\\\Im\"),oa(\"\\\\infin\",\"\\\\infty\"),oa(\"\\\\Iota\",\"\\\\mathrm{I}\"),oa(\"\\\\isin\",\"\\\\in\"),oa(\"\\\\Kappa\",\"\\\\mathrm{K}\"),oa(\"\\\\larr\",\"\\\\leftarrow\"),oa(\"\\\\lArr\",\"\\\\Leftarrow\"),oa(\"\\\\Larr\",\"\\\\Leftarrow\"),oa(\"\\\\lrarr\",\"\\\\leftrightarrow\"),oa(\"\\\\lrArr\",\"\\\\Leftrightarrow\"),oa(\"\\\\Lrarr\",\"\\\\Leftrightarrow\"),oa(\"\\\\Mu\",\"\\\\mathrm{M}\"),oa(\"\\\\natnums\",\"\\\\mathbb{N}\"),oa(\"\\\\Nu\",\"\\\\mathrm{N}\"),oa(\"\\\\Omicron\",\"\\\\mathrm{O}\"),oa(\"\\\\plusmn\",\"\\\\pm\"),oa(\"\\\\rarr\",\"\\\\rightarrow\"),oa(\"\\\\rArr\",\"\\\\Rightarrow\"),oa(\"\\\\Rarr\",\"\\\\Rightarrow\"),oa(\"\\\\real\",\"\\\\Re\"),oa(\"\\\\reals\",\"\\\\mathbb{R}\"),oa(\"\\\\Reals\",\"\\\\mathbb{R}\"),oa(\"\\\\Rho\",\"\\\\mathrm{P}\"),oa(\"\\\\sdot\",\"\\\\cdot\"),oa(\"\\\\sect\",\"\\\\S\"),oa(\"\\\\spades\",\"\\\\spadesuit\"),oa(\"\\\\sub\",\"\\\\subset\"),oa(\"\\\\sube\",\"\\\\subseteq\"),oa(\"\\\\supe\",\"\\\\supseteq\"),oa(\"\\\\Tau\",\"\\\\mathrm{T}\"),oa(\"\\\\thetasym\",\"\\\\vartheta\"),oa(\"\\\\weierp\",\"\\\\wp\"),oa(\"\\\\Zeta\",\"\\\\mathrm{Z}\"),oa(\"\\\\argmin\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{arg\\\\,min}}\\\\limits\"),oa(\"\\\\argmax\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{arg\\\\,max}}\\\\limits\"),oa(\"\\\\blue\",\"\\\\textcolor{##6495ed}{#1}\"),oa(\"\\\\orange\",\"\\\\textcolor{##ffa500}{#1}\"),oa(\"\\\\pink\",\"\\\\textcolor{##ff00af}{#1}\"),oa(\"\\\\red\",\"\\\\textcolor{##df0030}{#1}\"),oa(\"\\\\green\",\"\\\\textcolor{##28ae7b}{#1}\"),oa(\"\\\\gray\",\"\\\\textcolor{gray}{##1}\"),oa(\"\\\\purple\",\"\\\\textcolor{##9d38bd}{#1}\"),oa(\"\\\\blueA\",\"\\\\textcolor{##ccfaff}{#1}\"),oa(\"\\\\blueB\",\"\\\\textcolor{##80f6ff}{#1}\"),oa(\"\\\\blueC\",\"\\\\textcolor{##63d9ea}{#1}\"),oa(\"\\\\blueD\",\"\\\\textcolor{##11accd}{#1}\"),oa(\"\\\\blueE\",\"\\\\textcolor{##0c7f99}{#1}\"),oa(\"\\\\tealA\",\"\\\\textcolor{##94fff5}{#1}\"),oa(\"\\\\tealB\",\"\\\\textcolor{##26edd5}{#1}\"),oa(\"\\\\tealC\",\"\\\\textcolor{##01d1c1}{#1}\"),oa(\"\\\\tealD\",\"\\\\textcolor{##01a995}{#1}\"),oa(\"\\\\tealE\",\"\\\\textcolor{##208170}{#1}\"),oa(\"\\\\greenA\",\"\\\\textcolor{##b6ffb0}{#1}\"),oa(\"\\\\greenB\",\"\\\\textcolor{##8af281}{#1}\"),oa(\"\\\\greenC\",\"\\\\textcolor{##74cf70}{#1}\"),oa(\"\\\\greenD\",\"\\\\textcolor{##1fab54}{#1}\"),oa(\"\\\\greenE\",\"\\\\textcolor{##0d923f}{#1}\"),oa(\"\\\\goldA\",\"\\\\textcolor{##ffd0a9}{#1}\"),oa(\"\\\\goldB\",\"\\\\textcolor{##ffbb71}{#1}\"),oa(\"\\\\goldC\",\"\\\\textcolor{##ff9c39}{#1}\"),oa(\"\\\\goldD\",\"\\\\textcolor{##e07d10}{#1}\"),oa(\"\\\\goldE\",\"\\\\textcolor{##a75a05}{#1}\"),oa(\"\\\\redA\",\"\\\\textcolor{##fca9a9}{#1}\"),oa(\"\\\\redB\",\"\\\\textcolor{##ff8482}{#1}\"),oa(\"\\\\redC\",\"\\\\textcolor{##f9685d}{#1}\"),oa(\"\\\\redD\",\"\\\\textcolor{##e84d39}{#1}\"),oa(\"\\\\redE\",\"\\\\textcolor{##bc2612}{#1}\"),oa(\"\\\\maroonA\",\"\\\\textcolor{##ffbde0}{#1}\"),oa(\"\\\\maroonB\",\"\\\\textcolor{##ff92c6}{#1}\"),oa(\"\\\\maroonC\",\"\\\\textcolor{##ed5fa6}{#1}\"),oa(\"\\\\maroonD\",\"\\\\textcolor{##ca337c}{#1}\"),oa(\"\\\\maroonE\",\"\\\\textcolor{##9e034e}{#1}\"),oa(\"\\\\purpleA\",\"\\\\textcolor{##ddd7ff}{#1}\"),oa(\"\\\\purpleB\",\"\\\\textcolor{##c6b9fc}{#1}\"),oa(\"\\\\purpleC\",\"\\\\textcolor{##aa87ff}{#1}\"),oa(\"\\\\purpleD\",\"\\\\textcolor{##7854ab}{#1}\"),oa(\"\\\\purpleE\",\"\\\\textcolor{##543b78}{#1}\"),oa(\"\\\\mintA\",\"\\\\textcolor{##f5f9e8}{#1}\"),oa(\"\\\\mintB\",\"\\\\textcolor{##edf2df}{#1}\"),oa(\"\\\\mintC\",\"\\\\textcolor{##e0e5cc}{#1}\"),oa(\"\\\\grayA\",\"\\\\textcolor{##f6f7f7}{#1}\"),oa(\"\\\\grayB\",\"\\\\textcolor{##f0f1f2}{#1}\"),oa(\"\\\\grayC\",\"\\\\textcolor{##e3e5e6}{#1}\"),oa(\"\\\\grayD\",\"\\\\textcolor{##d6d8da}{#1}\"),oa(\"\\\\grayE\",\"\\\\textcolor{##babec2}{#1}\"),oa(\"\\\\grayF\",\"\\\\textcolor{##888d93}{#1}\"),oa(\"\\\\grayG\",\"\\\\textcolor{##626569}{#1}\"),oa(\"\\\\grayH\",\"\\\\textcolor{##3b3e40}{#1}\"),oa(\"\\\\grayI\",\"\\\\textcolor{##21242c}{#1}\"),oa(\"\\\\kaBlue\",\"\\\\textcolor{##314453}{#1}\"),oa(\"\\\\kaGreen\",\"\\\\textcolor{##71B307}{#1}\");var ua={\"\\\\relax\":!0,\"^\":!0,_:!0,\"\\\\limits\":!0,\"\\\\nolimits\":!0},da=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ra(na,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new ea(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(\" \"!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;r<t;++r){this.consumeSpaces();var a=this.popToken();if(\"{\"===a.text){for(var n=[],o=1;0!==o;){var s=this.popToken();if(n.push(s),\"{\"===s.text)++o;else if(\"}\"===s.text)--o;else if(\"EOF\"===s.text)throw new i(\"End of input in macro argument\",a)}n.pop(),n.reverse(),e[r]=n}else{if(\"EOF\"===a.text)throw new i(\"End of input expecting macro argument\");e[r]=[a]}}return e},e.expandOnce=function(){var t=this.popToken(),e=t.text,r=this._getExpansion(e);if(null==r)return this.pushToken(t),t;if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new i(\"Too many expansions: infinite loop or need to increase maxExpand setting\");var a=r.tokens;if(r.numArgs)for(var n=this.consumeArgs(r.numArgs),o=(a=a.slice()).length-1;o>=0;--o){var s=a[o];if(\"#\"===s.text){if(0===o)throw new i(\"Incomplete placeholder at end of macro body\",s);if(\"#\"===(s=a[--o]).text)a.splice(o+1,1);else{if(!/^[1-9]$/.test(s.text))throw new i(\"Not a valid argument number\",s);var h;(h=a).splice.apply(h,[o,2].concat(n[+s.text-1]))}}}return this.pushTokens(a),a},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if(\"\\\\relax\"!==t.text)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){if(this.macros.get(t)){var e=[],r=this.stack.length;for(this.pushToken(new n(t));this.stack.length>r;){this.expandOnce()instanceof n&&e.push(this.stack.pop())}return e}},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(\"\"):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r=\"function\"==typeof e?e(this):e;if(\"string\"==typeof r){var a=0;if(-1!==r.indexOf(\"#\"))for(var n=r.replace(/##/g,\"\");-1!==n.indexOf(\"#\"+(a+1));)++a;for(var o=new ea(r,this.settings),i=[],s=o.lex();\"EOF\"!==s.text;)i.push(s),s=o.lex();return i.reverse(),{tokens:i,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||Kr.hasOwnProperty(t)||_.math.hasOwnProperty(t)||_.text.hasOwnProperty(t)||ua.hasOwnProperty(t)},t}(),pa={\"\\u0301\":{text:\"\\\\'\",math:\"\\\\acute\"},\"\\u0300\":{text:\"\\\\`\",math:\"\\\\grave\"},\"\\u0308\":{text:'\\\\\"',math:\"\\\\ddot\"},\"\\u0303\":{text:\"\\\\~\",math:\"\\\\tilde\"},\"\\u0304\":{text:\"\\\\=\",math:\"\\\\bar\"},\"\\u0306\":{text:\"\\\\u\",math:\"\\\\breve\"},\"\\u030c\":{text:\"\\\\v\",math:\"\\\\check\"},\"\\u0302\":{text:\"\\\\^\",math:\"\\\\hat\"},\"\\u0307\":{text:\"\\\\.\",math:\"\\\\dot\"},\"\\u030a\":{text:\"\\\\r\",math:\"\\\\mathring\"},\"\\u030b\":{text:\"\\\\H\"}},fa={\"\\xe1\":\"a\\u0301\",\"\\xe0\":\"a\\u0300\",\"\\xe4\":\"a\\u0308\",\"\\u01df\":\"a\\u0308\\u0304\",\"\\xe3\":\"a\\u0303\",\"\\u0101\":\"a\\u0304\",\"\\u0103\":\"a\\u0306\",\"\\u1eaf\":\"a\\u0306\\u0301\",\"\\u1eb1\":\"a\\u0306\\u0300\",\"\\u1eb5\":\"a\\u0306\\u0303\",\"\\u01ce\":\"a\\u030c\",\"\\xe2\":\"a\\u0302\",\"\\u1ea5\":\"a\\u0302\\u0301\",\"\\u1ea7\":\"a\\u0302\\u0300\",\"\\u1eab\":\"a\\u0302\\u0303\",\"\\u0227\":\"a\\u0307\",\"\\u01e1\":\"a\\u0307\\u0304\",\"\\xe5\":\"a\\u030a\",\"\\u01fb\":\"a\\u030a\\u0301\",\"\\u1e03\":\"b\\u0307\",\"\\u0107\":\"c\\u0301\",\"\\u010d\":\"c\\u030c\",\"\\u0109\":\"c\\u0302\",\"\\u010b\":\"c\\u0307\",\"\\u010f\":\"d\\u030c\",\"\\u1e0b\":\"d\\u0307\",\"\\xe9\":\"e\\u0301\",\"\\xe8\":\"e\\u0300\",\"\\xeb\":\"e\\u0308\",\"\\u1ebd\":\"e\\u0303\",\"\\u0113\":\"e\\u0304\",\"\\u1e17\":\"e\\u0304\\u0301\",\"\\u1e15\":\"e\\u0304\\u0300\",\"\\u0115\":\"e\\u0306\",\"\\u011b\":\"e\\u030c\",\"\\xea\":\"e\\u0302\",\"\\u1ebf\":\"e\\u0302\\u0301\",\"\\u1ec1\":\"e\\u0302\\u0300\",\"\\u1ec5\":\"e\\u0302\\u0303\",\"\\u0117\":\"e\\u0307\",\"\\u1e1f\":\"f\\u0307\",\"\\u01f5\":\"g\\u0301\",\"\\u1e21\":\"g\\u0304\",\"\\u011f\":\"g\\u0306\",\"\\u01e7\":\"g\\u030c\",\"\\u011d\":\"g\\u0302\",\"\\u0121\":\"g\\u0307\",\"\\u1e27\":\"h\\u0308\",\"\\u021f\":\"h\\u030c\",\"\\u0125\":\"h\\u0302\",\"\\u1e23\":\"h\\u0307\",\"\\xed\":\"i\\u0301\",\"\\xec\":\"i\\u0300\",\"\\xef\":\"i\\u0308\",\"\\u1e2f\":\"i\\u0308\\u0301\",\"\\u0129\":\"i\\u0303\",\"\\u012b\":\"i\\u0304\",\"\\u012d\":\"i\\u0306\",\"\\u01d0\":\"i\\u030c\",\"\\xee\":\"i\\u0302\",\"\\u01f0\":\"j\\u030c\",\"\\u0135\":\"j\\u0302\",\"\\u1e31\":\"k\\u0301\",\"\\u01e9\":\"k\\u030c\",\"\\u013a\":\"l\\u0301\",\"\\u013e\":\"l\\u030c\",\"\\u1e3f\":\"m\\u0301\",\"\\u1e41\":\"m\\u0307\",\"\\u0144\":\"n\\u0301\",\"\\u01f9\":\"n\\u0300\",\"\\xf1\":\"n\\u0303\",\"\\u0148\":\"n\\u030c\",\"\\u1e45\":\"n\\u0307\",\"\\xf3\":\"o\\u0301\",\"\\xf2\":\"o\\u0300\",\"\\xf6\":\"o\\u0308\",\"\\u022b\":\"o\\u0308\\u0304\",\"\\xf5\":\"o\\u0303\",\"\\u1e4d\":\"o\\u0303\\u0301\",\"\\u1e4f\":\"o\\u0303\\u0308\",\"\\u022d\":\"o\\u0303\\u0304\",\"\\u014d\":\"o\\u0304\",\"\\u1e53\":\"o\\u0304\\u0301\",\"\\u1e51\":\"o\\u0304\\u0300\",\"\\u014f\":\"o\\u0306\",\"\\u01d2\":\"o\\u030c\",\"\\xf4\":\"o\\u0302\",\"\\u1ed1\":\"o\\u0302\\u0301\",\"\\u1ed3\":\"o\\u0302\\u0300\",\"\\u1ed7\":\"o\\u0302\\u0303\",\"\\u022f\":\"o\\u0307\",\"\\u0231\":\"o\\u0307\\u0304\",\"\\u0151\":\"o\\u030b\",\"\\u1e55\":\"p\\u0301\",\"\\u1e57\":\"p\\u0307\",\"\\u0155\":\"r\\u0301\",\"\\u0159\":\"r\\u030c\",\"\\u1e59\":\"r\\u0307\",\"\\u015b\":\"s\\u0301\",\"\\u1e65\":\"s\\u0301\\u0307\",\"\\u0161\":\"s\\u030c\",\"\\u1e67\":\"s\\u030c\\u0307\",\"\\u015d\":\"s\\u0302\",\"\\u1e61\":\"s\\u0307\",\"\\u1e97\":\"t\\u0308\",\"\\u0165\":\"t\\u030c\",\"\\u1e6b\":\"t\\u0307\",\"\\xfa\":\"u\\u0301\",\"\\xf9\":\"u\\u0300\",\"\\xfc\":\"u\\u0308\",\"\\u01d8\":\"u\\u0308\\u0301\",\"\\u01dc\":\"u\\u0308\\u0300\",\"\\u01d6\":\"u\\u0308\\u0304\",\"\\u01da\":\"u\\u0308\\u030c\",\"\\u0169\":\"u\\u0303\",\"\\u1e79\":\"u\\u0303\\u0301\",\"\\u016b\":\"u\\u0304\",\"\\u1e7b\":\"u\\u0304\\u0308\",\"\\u016d\":\"u\\u0306\",\"\\u01d4\":\"u\\u030c\",\"\\xfb\":\"u\\u0302\",\"\\u016f\":\"u\\u030a\",\"\\u0171\":\"u\\u030b\",\"\\u1e7d\":\"v\\u0303\",\"\\u1e83\":\"w\\u0301\",\"\\u1e81\":\"w\\u0300\",\"\\u1e85\":\"w\\u0308\",\"\\u0175\":\"w\\u0302\",\"\\u1e87\":\"w\\u0307\",\"\\u1e98\":\"w\\u030a\",\"\\u1e8d\":\"x\\u0308\",\"\\u1e8b\":\"x\\u0307\",\"\\xfd\":\"y\\u0301\",\"\\u1ef3\":\"y\\u0300\",\"\\xff\":\"y\\u0308\",\"\\u1ef9\":\"y\\u0303\",\"\\u0233\":\"y\\u0304\",\"\\u0177\":\"y\\u0302\",\"\\u1e8f\":\"y\\u0307\",\"\\u1e99\":\"y\\u030a\",\"\\u017a\":\"z\\u0301\",\"\\u017e\":\"z\\u030c\",\"\\u1e91\":\"z\\u0302\",\"\\u017c\":\"z\\u0307\",\"\\xc1\":\"A\\u0301\",\"\\xc0\":\"A\\u0300\",\"\\xc4\":\"A\\u0308\",\"\\u01de\":\"A\\u0308\\u0304\",\"\\xc3\":\"A\\u0303\",\"\\u0100\":\"A\\u0304\",\"\\u0102\":\"A\\u0306\",\"\\u1eae\":\"A\\u0306\\u0301\",\"\\u1eb0\":\"A\\u0306\\u0300\",\"\\u1eb4\":\"A\\u0306\\u0303\",\"\\u01cd\":\"A\\u030c\",\"\\xc2\":\"A\\u0302\",\"\\u1ea4\":\"A\\u0302\\u0301\",\"\\u1ea6\":\"A\\u0302\\u0300\",\"\\u1eaa\":\"A\\u0302\\u0303\",\"\\u0226\":\"A\\u0307\",\"\\u01e0\":\"A\\u0307\\u0304\",\"\\xc5\":\"A\\u030a\",\"\\u01fa\":\"A\\u030a\\u0301\",\"\\u1e02\":\"B\\u0307\",\"\\u0106\":\"C\\u0301\",\"\\u010c\":\"C\\u030c\",\"\\u0108\":\"C\\u0302\",\"\\u010a\":\"C\\u0307\",\"\\u010e\":\"D\\u030c\",\"\\u1e0a\":\"D\\u0307\",\"\\xc9\":\"E\\u0301\",\"\\xc8\":\"E\\u0300\",\"\\xcb\":\"E\\u0308\",\"\\u1ebc\":\"E\\u0303\",\"\\u0112\":\"E\\u0304\",\"\\u1e16\":\"E\\u0304\\u0301\",\"\\u1e14\":\"E\\u0304\\u0300\",\"\\u0114\":\"E\\u0306\",\"\\u011a\":\"E\\u030c\",\"\\xca\":\"E\\u0302\",\"\\u1ebe\":\"E\\u0302\\u0301\",\"\\u1ec0\":\"E\\u0302\\u0300\",\"\\u1ec4\":\"E\\u0302\\u0303\",\"\\u0116\":\"E\\u0307\",\"\\u1e1e\":\"F\\u0307\",\"\\u01f4\":\"G\\u0301\",\"\\u1e20\":\"G\\u0304\",\"\\u011e\":\"G\\u0306\",\"\\u01e6\":\"G\\u030c\",\"\\u011c\":\"G\\u0302\",\"\\u0120\":\"G\\u0307\",\"\\u1e26\":\"H\\u0308\",\"\\u021e\":\"H\\u030c\",\"\\u0124\":\"H\\u0302\",\"\\u1e22\":\"H\\u0307\",\"\\xcd\":\"I\\u0301\",\"\\xcc\":\"I\\u0300\",\"\\xcf\":\"I\\u0308\",\"\\u1e2e\":\"I\\u0308\\u0301\",\"\\u0128\":\"I\\u0303\",\"\\u012a\":\"I\\u0304\",\"\\u012c\":\"I\\u0306\",\"\\u01cf\":\"I\\u030c\",\"\\xce\":\"I\\u0302\",\"\\u0130\":\"I\\u0307\",\"\\u0134\":\"J\\u0302\",\"\\u1e30\":\"K\\u0301\",\"\\u01e8\":\"K\\u030c\",\"\\u0139\":\"L\\u0301\",\"\\u013d\":\"L\\u030c\",\"\\u1e3e\":\"M\\u0301\",\"\\u1e40\":\"M\\u0307\",\"\\u0143\":\"N\\u0301\",\"\\u01f8\":\"N\\u0300\",\"\\xd1\":\"N\\u0303\",\"\\u0147\":\"N\\u030c\",\"\\u1e44\":\"N\\u0307\",\"\\xd3\":\"O\\u0301\",\"\\xd2\":\"O\\u0300\",\"\\xd6\":\"O\\u0308\",\"\\u022a\":\"O\\u0308\\u0304\",\"\\xd5\":\"O\\u0303\",\"\\u1e4c\":\"O\\u0303\\u0301\",\"\\u1e4e\":\"O\\u0303\\u0308\",\"\\u022c\":\"O\\u0303\\u0304\",\"\\u014c\":\"O\\u0304\",\"\\u1e52\":\"O\\u0304\\u0301\",\"\\u1e50\":\"O\\u0304\\u0300\",\"\\u014e\":\"O\\u0306\",\"\\u01d1\":\"O\\u030c\",\"\\xd4\":\"O\\u0302\",\"\\u1ed0\":\"O\\u0302\\u0301\",\"\\u1ed2\":\"O\\u0302\\u0300\",\"\\u1ed6\":\"O\\u0302\\u0303\",\"\\u022e\":\"O\\u0307\",\"\\u0230\":\"O\\u0307\\u0304\",\"\\u0150\":\"O\\u030b\",\"\\u1e54\":\"P\\u0301\",\"\\u1e56\":\"P\\u0307\",\"\\u0154\":\"R\\u0301\",\"\\u0158\":\"R\\u030c\",\"\\u1e58\":\"R\\u0307\",\"\\u015a\":\"S\\u0301\",\"\\u1e64\":\"S\\u0301\\u0307\",\"\\u0160\":\"S\\u030c\",\"\\u1e66\":\"S\\u030c\\u0307\",\"\\u015c\":\"S\\u0302\",\"\\u1e60\":\"S\\u0307\",\"\\u0164\":\"T\\u030c\",\"\\u1e6a\":\"T\\u0307\",\"\\xda\":\"U\\u0301\",\"\\xd9\":\"U\\u0300\",\"\\xdc\":\"U\\u0308\",\"\\u01d7\":\"U\\u0308\\u0301\",\"\\u01db\":\"U\\u0308\\u0300\",\"\\u01d5\":\"U\\u0308\\u0304\",\"\\u01d9\":\"U\\u0308\\u030c\",\"\\u0168\":\"U\\u0303\",\"\\u1e78\":\"U\\u0303\\u0301\",\"\\u016a\":\"U\\u0304\",\"\\u1e7a\":\"U\\u0304\\u0308\",\"\\u016c\":\"U\\u0306\",\"\\u01d3\":\"U\\u030c\",\"\\xdb\":\"U\\u0302\",\"\\u016e\":\"U\\u030a\",\"\\u0170\":\"U\\u030b\",\"\\u1e7c\":\"V\\u0303\",\"\\u1e82\":\"W\\u0301\",\"\\u1e80\":\"W\\u0300\",\"\\u1e84\":\"W\\u0308\",\"\\u0174\":\"W\\u0302\",\"\\u1e86\":\"W\\u0307\",\"\\u1e8c\":\"X\\u0308\",\"\\u1e8a\":\"X\\u0307\",\"\\xdd\":\"Y\\u0301\",\"\\u1ef2\":\"Y\\u0300\",\"\\u0178\":\"Y\\u0308\",\"\\u1ef8\":\"Y\\u0303\",\"\\u0232\":\"Y\\u0304\",\"\\u0176\":\"Y\\u0302\",\"\\u1e8e\":\"Y\\u0307\",\"\\u0179\":\"Z\\u0301\",\"\\u017d\":\"Z\\u030c\",\"\\u1e90\":\"Z\\u0302\",\"\\u017b\":\"Z\\u0307\",\"\\u03ac\":\"\\u03b1\\u0301\",\"\\u1f70\":\"\\u03b1\\u0300\",\"\\u1fb1\":\"\\u03b1\\u0304\",\"\\u1fb0\":\"\\u03b1\\u0306\",\"\\u03ad\":\"\\u03b5\\u0301\",\"\\u1f72\":\"\\u03b5\\u0300\",\"\\u03ae\":\"\\u03b7\\u0301\",\"\\u1f74\":\"\\u03b7\\u0300\",\"\\u03af\":\"\\u03b9\\u0301\",\"\\u1f76\":\"\\u03b9\\u0300\",\"\\u03ca\":\"\\u03b9\\u0308\",\"\\u0390\":\"\\u03b9\\u0308\\u0301\",\"\\u1fd2\":\"\\u03b9\\u0308\\u0300\",\"\\u1fd1\":\"\\u03b9\\u0304\",\"\\u1fd0\":\"\\u03b9\\u0306\",\"\\u03cc\":\"\\u03bf\\u0301\",\"\\u1f78\":\"\\u03bf\\u0300\",\"\\u03cd\":\"\\u03c5\\u0301\",\"\\u1f7a\":\"\\u03c5\\u0300\",\"\\u03cb\":\"\\u03c5\\u0308\",\"\\u03b0\":\"\\u03c5\\u0308\\u0301\",\"\\u1fe2\":\"\\u03c5\\u0308\\u0300\",\"\\u1fe1\":\"\\u03c5\\u0304\",\"\\u1fe0\":\"\\u03c5\\u0306\",\"\\u03ce\":\"\\u03c9\\u0301\",\"\\u1f7c\":\"\\u03c9\\u0300\",\"\\u038e\":\"\\u03a5\\u0301\",\"\\u1fea\":\"\\u03a5\\u0300\",\"\\u03ab\":\"\\u03a5\\u0308\",\"\\u1fe9\":\"\\u03a5\\u0304\",\"\\u1fe8\":\"\\u03a5\\u0306\",\"\\u038f\":\"\\u03a9\\u0301\",\"\\u1ffa\":\"\\u03a9\\u0300\"},ga=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode=\"math\",this.gullet=new da(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.nextToken.text!==t)throw new i(\"Expected '\"+t+\"', got '\"+this.nextToken.text+\"'\",this.nextToken);e&&this.consume()},e.consume=function(){this.nextToken=this.gullet.expandNextToken()},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set(\"\\\\color\",\"\\\\textcolor\"),this.consume();var t=this.parseExpression(!1);return this.expect(\"EOF\",!1),this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){\"math\"===this.mode&&this.consumeSpaces();var n=this.nextToken;if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&Kr[n.text]&&Kr[n.text].infix)break;var o=this.parseAtom(r);if(!o)break;a.push(o)}return\"text\"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a<t.length;a++){var n=Pt(t[a],\"infix\");if(n){if(-1!==r)throw new i(\"only one infix operator per group\",n.token);r=a,e=n.replaceWith}}if(-1!==r&&e){var o,s,h=t.slice(0,r),l=t.slice(r+1);return o=1===h.length&&\"ordgroup\"===h[0].type?h[0]:{type:\"ordgroup\",mode:this.mode,body:h},s=1===l.length&&\"ordgroup\"===l[0].type?l[0]:{type:\"ordgroup\",mode:this.mode,body:l},[\"\\\\\\\\abovefrac\"===e?this.callFunction(e,[o,t[r],s],[]):this.callFunction(e,[o,s],[])]}return t},e.handleSupSubscript=function(e){var r=this.nextToken,a=r.text;this.consume(),this.consumeSpaces();var n=this.parseGroup(e,!1,t.SUPSUB_GREEDINESS);if(!n)throw new i(\"Expected group after '\"+a+\"'\",r);return n},e.handleUnsupportedCmd=function(){for(var t=this.nextToken.text,e=[],r=0;r<t.length;r++)e.push({type:\"textord\",mode:\"text\",text:t[r]});var a={type:\"text\",mode:this.mode,body:e},n={type:\"color\",mode:this.mode,color:this.settings.errorColor,body:[a]};return this.consume(),n},e.parseAtom=function(t){var e,r,a=this.parseGroup(\"atom\",!1,null,t);if(\"text\"===this.mode)return a;for(;;){this.consumeSpaces();var n=this.nextToken;if(\"\\\\limits\"===n.text||\"\\\\nolimits\"===n.text){var o=Pt(a,\"op\");if(!o)throw new i(\"Limit controls must follow a math operator\",n);var s=\"\\\\limits\"===n.text;o.limits=s,o.alwaysHandleSupSub=!0,this.consume()}else if(\"^\"===n.text){if(e)throw new i(\"Double superscript\",n);e=this.handleSupSubscript(\"superscript\")}else if(\"_\"===n.text){if(r)throw new i(\"Double subscript\",n);r=this.handleSupSubscript(\"subscript\")}else{if(\"'\"!==n.text)break;if(e)throw new i(\"Double superscript\",n);var h={type:\"textord\",mode:this.mode,text:\"\\\\prime\"},l=[h];for(this.consume();\"'\"===this.nextToken.text;)l.push(h),this.consume();\"^\"===this.nextToken.text&&l.push(this.handleSupSubscript(\"superscript\")),e={type:\"ordgroup\",mode:this.mode,body:l}}}return e||r?{type:\"supsub\",mode:this.mode,base:a,sup:e,sub:r}:a},e.parseFunction=function(t,e,r){var a=this.nextToken,n=a.text,o=Kr[n];if(!o)return null;if(null!=r&&o.greediness<=r)throw new i(\"Got function '\"+n+\"' with no arguments\"+(e?\" as \"+e:\"\"),a);if(\"text\"===this.mode&&!o.allowedInText)throw new i(\"Can't use function '\"+n+\"' in text mode\",a);if(\"math\"===this.mode&&!1===o.allowedInMath)throw new i(\"Can't use function '\"+n+\"' in math mode\",a);if(o.argTypes&&\"url\"===o.argTypes[0]&&this.gullet.lexer.setCatcode(\"%\",13),o.consumeMode){var s=this.mode;this.switchMode(o.consumeMode),this.consume(),this.switchMode(s)}else this.consume();var h=this.parseArguments(n,o),l=h.args,m=h.optArgs;return this.callFunction(n,l,m,a,t)},e.callFunction=function(t,e,r,a,n){var o={funcName:t,parser:this,token:a,breakOnTokenText:n},s=Kr[t];if(s&&s.handler)return s.handler(o,e,r);throw new i(\"No function handler for \"+t)},e.parseArguments=function(t,e){var r=e.numArgs+e.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=e.greediness,n=[],o=[],s=0;s<r;s++){var h=e.argTypes&&e.argTypes[s],l=s<e.numOptionalArgs;s>0&&!l&&this.consumeSpaces(),0!==s||l||\"math\"!==this.mode||this.consumeSpaces();var m=this.nextToken,c=this.parseGroupOfType(\"argument to '\"+t+\"'\",h,l,a);if(!c){if(l){o.push(null);continue}throw new i(\"Expected group after '\"+t+\"'\",m)}(l?o:n).push(c)}return{args:n,optArgs:o}},e.parseGroupOfType=function(t,e,r,a){switch(e){case\"color\":return this.parseColorGroup(r);case\"size\":return this.parseSizeGroup(r);case\"url\":return this.parseUrlGroup(r);case\"math\":case\"text\":return this.parseGroup(t,r,a,void 0,e);case\"raw\":if(r&&\"{\"===this.nextToken.text)return null;var n=this.parseStringGroup(\"raw\",r,!0);if(n)return{type:\"raw\",mode:\"text\",string:n.text};throw new i(\"Expected raw group\",this.nextToken);case\"original\":case null:case void 0:return this.parseGroup(t,r,a);default:throw new i(\"Unknown group type as \"+t,this.nextToken)}},e.consumeSpaces=function(){for(;\" \"===this.nextToken.text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?\"[\":\"{\",n=e?\"]\":\"}\",o=this.nextToken;if(o.text!==a){if(e)return null;if(r&&\"EOF\"!==o.text&&/[^{}[\\]]/.test(o.text))return this.gullet.lexer.setCatcode(\"%\",14),this.consume(),o}var s=this.mode;this.mode=\"text\",this.expect(a);for(var h=\"\",l=this.nextToken,m=0,c=l;r&&m>0||this.nextToken.text!==n;){switch(this.nextToken.text){case\"EOF\":throw new i(\"Unexpected end of input in \"+t,l.range(c,h));case a:m++;break;case n:m--}h+=(c=this.nextToken).text,this.consume()}return this.mode=s,this.gullet.lexer.setCatcode(\"%\",14),this.expect(n),l.range(c,h)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode=\"text\";for(var a=this.nextToken,n=a,o=\"\";\"EOF\"!==this.nextToken.text&&t.test(o+this.nextToken.text);)o+=(n=this.nextToken).text,this.consume();if(\"\"===o)throw new i(\"Invalid \"+e+\": '\"+a.text+\"'\",a);return this.mode=r,a.range(n,o)},e.parseColorGroup=function(t){var e=this.parseStringGroup(\"color\",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new i(\"Invalid color: '\"+e.text+\"'\",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a=\"#\"+a),{type:\"color-token\",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||\"{\"===this.nextToken.text?this.parseStringGroup(\"size\",t):this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/,\"size\")))return null;t||0!==e.text.length||(e.text=\"0pt\",r=!0);var a=/([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new i(\"Invalid size: '\"+e.text+\"'\",e);var n,o={number:+(a[1]+a[2]),unit:a[3]};if(\"string\"!=typeof(n=o)&&(n=n.unit),!(n in kt||n in St||\"ex\"===n))throw new i(\"Invalid unit: '\"+o.unit+\"'\",e);return{type:\"size\",mode:this.mode,value:o,isBlank:r}},e.parseUrlGroup=function(t){var e=this.parseStringGroup(\"url\",t,!0);if(!e)return null;var r=e.text.replace(/\\\\([#$%&~_^{}])/g,\"$1\"),a=/^\\s*([^\\\\\\/#]*?)(?::|�*58|�*3a)/i.exec(r);a=null!=a?a[1]:\"_relative\";var n=this.settings.allowedProtocols;if(!c.contains(n,\"*\")&&!c.contains(n,a))throw new i(\"Forbidden protocol '\"+a+\"'\",e);return{type:\"url\",mode:this.mode,url:r}},e.parseGroup=function(e,r,n,o,s){var h,l,m=this.mode,c=this.nextToken,u=c.text;if(s&&this.switchMode(s),r?\"[\"===u:\"{\"===u||\"\\\\begingroup\"===u){h=t.endOfGroup[u],this.gullet.beginGroup(),this.consume();var d=this.parseExpression(!1,h),p=this.nextToken;this.gullet.endGroup(),l={type:\"ordgroup\",mode:this.mode,loc:a.range(c,p),body:d,semisimple:\"\\\\begingroup\"===u||void 0}}else if(r)l=null;else if(null==(l=this.parseFunction(o,e,n)||this.parseSymbol())&&\"\\\\\"===u[0]&&!ua.hasOwnProperty(u)){if(this.settings.throwOnError)throw new i(\"Undefined control sequence: \"+u,c);l=this.handleUnsupportedCmd()}return s&&this.switchMode(m),h&&this.expect(h),l},e.formLigatures=function(t){for(var e=t.length-1,r=0;r<e;++r){var n=t[r],o=n.text;\"-\"===o&&\"-\"===t[r+1].text&&(r+1<e&&\"-\"===t[r+2].text?(t.splice(r,3,{type:\"textord\",mode:\"text\",loc:a.range(n,t[r+2]),text:\"---\"}),e-=2):(t.splice(r,2,{type:\"textord\",mode:\"text\",loc:a.range(n,t[r+1]),text:\"--\"}),e-=1)),\"'\"!==o&&\"`\"!==o||t[r+1].text!==o||(t.splice(r,2,{type:\"textord\",mode:\"text\",loc:a.range(n,t[r+1]),text:o+o}),e-=1)}},e.parseSymbol=function(){var t=this.nextToken,e=t.text;if(/^\\\\verb[^a-zA-Z]/.test(e)){this.consume();var r=e.slice(5),n=\"*\"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new i(\"\\\\verb assertion failed --\\n please report what input caused this bug\");return{type:\"verb\",mode:\"text\",body:r=r.slice(1,-1),star:n}}fa.hasOwnProperty(e[0])&&!_[this.mode][e[0]]&&(this.settings.strict&&\"math\"===this.mode&&this.settings.reportNonstrict(\"unicodeTextInMathMode\",'Accented Unicode text character \"'+e[0]+'\" used in math mode',t),e=fa[e[0]]+e.substr(1));var o,s=Qr.exec(e);if(s&&(\"i\"===(e=e.substring(0,s.index))?e=\"\\u0131\":\"j\"===e&&(e=\"\\u0237\")),_[this.mode][e]){this.settings.strict&&\"math\"===this.mode&&\"\\xc7\\xd0\\xde\\xe7\\xfe\".indexOf(e)>=0&&this.settings.reportNonstrict(\"unicodeTextInMathMode\",'Latin-1/Unicode text character \"'+e[0]+'\" used in math mode',t);var h,l=_[this.mode][e].group,m=a.range(t);if(G.hasOwnProperty(l)){var c=l;h={type:\"atom\",mode:this.mode,family:c,loc:m,text:e}}else h={type:l,mode:this.mode,loc:m,text:e};o=h}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(z(e.charCodeAt(0))?\"math\"===this.mode&&this.settings.reportNonstrict(\"unicodeTextInMathMode\",'Unicode text character \"'+e[0]+'\" used in math mode',t):this.settings.reportNonstrict(\"unknownSymbol\",'Unrecognized Unicode character \"'+e[0]+'\" ('+e.charCodeAt(0)+\")\",t)),o={type:\"textord\",mode:this.mode,loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u<s[0].length;u++){var d=s[0][u];if(!pa[d])throw new i(\"Unknown accent ' \"+d+\"'\",t);var p=pa[d][this.mode];if(!p)throw new i(\"Accent \"+d+\" unsupported in \"+this.mode+\" mode\",t);o={type:\"accent\",mode:this.mode,loc:a.range(t),label:p,isStretchy:!1,isShifty:!0,base:o}}return o},t}();ga.endOfExpression=[\"}\",\"\\\\endgroup\",\"\\\\end\",\"\\\\right\",\"&\"],ga.endOfGroup={\"[\":\"]\",\"{\":\"}\",\"\\\\begingroup\":\"\\\\endgroup\"},ga.SUPSUB_GREEDINESS=1;var xa=function(t,e){if(!(\"string\"==typeof t||t instanceof String))throw new TypeError(\"KaTeX can only parse string typed expression\");var r=new ga(t,e);delete r.gullet.macros.current[\"\\\\df@tag\"];var a=r.parse();if(r.gullet.macros.get(\"\\\\df@tag\")){if(!e.displayMode)throw new i(\"\\\\tag works only in display equations\");r.gullet.feed(\"\\\\df@tag\"),a=[{type:\"tag\",mode:\"text\",body:a,tag:r.parse()}]}return a},va=function(t,e,r){e.textContent=\"\";var a=ya(t,r).toNode();e.appendChild(a)};\"undefined\"!=typeof document&&\"CSS1Compat\"!==document.compatMode&&(\"undefined\"!=typeof console&&console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype.\"),va=function(){throw new i(\"KaTeX doesn't work in quirks mode.\")});var ba=function(t,e,r){if(r.throwOnError||!(t instanceof i))throw t;var a=Lt.makeSpan([\"katex-error\"],[new E(e)]);return a.setAttribute(\"title\",t.toString()),a.setAttribute(\"style\",\"color:\"+r.errorColor),a},ya=function(t,e){var r=new u(e);try{var a=xa(t,r);return Se(a,t,r)}catch(e){return ba(e,t,r)}},wa={version:\"0.10.2\",render:va,renderToString:function(t,e){return ya(t,e).toMarkup()},ParseError:i,__parse:function(t,e){var r=new u(e);return xa(t,r)},__renderToDomTree:ya,__renderToHTMLTree:function(t,e){var r=new u(e);try{return function(t,e,r){var a=me(t,we(r)),n=Lt.makeSpan([\"katex\"],[a]);return ke(n,r)}(xa(t,r),0,r)}catch(e){return ba(e,t,r)}},__setFontMetrics:function(t,e){P[t]=e},__defineSymbol:W,__defineMacro:oa,__domTree:{Span:N,Anchor:I,SymbolNode:E,SvgNode:R,PathNode:L,LineNode:H}};e.default=wa}]).default});\n\n})(!$tw.browser ? $tw.fakeDocument : window.document)\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/katex/katex.min.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/katex/mhchem.min.js": {
"text": "/* eslint-disable */\n/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */\n/* vim: set ts=2 et sw=2 tw=80: */\n\n/*************************************************************\n *\n * KaTeX mhchem.js\n *\n * This file implements a KaTeX version of mhchem version 3.3.0.\n * It is adapted from MathJax/extensions/TeX/mhchem.js\n * It differs from the MathJax version as follows:\n * 1. The interface is changed so that it can be called from KaTeX, not MathJax.\n * 2. \\rlap and \\llap are replaced with \\mathrlap and \\mathllap.\n * 3. Four lines of code are edited in order to use \\raisebox instead of \\raise.\n * 4. The reaction arrow code is simplified. All reaction arrows are rendered\n * using KaTeX extensible arrows instead of building non-extensible arrows.\n * 5. \\tripledash vertical alignment is slightly adjusted.\n *\n * This code, as other KaTeX code, is released under the MIT license.\n * \n * /*************************************************************\n *\n * MathJax/extensions/TeX/mhchem.js\n *\n * Implements the \\ce command for handling chemical formulas\n * from the mhchem LaTeX package.\n *\n * ---------------------------------------------------------------------\n *\n * Copyright (c) 2011-2015 The MathJax Consortium\n * Copyright (c) 2015-2018 Martin Hensel\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Coding Style\n// - use '' for identifiers that can by minified/uglified\n// - use \"\" for strings that need to stay untouched\n\n// version: \"3.3.0\" for MathJax and KaTeX\n\n/****************************************\n*****************************************\n* TiddlyWiki: moved the katex-module definitions to wrapper.js\n*****************************************\n*****************************************/\n\n //\n // This is the main function for handing the \\ce and \\pu commands.\n // It takes the argument to \\ce or \\pu and returns the corresponding TeX string.\n //\n\n // TiddlyWiki: replaced `var chemParse =` with `module.exports =` ... no more modifications in this file\n module.exports = function (tokens, stateMachine) {\n // Recreate the argument string from KaTeX's array of tokens.\n var str = \"\";\n var expectedLoc = tokens[tokens.length - 1].loc.start\n for (var i = tokens.length - 1; i >= 0; i--) {\n if(tokens[i].loc.start > expectedLoc) {\n // context.consumeArgs has eaten a space.\n str += \" \";\n expectedLoc = tokens[i].loc.start;\n }\n str += tokens[i].text;\n expectedLoc += tokens[i].text.length;\n }\n var tex = texify.go(mhchemParser.go(str, stateMachine));\n return tex;\n };\n\n //\n // Core parser for mhchem syntax (recursive)\n //\n /** @type {MhchemParser} */\n var mhchemParser = {\n //\n // Parses mchem \\ce syntax\n //\n // Call like\n // go(\"H2O\");\n //\n go: function (input, stateMachine) {\n if (!input) { return []; }\n if (stateMachine === undefined) { stateMachine = 'ce'; }\n var state = '0';\n\n //\n // String buffers for parsing:\n //\n // buffer.a == amount\n // buffer.o == element\n // buffer.b == left-side superscript\n // buffer.p == left-side subscript\n // buffer.q == right-side subscript\n // buffer.d == right-side superscript\n //\n // buffer.r == arrow\n // buffer.rdt == arrow, script above, type\n // buffer.rd == arrow, script above, content\n // buffer.rqt == arrow, script below, type\n // buffer.rq == arrow, script below, content\n //\n // buffer.text_\n // buffer.rm\n // etc.\n //\n // buffer.parenthesisLevel == int, starting at 0\n // buffer.sb == bool, space before\n // buffer.beginsWithBond == bool\n //\n // These letters are also used as state names.\n //\n // Other states:\n // 0 == begin of main part (arrow/operator unlikely)\n // 1 == next entity\n // 2 == next entity (arrow/operator unlikely)\n // 3 == next atom\n // c == macro\n //\n /** @type {Buffer} */\n var buffer = {};\n buffer['parenthesisLevel'] = 0;\n\n input = input.replace(/\\n/g, \" \");\n input = input.replace(/[\\u2212\\u2013\\u2014\\u2010]/g, \"-\");\n input = input.replace(/[\\u2026]/g, \"...\");\n\n //\n // Looks through mhchemParser.transitions, to execute a matching action\n // (recursive)\n //\n var lastInput;\n var watchdog = 10;\n /** @type {ParserOutput[]} */\n var output = [];\n while (true) {\n if (lastInput !== input) {\n watchdog = 10;\n lastInput = input;\n } else {\n watchdog--;\n }\n //\n // Find actions in transition table\n //\n var machine = mhchemParser.stateMachines[stateMachine];\n var t = machine.transitions[state] || machine.transitions['*'];\n iterateTransitions:\n for (var i=0; i<t.length; i++) {\n var matches = mhchemParser.patterns.match_(t[i].pattern, input);\n if (matches) {\n //\n // Execute actions\n //\n var task = t[i].task;\n for (var iA=0; iA<task.action_.length; iA++) {\n var o;\n //\n // Find and execute action\n //\n if (machine.actions[task.action_[iA].type_]) {\n o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n } else if (mhchemParser.actions[task.action_[iA].type_]) {\n o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n } else {\n throw [\"MhchemBugA\", \"mhchem bug A. Please report. (\" + task.action_[iA].type_ + \")\"]; // Trying to use non-existing action\n }\n //\n // Add output\n //\n mhchemParser.concatArray(output, o);\n }\n //\n // Set next state,\n // Shorten input,\n // Continue with next character\n // (= apply only one transition per position)\n //\n state = task.nextState || state;\n if (input.length > 0) {\n if (!task.revisit) {\n input = matches.remainder;\n }\n if (!task.toContinue) {\n break iterateTransitions;\n }\n } else {\n return output;\n }\n }\n }\n //\n // Prevent infinite loop\n //\n if (watchdog <= 0) {\n throw [\"MhchemBugU\", \"mhchem bug U. Please report.\"]; // Unexpected character\n }\n }\n },\n concatArray: function (a, b) {\n if (b) {\n if (Array.isArray(b)) {\n for (var iB=0; iB<b.length; iB++) {\n a.push(b[iB]);\n }\n } else {\n a.push(b);\n }\n }\n },\n\n patterns: {\n //\n // Matching patterns\n // either regexps or function that return null or {match_:\"a\", remainder:\"bc\"}\n //\n patterns: {\n // property names must not look like integers (\"2\") for correct property traversal order, later on\n 'empty': /^$/,\n 'else': /^./,\n 'else2': /^./,\n 'space': /^\\s/,\n 'space A': /^\\s(?=[A-Z\\\\$])/,\n 'space$': /^\\s$/,\n 'a-z': /^[a-z]/,\n 'x': /^x/,\n 'x$': /^x$/,\n 'i$': /^i$/,\n 'letters': /^(?:[a-zA-Z\\u03B1-\\u03C9\\u0391-\\u03A9?@]|(?:\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))))+/,\n '\\\\greek': /^\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))/,\n 'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,\n '$one lowercase latin letter$ $': /^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$/,\n 'one lowercase greek letter $': /^(?:\\$?[\\u03B1-\\u03C9]\\$?|\\$?\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\\s*\\$?)(?:\\s+|\\{\\}|(?![a-zA-Z]))$/,\n 'digits': /^[0-9]+/,\n '-9.,9': /^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))/,\n '-9.,9 no missing 0': /^[+\\-]?[0-9]+(?:[.,][0-9]+)?/,\n '(-)(9.,9)(e)(99)': function (input) {\n var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))?(\\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))\\))?(?:([eE]|\\s*(\\*|x|\\\\times|\\u00D7)\\s*10\\^)([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\}))?/);\n if (m && m[0]) {\n return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n }\n return null;\n },\n '(-)(9)^(-9)': function (input) {\n var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+)?)\\^([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\})/);\n if (m && m[0]) {\n return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n }\n return null;\n },\n 'state of aggregation $': function (input) { // ... or crystal system\n var a = mhchemParser.patterns.findObserveGroups(input, \"\", /^\\([a-z]{1,3}(?=[\\),])/, \")\", \"\"); // (aq), (aq,$\\infty$), (aq, sat)\n if (a && a.remainder.match(/^($|[\\s,;\\)\\]\\}])/)) { return a; } // AND end of 'phrase'\n var m = input.match(/^(?:\\((?:\\\\ca\\s?)?\\$[amothc]\\$\\))/); // OR crystal system ($o$) (\\ca$c$)\n if (m) {\n return { match_: m[0], remainder: input.substr(m[0].length) };\n }\n return null;\n },\n '_{(state of aggregation)}$': /^_\\{(\\([a-z]{1,3}\\))\\}/,\n '{[(': /^(?:\\\\\\{|\\[|\\()/,\n ')]}': /^(?:\\)|\\]|\\\\\\})/,\n ', ': /^[,;]\\s*/,\n ',': /^[,;]/,\n '.': /^[.]/,\n '. ': /^([.\\u22C5\\u00B7\\u2022])\\s*/,\n '...': /^\\.\\.\\.(?=$|[^.])/,\n '* ': /^([*])\\s*/,\n '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^{\", \"\", \"\", \"}\"); },\n '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", \"$\", \"$\", \"\"); },\n '^a': /^\\^([0-9]+|[^\\\\_])/,\n '^\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '^\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '^\\\\x': /^\\^(\\\\[a-zA-Z]+)\\s*/,\n '^(-1)': /^\\^(-?\\d+)/,\n '\\'': /^'/,\n '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_{\", \"\", \"\", \"}\"); },\n '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", \"$\", \"$\", \"\"); },\n '_9': /^_([+\\-]?[0-9]+|[^\\\\])/,\n '_\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '_\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '_\\\\x': /^_(\\\\[a-zA-Z]+)\\s*/,\n '^_': /^(?:\\^(?=_)|\\_(?=\\^)|[\\^_]$)/,\n '{}': /^\\{\\}/,\n '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"{\", \"}\", \"\"); },\n '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"{\", \"\", \"\", \"}\"); },\n '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\"); },\n '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"${\", \"\", \"\", \"}$\"); },\n '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"$\", \"\", \"\", \"$\"); },\n '=<>': /^[=<>]/,\n '#': /^[#\\u2261]/,\n '+': /^\\+/,\n '-$': /^-(?=[\\s_},;\\]/]|$|\\([a-z]+\\))/, // -space -, -; -] -/ -$ -state-of-aggregation\n '-9': /^-(?=[0-9])/,\n '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\\s,;\\)\\]\\}]))/,\n '-': /^-/,\n 'pm-operator': /^(?:\\\\pm|\\$\\\\pm\\$|\\+-|\\+\\/-)/,\n 'operator': /^(?:\\+|(?:[\\-=<>]|<<|>>|\\\\approx|\\$\\\\approx\\$)(?=\\s|$|-?[0-9]))/,\n 'arrowUpDown': /^(?:v|\\(v\\)|\\^|\\(\\^\\))(?=$|[\\s,;\\)\\]\\}])/,\n '\\\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\bond{\", \"\", \"\", \"}\"); },\n '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\\u2192\\u27F6\\u21CC])/,\n 'CMT': /^[CMT](?=\\[)/,\n '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"[\", \"\", \"\", \"]\"); },\n '1st-level escape': /^(&|\\\\\\\\|\\\\hline)\\s*/,\n '\\\\,': /^(?:\\\\[,\\ ;:])/, // \\\\x - but output no space before\n '\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '\\\\ca': /^\\\\ca(?:\\s+|(?![a-zA-Z]))/,\n '\\\\x': /^(?:\\\\[a-zA-Z]+\\s*|\\\\[_&{}%])/,\n 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway\n 'others': /^[\\/~|]/,\n '\\\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\frac{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\overset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underbrace{\", \"\", \"\", \"}_\", \"{\", \"\", \"\", \"}\"); },\n '\\\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\"); },\n '\\\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color\", \"\\\\\", \"\", /^(?=\\{)/, \"{\", \"\", \"\", \"}\"); },\n '\\\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\ce{\", \"\", \"\", \"}\"); },\n 'oxidation$': /^(?:[+-][IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,\n 'd-oxidation$': /^(?:[+-]?\\s?[IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/, // 0 could be oxidation or charge\n 'roman numeral': /^[IVX]+/,\n '1/2$': /^[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+(?:\\$[a-z]\\$|[a-z])?$/,\n 'amount': function (input) {\n var match;\n // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing\n match = input.match(/^(?:(?:(?:\\([+\\-]?[0-9]+\\/[0-9]+\\)|[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+|[+\\-]?[0-9]+[.,][0-9]+|[+\\-]?\\.[0-9]+|[+\\-]?[0-9]+)(?:[a-z](?=\\s*[A-Z]))?)|[+\\-]?[a-z](?=\\s*[A-Z])|\\+(?!\\s))/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n var a = mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\");\n if (a) { // e.g. $2n-1$, $-$\n match = a.match_.match(/^\\$(?:\\(?[+\\-]?(?:[0-9]*[a-z]?[+\\-])?[0-9]*[a-z](?:[+\\-][0-9]*[a-z]?)?\\)?|\\+|-)\\$$/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n }\n return null;\n },\n 'amount2': function (input) { return this['amount'](input); },\n '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,\n 'formula$': function (input) {\n if (input.match(/^\\([a-z]+\\)$/)) { return null; } // state of aggregation = no formula\n var match = input.match(/^(?:[a-z]|(?:[0-9\\ \\+\\-\\,\\.\\(\\)]+[a-z])+[0-9\\ \\+\\-\\,\\.\\(\\)]*|(?:[a-z][0-9\\ \\+\\-\\,\\.\\(\\)]+)+[a-z]?)$/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n return null;\n },\n 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,\n '/': /^\\s*(\\/)\\s*/,\n '//': /^\\s*(\\/\\/)\\s*/,\n '*': /^\\s*[*.]\\s*/\n },\n findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {\n /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */\n var _match = function (input, pattern) {\n if (typeof pattern === \"string\") {\n if (input.indexOf(pattern) !== 0) { return null; }\n return pattern;\n } else {\n var match = input.match(pattern);\n if (!match) { return null; }\n return match[0];\n }\n };\n /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */\n var _findObserveGroups = function (input, i, endChars) {\n var braces = 0;\n while (i < input.length) {\n var a = input.charAt(i);\n var match = _match(input.substr(i), endChars);\n if (match !== null && braces === 0) {\n return { endMatchBegin: i, endMatchEnd: i + match.length };\n } else if (a === \"{\") {\n braces++;\n } else if (a === \"}\") {\n if (braces === 0) {\n throw [\"ExtraCloseMissingOpen\", \"Extra close brace or missing open brace\"];\n } else {\n braces--;\n }\n }\n i++;\n }\n if (braces > 0) {\n return null;\n }\n return null;\n };\n var match = _match(input, begExcl);\n if (match === null) { return null; }\n input = input.substr(match.length);\n match = _match(input, begIncl);\n if (match === null) { return null; }\n var e = _findObserveGroups(input, match.length, endIncl || endExcl);\n if (e === null) { return null; }\n var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin));\n if (!(beg2Excl || beg2Incl)) {\n return {\n match_: match1,\n remainder: input.substr(e.endMatchEnd)\n };\n } else {\n var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);\n if (group2 === null) { return null; }\n /** @type {string[]} */\n var matchRet = [match1, group2.match_];\n return {\n match_: (combine ? matchRet.join(\"\") : matchRet),\n remainder: group2.remainder\n };\n }\n },\n\n //\n // Matching function\n // e.g. match(\"a\", input) will look for the regexp called \"a\" and see if it matches\n // returns null or {match_:\"a\", remainder:\"bc\"}\n //\n match_: function (m, input) {\n var pattern = mhchemParser.patterns.patterns[m];\n if (pattern === undefined) {\n throw [\"MhchemBugP\", \"mhchem bug P. Please report. (\" + m + \")\"]; // Trying to use non-existing pattern\n } else if (typeof pattern === \"function\") {\n return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser\n } else { // RegExp\n var match = input.match(pattern);\n if (match) {\n var mm;\n if (match[2]) {\n mm = [ match[1], match[2] ];\n } else if (match[1]) {\n mm = match[1];\n } else {\n mm = match[0];\n }\n return { match_: mm, remainder: input.substr(match[0].length) };\n }\n return null;\n }\n }\n },\n\n //\n // Generic state machine actions\n //\n actions: {\n 'a=': function (buffer, m) { buffer.a = (buffer.a || \"\") + m; },\n 'b=': function (buffer, m) { buffer.b = (buffer.b || \"\") + m; },\n 'p=': function (buffer, m) { buffer.p = (buffer.p || \"\") + m; },\n 'o=': function (buffer, m) { buffer.o = (buffer.o || \"\") + m; },\n 'q=': function (buffer, m) { buffer.q = (buffer.q || \"\") + m; },\n 'd=': function (buffer, m) { buffer.d = (buffer.d || \"\") + m; },\n 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || \"\") + m; },\n 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || \"\") + m; },\n 'insert': function (buffer, m, a) { return { type_: a }; },\n 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; },\n 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; },\n 'copy': function (buffer, m) { return m; },\n 'rm': function (buffer, m) { return { type_: 'rm', p1: m || \"\"}; },\n 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); },\n '{text}': function (buffer, m) {\n var ret = [ \"{\" ];\n mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));\n ret.push(\"}\");\n return ret;\n },\n 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); },\n 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); },\n 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; },\n 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; },\n 'ce': function (buffer, m) { return mhchemParser.go(m); },\n '1/2': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m.match(/^[+\\-]/)) {\n ret.push(m.substr(0, 1));\n m = m.substr(1);\n }\n var n = m.match(/^([0-9]+|\\$[a-z]\\$|[a-z])\\/([0-9]+)(\\$[a-z]\\$|[a-z])?$/);\n n[1] = n[1].replace(/\\$/g, \"\");\n ret.push({ type_: 'frac', p1: n[1], p2: n[2] });\n if (n[3]) {\n n[3] = n[3].replace(/\\$/g, \"\");\n ret.push({ type_: 'tex-math', p1: n[3] });\n }\n return ret;\n },\n '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); }\n },\n //\n // createTransitions\n // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }\n // with expansion of 'a|b' to 'a' and 'b' (at 2 places)\n //\n createTransitions: function (o) {\n var pattern, state;\n /** @type {string[]} */\n var stateArray;\n var i;\n //\n // 1. Collect all states\n //\n /** @type {Transitions} */\n var transitions = {};\n for (pattern in o) {\n for (state in o[pattern]) {\n stateArray = state.split(\"|\");\n o[pattern][state].stateArray = stateArray;\n for (i=0; i<stateArray.length; i++) {\n transitions[stateArray[i]] = [];\n }\n }\n }\n //\n // 2. Fill states\n //\n for (pattern in o) {\n for (state in o[pattern]) {\n stateArray = o[pattern][state].stateArray || [];\n for (i=0; i<stateArray.length; i++) {\n //\n // 2a. Normalize actions into array: 'text=' ==> [{type_:'text='}]\n // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)\n //\n /** @type {any} */\n var p = o[pattern][state];\n if (p.action_) {\n p.action_ = [].concat(p.action_);\n for (var k=0; k<p.action_.length; k++) {\n if (typeof p.action_[k] === \"string\") {\n p.action_[k] = { type_: p.action_[k] };\n }\n }\n } else {\n p.action_ = [];\n }\n //\n // 2.b Multi-insert\n //\n var patternArray = pattern.split(\"|\");\n for (var j=0; j<patternArray.length; j++) {\n if (stateArray[i] === '*') { // insert into all\n for (var t in transitions) {\n transitions[t].push({ pattern: patternArray[j], task: p });\n }\n } else {\n transitions[stateArray[i]].push({ pattern: patternArray[j], task: p });\n }\n }\n }\n }\n }\n return transitions;\n },\n stateMachines: {}\n };\n\n //\n // Definition of state machines\n //\n mhchemParser.stateMachines = {\n //\n // \\ce state machines\n //\n //#region ce\n 'ce': { // main parser\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n 'else': {\n '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } },\n 'oxidation$': {\n '0': { action_: 'oxidation-output' } },\n 'CMT': {\n 'r': { action_: 'rdt=', nextState: 'rt' },\n 'rd': { action_: 'rqt=', nextState: 'rdt' } },\n 'arrowUpDown': {\n '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } },\n 'uprightEntities': {\n '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } },\n 'orbital': {\n '0|1|2|3': { action_: 'o=', nextState: 'o' } },\n '->': {\n '0|1|2|3': { action_: 'r=', nextState: 'r' },\n 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' },\n '*': { action_: [ 'output', 'r=' ], nextState: 'r' } },\n '+': {\n 'o': { action_: 'd= kv', nextState: 'd' },\n 'd|D': { action_: 'd=', nextState: 'd' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'qd|qD': { action_: 'd=', nextState: 'qd' },\n 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' },\n '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n 'amount': {\n '0|2': { action_: 'a=', nextState: 'a' } },\n 'pm-operator': {\n '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\\\pm' } ], nextState: '0' } },\n 'operator': {\n '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n '-$': {\n 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' },\n 'd': { action_: 'd=', nextState: 'd' },\n 'D': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'qd': { action_: 'd=', nextState: 'qd' },\n 'qD|dq': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n '-9': {\n '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } },\n '- orbital overlap': {\n 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } },\n '-': {\n '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n '3': { action_: { type_: 'bond', option: \"-\" } },\n 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"-\" } ], nextState: '3' },\n 'b': { action_: 'b=' },\n 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' },\n 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n 'amount2': {\n '1|3': { action_: 'a=', nextState: 'a' } },\n 'letters': {\n '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },\n 'q|dq': { action_: ['output', 'o='], nextState: 'o' },\n 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } },\n 'digits': {\n 'o': { action_: 'q=', nextState: 'q' },\n 'd|D': { action_: 'q=', nextState: 'dq' },\n 'q': { action_: [ 'output', 'o=' ], nextState: 'o' },\n 'a': { action_: 'o=', nextState: 'o' } },\n 'space A': {\n 'b|p|bp': {} },\n 'space': {\n 'a': { nextState: 'as' },\n '0': { action_: 'sb=false' },\n '1|2': { action_: 'sb=true' },\n 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' },\n '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} },\n '1st-level escape': {\n '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] },\n '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } },\n '[(...)]': {\n 'r|rt': { action_: 'rd=', nextState: 'rd' },\n 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } },\n '...': {\n 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: \"...\" } ], nextState: '3' },\n '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } },\n '. |* ': {\n '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } },\n 'state of aggregation $': {\n '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } },\n '{[(': {\n 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } },\n ')]}': {\n '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' },\n 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } },\n ', ': {\n '*': { action_: [ 'output', 'comma' ], nextState: '0' } },\n '^_': { // ^ and _ without a sensible argument\n '*': { } },\n '^{(...)}|^($...$)': {\n '0|1|2|as': { action_: 'b=', nextState: 'b' },\n 'p': { action_: 'b=', nextState: 'bp' },\n '3|o': { action_: 'd= kv', nextState: 'D' },\n 'q': { action_: 'd=', nextState: 'qD' },\n 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } },\n '^a|^\\\\x{}{}|^\\\\x{}|^\\\\x|\\'': {\n '0|1|2|as': { action_: 'b=', nextState: 'b' },\n 'p': { action_: 'b=', nextState: 'bp' },\n '3|o': { action_: 'd= kv', nextState: 'd' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'd|qd|D|qD': { action_: 'd=' },\n 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } },\n '_{(state of aggregation)}$': {\n 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n '_{(...)}|_($...$)|_9|_\\\\x{}{}|_\\\\x{}|_\\\\x': {\n '0|1|2|as': { action_: 'p=', nextState: 'p' },\n 'b': { action_: 'p=', nextState: 'bp' },\n '3|o': { action_: 'q=', nextState: 'q' },\n 'd|D': { action_: 'q=', nextState: 'dq' },\n 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n '=<>': {\n '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } },\n '#': {\n '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"#\" } ], nextState: '3' } },\n '{}': {\n '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } },\n '{...}': {\n '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' },\n 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n '$...$': {\n 'a': { action_: 'a=' }, // 2$n$\n '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount'\n 'as|o': { action_: 'o=' },\n 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n '\\\\bond{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: \"3\" } },\n '\\\\frac{(...)}': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } },\n '\\\\overset{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } },\n '\\\\underset{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } },\n '\\\\underbrace{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } },\n '\\\\color{(...)}0': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } },\n '\\\\ce{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } },\n '\\\\,': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } },\n '\\\\x{}{}|\\\\x{}|\\\\x': {\n '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' },\n '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } },\n 'others': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } },\n 'else2': {\n 'a': { action_: 'a to o', nextState: 'o', revisit: true },\n 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true },\n 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true },\n '*': { action_: [ 'output', 'copy' ], nextState: '3' } }\n }),\n actions: {\n 'o after d': function (buffer, m) {\n var ret;\n if ((buffer.d || \"\").match(/^[0-9]+$/)) {\n var tmp = buffer.d;\n buffer.d = undefined;\n ret = this['output'](buffer);\n buffer.b = tmp;\n } else {\n ret = this['output'](buffer);\n }\n mhchemParser.actions['o='](buffer, m);\n return ret;\n },\n 'd= kv': function (buffer, m) {\n buffer.d = m;\n buffer.dType = 'kv';\n },\n 'charge or bond': function (buffer, m) {\n if (buffer['beginsWithBond']) {\n /** @type {ParserOutput[]} */\n var ret = [];\n mhchemParser.concatArray(ret, this['output'](buffer));\n mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n return ret;\n } else {\n buffer.d = m;\n }\n },\n '- after o/d': function (buffer, m, isAfterD) {\n var c1 = mhchemParser.patterns.match_('orbital', buffer.o || \"\");\n var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || \"\");\n var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || \"\");\n var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || \"\");\n var hyphenFollows = m===\"-\" && ( c1 && c1.remainder===\"\" || c2 || c3 || c4 );\n if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {\n buffer.o = '$' + buffer.o + '$';\n }\n /** @type {ParserOutput[]} */\n var ret = [];\n if (hyphenFollows) {\n mhchemParser.concatArray(ret, this['output'](buffer));\n ret.push({ type_: 'hyphen' });\n } else {\n c1 = mhchemParser.patterns.match_('digits', buffer.d || \"\");\n if (isAfterD && c1 && c1.remainder==='') {\n mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));\n mhchemParser.concatArray(ret, this['output'](buffer));\n } else {\n mhchemParser.concatArray(ret, this['output'](buffer));\n mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n }\n }\n return ret;\n },\n 'a to o': function (buffer) {\n buffer.o = buffer.a;\n buffer.a = undefined;\n },\n 'sb=true': function (buffer) { buffer.sb = true; },\n 'sb=false': function (buffer) { buffer.sb = false; },\n 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; },\n 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; },\n 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; },\n 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; },\n 'state of aggregation': function (buffer, m) {\n return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') };\n },\n 'comma': function (buffer, m) {\n var a = m.replace(/\\s*$/, '');\n var withSpace = (a !== m);\n if (withSpace && buffer['parenthesisLevel'] === 0) {\n return { type_: 'comma enumeration L', p1: a };\n } else {\n return { type_: 'comma enumeration M', p1: a };\n }\n },\n 'output': function (buffer, m, entityFollows) {\n // entityFollows:\n // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)\n // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)\n // 2 = 1 + the entity can have an amount, so output a\\, instead of converting it to o (can only apply to states a|as)\n /** @type {ParserOutput | ParserOutput[]} */\n var ret;\n if (!buffer.r) {\n ret = [];\n if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {\n //ret = [];\n } else {\n if (buffer.sb) {\n ret.push({ type_: 'entitySkip' });\n }\n if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) {\n buffer.o = buffer.a;\n buffer.a = undefined;\n } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {\n buffer.o = buffer.a;\n buffer.d = buffer.b;\n buffer.q = buffer.p;\n buffer.a = buffer.b = buffer.p = undefined;\n } else {\n if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || \"\")) {\n buffer.dType = 'oxidation';\n } else if (buffer.o && buffer.dType==='kv' && !buffer.q) {\n buffer.dType = undefined;\n }\n }\n ret.push({\n type_: 'chemfive',\n a: mhchemParser.go(buffer.a, 'a'),\n b: mhchemParser.go(buffer.b, 'bd'),\n p: mhchemParser.go(buffer.p, 'pq'),\n o: mhchemParser.go(buffer.o, 'o'),\n q: mhchemParser.go(buffer.q, 'pq'),\n d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')),\n dType: buffer.dType\n });\n }\n } else { // r\n /** @type {ParserOutput[]} */\n var rd;\n if (buffer.rdt === 'M') {\n rd = mhchemParser.go(buffer.rd, 'tex-math');\n } else if (buffer.rdt === 'T') {\n rd = [ { type_: 'text', p1: buffer.rd || \"\" } ];\n } else {\n rd = mhchemParser.go(buffer.rd);\n }\n /** @type {ParserOutput[]} */\n var rq;\n if (buffer.rqt === 'M') {\n rq = mhchemParser.go(buffer.rq, 'tex-math');\n } else if (buffer.rqt === 'T') {\n rq = [ { type_: 'text', p1: buffer.rq || \"\"} ];\n } else {\n rq = mhchemParser.go(buffer.rq);\n }\n ret = {\n type_: 'arrow',\n r: buffer.r,\n rd: rd,\n rq: rq\n };\n }\n for (var p in buffer) {\n if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') {\n delete buffer[p];\n }\n }\n return ret;\n },\n 'oxidation-output': function (buffer, m) {\n var ret = [ \"{\" ];\n mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));\n ret.push(\"}\");\n return ret;\n },\n 'frac-output': function (buffer, m) {\n return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'overset-output': function (buffer, m) {\n return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'underset-output': function (buffer, m) {\n return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'underbrace-output': function (buffer, m) {\n return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) };\n },\n 'r=': function (buffer, m) { buffer.r = m; },\n 'rdt=': function (buffer, m) { buffer.rdt = m; },\n 'rd=': function (buffer, m) { buffer.rd = m; },\n 'rqt=': function (buffer, m) { buffer.rqt = m; },\n 'rq=': function (buffer, m) { buffer.rq = m; },\n 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }\n }\n },\n 'a': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '1', revisit: true } },\n '$(...)$': {\n '*': { action_: 'tex-math tight', nextState: '1' } },\n ',': {\n '*': { action_: { type_: 'insert', option: 'commaDecimal' } } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {}\n },\n 'o': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '1', revisit: true } },\n 'letters': {\n '*': { action_: 'rm' } },\n '\\\\ca': {\n '*': { action_: { type_: 'insert', option: 'circa' } } },\n '\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: '{text}' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {}\n },\n 'text': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '{...}': {\n '*': { action_: 'text=' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '\\\\greek': {\n '*': { action_: [ 'output', 'rm' ] } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: [ 'output', 'copy' ] } },\n 'else': {\n '*': { action_: 'text=' } }\n }),\n actions: {\n 'output': function (buffer) {\n if (buffer.text_) {\n /** @type {ParserOutput} */\n var ret = { type_: 'text', p1: buffer.text_ };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n 'pq': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'state of aggregation $': {\n '*': { action_: 'state of aggregation' } },\n 'i$': {\n '0': { nextState: '!f', revisit: true } },\n '(KV letters),': {\n '0': { action_: 'rm', nextState: '0' } },\n 'formula$': {\n '0': { nextState: 'f', revisit: true } },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '!f', revisit: true } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: 'text' } },\n 'a-z': {\n 'f': { action_: 'tex-math' } },\n 'letters': {\n '*': { action_: 'rm' } },\n '-9.,9': {\n '*': { action_: '9,9' } },\n ',': {\n '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: 'color-output' } },\n '\\\\color{(...)}0': {\n '*': { action_: 'color0-output' } },\n '\\\\ce{(...)}': {\n '*': { action_: 'ce' } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'state of aggregation': function (buffer, m) {\n return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') };\n },\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') };\n }\n }\n },\n 'bd': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'x$': {\n '0': { nextState: '!f', revisit: true } },\n 'formula$': {\n '0': { nextState: 'f', revisit: true } },\n 'else': {\n '0': { nextState: '!f', revisit: true } },\n '-9.,9 no missing 0': {\n '*': { action_: '9,9' } },\n '.': {\n '*': { action_: { type_: 'insert', option: 'electron dot' } } },\n 'a-z': {\n 'f': { action_: 'tex-math' } },\n 'x': {\n '*': { action_: { type_: 'insert', option: 'KV x' } } },\n 'letters': {\n '*': { action_: 'rm' } },\n '\\'': {\n '*': { action_: { type_: 'insert', option: 'prime' } } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: 'text' } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: 'color-output' } },\n '\\\\color{(...)}0': {\n '*': { action_: 'color0-output' } },\n '\\\\ce{(...)}': {\n '*': { action_: 'ce' } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') };\n }\n }\n },\n 'oxidation': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'roman numeral': {\n '*': { action_: 'roman-numeral' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n 'else': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || \"\" }; }\n }\n },\n 'tex-math': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '\\\\ce{(...)}': {\n '*': { action_: [ 'output', 'ce' ] } },\n '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'o=' } },\n 'else': {\n '*': { action_: 'o=' } }\n }),\n actions: {\n 'output': function (buffer) {\n if (buffer.o) {\n /** @type {ParserOutput} */\n var ret = { type_: 'tex-math', p1: buffer.o };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n 'tex-math tight': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '\\\\ce{(...)}': {\n '*': { action_: [ 'output', 'ce' ] } },\n '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'o=' } },\n '-|+': {\n '*': { action_: 'tight operator' } },\n 'else': {\n '*': { action_: 'o=' } }\n }),\n actions: {\n 'tight operator': function (buffer, m) { buffer.o = (buffer.o || \"\") + \"{\"+m+\"}\"; },\n 'output': function (buffer) {\n if (buffer.o) {\n /** @type {ParserOutput} */\n var ret = { type_: 'tex-math', p1: buffer.o };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n '9,9': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n ',': {\n '*': { action_: 'comma' } },\n 'else': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'comma': function () { return { type_: 'commaDecimal' }; }\n }\n },\n //#endregion\n //\n // \\pu state machines\n //\n //#region pu\n 'pu': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n 'space$': {\n '*': { action_: [ 'output', 'space' ] } },\n '{[(|)]}': {\n '0|a': { action_: 'copy' } },\n '(-)(9)^(-9)': {\n '0': { action_: 'number^', nextState: 'a' } },\n '(-)(9.,9)(e)(99)': {\n '0': { action_: 'enumber', nextState: 'a' } },\n 'space': {\n '0|a': {} },\n 'pm-operator': {\n '0|a': { action_: { type_: 'operator', option: '\\\\pm' }, nextState: '0' } },\n 'operator': {\n '0|a': { action_: 'copy', nextState: '0' } },\n '//': {\n 'd': { action_: 'o=', nextState: '/' } },\n '/': {\n 'd': { action_: 'o=', nextState: '/' } },\n '{...}|else': {\n '0|d': { action_: 'd=', nextState: 'd' },\n 'a': { action_: [ 'space', 'd=' ], nextState: 'd' },\n '/|q': { action_: 'q=', nextState: 'q' } }\n }),\n actions: {\n 'enumber': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m[0] === \"+-\" || m[0] === \"+/-\") {\n ret.push(\"\\\\pm \");\n } else if (m[0]) {\n ret.push(m[0]);\n }\n if (m[1]) {\n mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n if (m[2]) {\n if (m[2].match(/[,.]/)) {\n mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));\n } else {\n ret.push(m[2]);\n }\n }\n m[3] = m[4] || m[3];\n if (m[3]) {\n m[3] = m[3].trim();\n if (m[3] === \"e\" || m[3].substr(0, 1) === \"*\") {\n ret.push({ type_: 'cdot' });\n } else {\n ret.push({ type_: 'times' });\n }\n }\n }\n if (m[3]) {\n ret.push(\"10^{\"+m[5]+\"}\");\n }\n return ret;\n },\n 'number^': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m[0] === \"+-\" || m[0] === \"+/-\") {\n ret.push(\"\\\\pm \");\n } else if (m[0]) {\n ret.push(m[0]);\n }\n mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n ret.push(\"^{\"+m[2]+\"}\");\n return ret;\n },\n 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; },\n 'space': function () { return { type_: 'pu-space-1' }; },\n 'output': function (buffer) {\n /** @type {ParserOutput | ParserOutput[]} */\n var ret;\n var md = mhchemParser.patterns.match_('{(...)}', buffer.d || \"\");\n if (md && md.remainder === '') { buffer.d = md.match_; }\n var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || \"\");\n if (mq && mq.remainder === '') { buffer.q = mq.match_; }\n if (buffer.d) {\n buffer.d = buffer.d.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n buffer.d = buffer.d.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n }\n if (buffer.q) { // fraction\n buffer.q = buffer.q.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n buffer.q = buffer.q.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n var b5 = {\n d: mhchemParser.go(buffer.d, 'pu'),\n q: mhchemParser.go(buffer.q, 'pu')\n };\n if (buffer.o === '//') {\n ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q };\n } else {\n ret = b5.d;\n if (b5.d.length > 1 || b5.q.length > 1) {\n ret.push({ type_: ' / ' });\n } else {\n ret.push({ type_: '/' });\n }\n mhchemParser.concatArray(ret, b5.q);\n }\n } else { // no fraction\n ret = mhchemParser.go(buffer.d, 'pu-2');\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n },\n 'pu-2': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '*': {\n '*': { action_: [ 'output', 'cdot' ], nextState: '0' } },\n '\\\\x': {\n '*': { action_: 'rm=' } },\n 'space': {\n '*': { action_: [ 'output', 'space' ], nextState: '0' } },\n '^{(...)}|^(-1)': {\n '1': { action_: '^(-1)' } },\n '-9.,9': {\n '0': { action_: 'rm=', nextState: '0' },\n '1': { action_: '^(-1)', nextState: '0' } },\n '{...}|else': {\n '*': { action_: 'rm=', nextState: '1' } }\n }),\n actions: {\n 'cdot': function () { return { type_: 'tight cdot' }; },\n '^(-1)': function (buffer, m) { buffer.rm += \"^{\"+m+\"}\"; },\n 'space': function () { return { type_: 'pu-space-2' }; },\n 'output': function (buffer) {\n /** @type {ParserOutput | ParserOutput[]} */\n var ret = [];\n if (buffer.rm) {\n var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || \"\");\n if (mrm && mrm.remainder === '') {\n ret = mhchemParser.go(mrm.match_, 'pu');\n } else {\n ret = { type_: 'rm', p1: buffer.rm };\n }\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n },\n 'pu-9,9': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '0': { action_: 'output-0' },\n 'o': { action_: 'output-o' } },\n ',': {\n '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } },\n '.': {\n '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } },\n 'else': {\n '*': { action_: 'text=' } }\n }),\n actions: {\n 'comma': function () { return { type_: 'commaDecimal' }; },\n 'output-0': function (buffer) {\n /** @type {ParserOutput[]} */\n var ret = [];\n buffer.text_ = buffer.text_ || \"\";\n if (buffer.text_.length > 4) {\n var a = buffer.text_.length % 3;\n if (a === 0) { a = 3; }\n for (var i=buffer.text_.length-3; i>0; i-=3) {\n ret.push(buffer.text_.substr(i, 3));\n ret.push({ type_: '1000 separator' });\n }\n ret.push(buffer.text_.substr(0, a));\n ret.reverse();\n } else {\n ret.push(buffer.text_);\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n },\n 'output-o': function (buffer) {\n /** @type {ParserOutput[]} */\n var ret = [];\n buffer.text_ = buffer.text_ || \"\";\n if (buffer.text_.length > 4) {\n var a = buffer.text_.length - 3;\n for (var i=0; i<a; i+=3) {\n ret.push(buffer.text_.substr(i, 3));\n ret.push({ type_: '1000 separator' });\n }\n ret.push(buffer.text_.substr(i));\n } else {\n ret.push(buffer.text_);\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n //#endregion\n };\n\n //\n // texify: Take MhchemParser output and convert it to TeX\n //\n /** @type {Texify} */\n var texify = {\n go: function (input, isInner) { // (recursive, max 4 levels)\n if (!input) { return \"\"; }\n var res = \"\";\n var cee = false;\n for (var i=0; i < input.length; i++) {\n var inputi = input[i];\n if (typeof inputi === \"string\") {\n res += inputi;\n } else {\n res += texify._go2(inputi);\n if (inputi.type_ === '1st-level escape') { cee = true; }\n }\n }\n if (!isInner && !cee && res) {\n res = \"{\" + res + \"}\";\n }\n return res;\n },\n _goInner: function (input) {\n if (!input) { return input; }\n return texify.go(input, true);\n },\n _go2: function (buf) {\n /** @type {undefined | string} */\n var res;\n switch (buf.type_) {\n case 'chemfive':\n res = \"\";\n var b5 = {\n a: texify._goInner(buf.a),\n b: texify._goInner(buf.b),\n p: texify._goInner(buf.p),\n o: texify._goInner(buf.o),\n q: texify._goInner(buf.q),\n d: texify._goInner(buf.d)\n };\n //\n // a\n //\n if (b5.a) {\n if (b5.a.match(/^[+\\-]/)) { b5.a = \"{\"+b5.a+\"}\"; }\n res += b5.a + \"\\\\,\";\n }\n //\n // b and p\n //\n if (b5.b || b5.p) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\\\\hphantom{\"+(b5.b||\"\")+\"}}_{\\\\hphantom{\"+(b5.p||\"\")+\"}}\";\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\\\\smash[t]{\\\\vphantom{2}}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n res += \"_{\\\\vphantom{2}\\\\mathllap{\\\\smash[t]{\"+(b5.p||\"\")+\"}}}\";\n }\n //\n // o\n //\n if (b5.o) {\n if (b5.o.match(/^[+\\-]/)) { b5.o = \"{\"+b5.o+\"}\"; }\n res += b5.o;\n }\n //\n // q and d\n //\n if (buf.dType === 'kv') {\n if (b5.d || b5.q) {\n res += \"{\\\\vphantom{X}}\";\n }\n if (b5.d) {\n res += \"^{\"+b5.d+\"}\";\n }\n if (b5.q) {\n res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n }\n } else if (buf.dType === 'oxidation') {\n if (b5.d) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\"+b5.d+\"}\";\n }\n if (b5.q) {\n res += \"{\\\\vphantom{X}}\";\n res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n }\n } else {\n if (b5.q) {\n res += \"{\\\\vphantom{X}}\";\n res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n }\n if (b5.d) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\"+b5.d+\"}\";\n }\n }\n break;\n case 'rm':\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n break;\n case 'text':\n if (buf.p1.match(/[\\^_]/)) {\n buf.p1 = buf.p1.replace(\" \", \"~\").replace(\"-\", \"\\\\text{-}\");\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n } else {\n res = \"\\\\text{\"+buf.p1+\"}\";\n }\n break;\n case 'roman numeral':\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n break;\n case 'state of aggregation':\n res = \"\\\\mskip2mu \"+texify._goInner(buf.p1);\n break;\n case 'state of aggregation subscript':\n res = \"\\\\mskip1mu \"+texify._goInner(buf.p1);\n break;\n case 'bond':\n res = texify._getBond(buf.kind_);\n if (!res) {\n throw [\"MhchemErrorBond\", \"mhchem Error. Unknown bond type (\" + buf.kind_ + \")\"];\n }\n break;\n case 'frac':\n var c = \"\\\\frac{\" + buf.p1 + \"}{\" + buf.p2 + \"}\";\n res = \"\\\\mathchoice{\\\\textstyle\"+c+\"}{\"+c+\"}{\"+c+\"}{\"+c+\"}\";\n break;\n case 'pu-frac':\n var d = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n res = \"\\\\mathchoice{\\\\textstyle\"+d+\"}{\"+d+\"}{\"+d+\"}{\"+d+\"}\";\n break;\n case 'tex-math':\n res = buf.p1 + \" \";\n break;\n case 'frac-ce':\n res = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'overset':\n res = \"\\\\overset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'underset':\n res = \"\\\\underset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'underbrace':\n res = \"\\\\underbrace{\" + texify._goInner(buf.p1) + \"}_{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'color':\n res = \"{\\\\color{\" + buf.color1 + \"}{\" + texify._goInner(buf.color2) + \"}}\";\n break;\n case 'color0':\n res = \"\\\\color{\" + buf.color + \"}\";\n break;\n case 'arrow':\n var b6 = {\n rd: texify._goInner(buf.rd),\n rq: texify._goInner(buf.rq)\n };\n var arrow = \"\\\\x\" + texify._getArrow(buf.r);\n if (b6.rq) { arrow += \"[{\" + b6.rq + \"}]\"; }\n if (b6.rd) {\n arrow += \"{\" + b6.rd + \"}\";\n } else {\n arrow += \"{}\";\n }\n res = arrow;\n break;\n case 'operator':\n res = texify._getOperator(buf.kind_);\n break;\n case '1st-level escape':\n res = buf.p1+\" \"; // &, \\\\\\\\, \\\\hlin\n break;\n case 'space':\n res = \" \";\n break;\n case 'entitySkip':\n res = \"~\";\n break;\n case 'pu-space-1':\n res = \"~\";\n break;\n case 'pu-space-2':\n res = \"\\\\mkern3mu \";\n break;\n case '1000 separator':\n res = \"\\\\mkern2mu \";\n break;\n case 'commaDecimal':\n res = \"{,}\";\n break;\n case 'comma enumeration L':\n res = \"{\"+buf.p1+\"}\\\\mkern6mu \";\n break;\n case 'comma enumeration M':\n res = \"{\"+buf.p1+\"}\\\\mkern3mu \";\n break;\n case 'comma enumeration S':\n res = \"{\"+buf.p1+\"}\\\\mkern1mu \";\n break;\n case 'hyphen':\n res = \"\\\\text{-}\";\n break;\n case 'addition compound':\n res = \"\\\\,{\\\\cdot}\\\\,\";\n break;\n case 'electron dot':\n res = \"\\\\mkern1mu \\\\bullet\\\\mkern1mu \";\n break;\n case 'KV x':\n res = \"{\\\\times}\";\n break;\n case 'prime':\n res = \"\\\\prime \";\n break;\n case 'cdot':\n res = \"\\\\cdot \";\n break;\n case 'tight cdot':\n res = \"\\\\mkern1mu{\\\\cdot}\\\\mkern1mu \";\n break;\n case 'times':\n res = \"\\\\times \";\n break;\n case 'circa':\n res = \"{\\\\sim}\";\n break;\n case '^':\n res = \"uparrow\";\n break;\n case 'v':\n res = \"downarrow\";\n break;\n case 'ellipsis':\n res = \"\\\\ldots \";\n break;\n case '/':\n res = \"/\";\n break;\n case ' / ':\n res = \"\\\\,/\\\\,\";\n break;\n default:\n assertNever(buf);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"]; // Missing texify rule or unknown MhchemParser output\n }\n assertString(res);\n return res;\n },\n _getArrow: function (a) {\n switch (a) {\n case \"->\": return \"rightarrow\";\n case \"\\u2192\": return \"rightarrow\";\n case \"\\u27F6\": return \"rightarrow\";\n case \"<-\": return \"leftarrow\";\n case \"<->\": return \"leftrightarrow\";\n case \"<-->\": return \"rightleftarrows\";\n case \"<=>\": return \"rightleftharpoons\";\n case \"\\u21CC\": return \"rightleftharpoons\";\n case \"<=>>\": return \"rightequilibrium\";\n case \"<<=>\": return \"leftequilibrium\";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n },\n _getBond: function (a) {\n switch (a) {\n case \"-\": return \"{-}\";\n case \"1\": return \"{-}\";\n case \"=\": return \"{=}\";\n case \"2\": return \"{=}\";\n case \"#\": return \"{\\\\equiv}\";\n case \"3\": return \"{\\\\equiv}\";\n case \"~\": return \"{\\\\tripledash}\";\n case \"~-\": return \"{\\\\mathrlap{\\\\raisebox{-.1em}{$-$}}\\\\raisebox{.1em}{$\\\\tripledash$}}\";\n case \"~=\": return \"{\\\\mathrlap{\\\\raisebox{-.2em}{$-$}}\\\\mathrlap{\\\\raisebox{.2em}{$\\\\tripledash$}}-}\";\n case \"~--\": return \"{\\\\mathrlap{\\\\raisebox{-.2em}{$-$}}\\\\mathrlap{\\\\raisebox{.2em}{$\\\\tripledash$}}-}\";\n case \"-~-\": return \"{\\\\mathrlap{\\\\raisebox{-.2em}{$-$}}\\\\mathrlap{\\\\raisebox{.2em}{$-$}}\\\\tripledash}\";\n case \"...\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n case \"....\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n case \"->\": return \"{\\\\rightarrow}\";\n case \"<-\": return \"{\\\\leftarrow}\";\n case \"<\": return \"{<}\";\n case \">\": return \"{>}\";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n },\n _getOperator: function (a) {\n switch (a) {\n case \"+\": return \" {}+{} \";\n case \"-\": return \" {}-{} \";\n case \"=\": return \" {}={} \";\n case \"<\": return \" {}<{} \";\n case \">\": return \" {}>{} \";\n case \"<<\": return \" {}\\\\ll{} \";\n case \">>\": return \" {}\\\\gg{} \";\n case \"\\\\pm\": return \" {}\\\\pm{} \";\n case \"\\\\approx\": return \" {}\\\\approx{} \";\n case \"$\\\\approx$\": return \" {}\\\\approx{} \";\n case \"v\": return \" \\\\downarrow{} \";\n case \"(v)\": return \" \\\\downarrow{} \";\n case \"^\": return \" \\\\uparrow{} \";\n case \"(^)\": return \" \\\\uparrow{} \";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n }\n };\n\n //\n // Helpers for code anaylsis\n // Will show type error at calling position\n //\n /** @param {number} a */\n function assertNever(a) {}\n /** @param {string} a */\n function assertString(a) {}\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/katex/mhchem.min.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Bold.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Bold.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Regular.woff": {
"text": "d09GRgABAAAAACzEAA4AAAAASPwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAijAAAAFIAAABgRYdYoWNtYXAAACLgAAAAgwAAAWL22LJqY3Z0IAAAKXAAAAAaAAAAKgB9ClVmcGdtAAAjZAAABYsAAAuX2BTb8Gdhc3AAACy8AAAACAAAAAgAAAAQZ2x5ZgAAAUQAAB/aAAAwoNp4c6ZoZWFkAAAhnAAAADYAAAA2FNd1GGhoZWEAACJsAAAAHwAAACQHxQLmaG10eAAAIdQAAACWAAAAsGPbBMVsb2NhAAAhQAAAAFoAAABaBBT3jG1heHAAACEgAAAAIAAAACABYww/bmFtZQAAKYwAAALJAAAHLx46VQhwb3N0AAAsWAAAAGMAAACa0lYi83ByZXAAACjwAAAAfQAAAIqOiODGeNqVewV8G1e29z3n0vCMYMTMtiSDwDJbSeyA43Aax3VKcdqmsN4kXe4y4+8tPGZmWPwYto+ZmZk+Zm6+GckTu32cUWDunDPR/R/+34Qg6RBCfhxdQokkyhcEA4IzzW6oG6p3Q+XOl9/qdND9f/+mA58hSOr3/xJ+Gn6YqKROJoY1DoQCMoJ7hDHYJQAWbAEp5qNhxxaMqKAKEW1GOjE3Wi71e3Px3hQtl2rlkpDe5brRWDzW7azSfv8/333mF3/p1h9QIz6RZxrmZlWFQ3wiki+24gbCD7/pjf/m39x5xy9WW51kCDLR0LR2Zub4iZCMphfbTYMQINcIge+GHyFTpD/s6EBgapJQTuqAnG4SIHCPEMKR8D0GiPQGodShW/XK6+qVkhCpZmRu0J0beFe3E3ejcf+b+d9beN+35P/S73lP/Of9vpDl+jWGiclEr6ExriAToWFCYXrkic3HIzpTEsOQQiG+mZLwKUaBy4QQL30RJXIRciSidEKCM4Ff97UaSgKkRQi85H33E2R1uLQkkLMSAOIm4QwZxzsEgSHsE0IYJ2yPANDd8fc/fmxxfqJWyKVi3ibcZsT/kt5Xd6PSYtJC6eHfHe1rtC5kVHpbqc/0ve0MRrvt9zxzSOGriFJt8Nzm1bsWIItG6rGUiBioPHv7BVUqTJgGp2kUX/jINCDCdw7t/oVj/RzyeLKRgvOLKysrIuyKUDYc1w2qCmCriHouxFG+G8G7BXRspHebRnt6ZpDzn0WSKQJk8n4Dftzzqavk0vB8HRhdA2S4SRhFyvytE4pkXwIBSjwIOKGMUw8CIWCbAIgbRIC4COTCuUG/3apV4lFTJ1fhquJ5XnxkQSnHfuZvtl6r18plf/eduYG34i1524+Nd+9jMnYAH0BPLx7zFMc3QnpOUPe94HaymArztDY5nU30ndSUmKgJwY5RoeWqO4udRLowU6DqRjdkX+mthvKnNESJb4ghmo9tONHXL8eKspxwixxohEft0q2F0oyCQg+hBGFvdvZaMpmMF3JJ25hY1Gm5MayWVvMcAKD+hOLGlNWHDDxfrGYLhCDJ3F+FX4OfJwtklWwNzyzlkGK5hEBNILAwO0OYIGzTBQpnCFK8x4FIEEQ8ripIKewyAHBga3FxcXVxNbRec8OT85c0kWnGB91OZ66zygaDvu8ytX5/MEanGw91Y3HXC4KDMPHvZNl3o3J9EBJSviSyzJQal4wj0Lc/lUU0Tp36OKORiNhmlLJtQD1cDTMq9cWTN0O6eKqzvP/VAgAAEdn7gWMkErp588cYipdvMSwhO3YCVWCUFSSi+EuYWb/6lX7Udzzv+aIXOWfJ5eGF2TZy2gMEDkShvguxewRBAVTuEIWAQvYJJVxQvkcEARSwR4iUZJsQIneJJPJCrV4vV9qlRk0V2WY86m1y7Dl+nNS9LQZe4H26nqOMH/ou47r+k5LrHnGgkWytPorJb8i6kk9cTCcncnY0Vb5Yl3YIEQRSRtfP1BONksrUc++ediAZrtR2BjOF9K3lWHx+k2VTiVwrnkZ1XXcvnFxac5MnVMG+I3tRnwPIcGGzsLmrPHTNVUKnlq4u91tL3HloJVvM+/4x6WXsH8evIj1ymjwz1PJAGQHBcfPsp7WL14cl4t0zepugH2/Mg4NwQfgTRIggn6eH5bEQufO3SO0MtfrcZHmi7SGUbkb8dDOKnFEcHcSOj9sYHT+rjjPQoDdG1bsGXmAK4ftUgHi99iXxhWa3MZt1udFp9p1ExN5sLW2tz82/Q80k4llLs3komgkll/Np9iER19pdQ+0XJzKuxU24VWskS4uzi+F4dKnX1hm1jj/yDc9/c7v6fKqYi8UtjQHVdBlZm3suAvLJU9cq+WbKXT2z3jhJgAw8z/oT+DkPuZPDE24UGVIgrJRCSvx6guDHEqOM0DuE0rsEGcNtgsh2CUN2AchUq5gPO7pKetDzy+Cg5LvCwMvGXsS40SBwxqUweuBY45w8VyqL8YOzBqclYJxzQ1brX/kWRk+doV2Nolaf1IBdza5MQ+PyV3JFZwz/O0r2I8hAMotRhsVHb/IrH6ucrrB6nSe+/FMzl1cQgLI1lyIhlDTv/xvPN76aTJJlcpH0hrOnuyWdc4qwSQgDpAT3OFAa2Hh1pdVcubh6sbncWk7Gi6N686DcCOn9Hlhc+BnjwMCe3cd/Lo1sG4+Pq44XGLRzkJC9oCuNUYi9pXN246YFieSyYTXK4RB39i+cf42FjWJXtdNmQgt/fmoroWzMa72Qgtqx1vKVvHHGKisKjy84/Bre7pxcEOFWtVJV1FSpVK8bTmh49fJQiQ2n6hmuhcxErFw7vdhtFlJquyKL7VA6rNRm/9+3nJqpl4xpNcZ5eGI5Zi9cGMdPA37Cyy99sknWh8fWbJTCg4cRIZnYU4AQQAJ7BAlH/hiRMijMQNaPLwxmpyteM2RoUpA+9NWgJPnGPqhI/SA2HhQfH9KuD6Vfug46j8goSHwAj1SyN3oBYGpCTU+eaNVFc8ux1qY6MXsuXa+gxbiFW9d1cWa4sLB8Ifez0fJEJmEAddK9eno6rM/m3bhlCufY0juluo7G4vL2cjs7sFwA7V2PNrq3v6lZWeonc/Cv7FTq2Km6sZSazEw/tVdKEiS5+z9Lu/jrZJ1cIT979tN1L5OYpzeyVMHJKnLAzfT4Xg3ud85+OuYJtQhShfrZ2C/aBO6ooBBBFHGLARAJ8jFCqXmWcG7xrfT4xROEIr1HUMF7f7PWWGE4fSCrerKKKlTldqBCVE9DfbXGzs7QunJ5qXKyMVXzENa8nD/ws/VBChr40eo76ah9kiP0c+j9Mkr44mhm865+uT6+r1W9G/+PQsqu94Zc3tQoTrgqq259zX5IkYhKN+6AyU2QHHhYL9kOMGMi7YajRZuplkB4z3vMsn1jUJ7DSSb04w/xpIZgaC81M3MRN4POc7/5ByWUTHEKzse++evOr/BMlOpSOJa3FLeESIjS4nQEKUR64bf1//uZH11x3/9BpeYwxggBUrj/l/iV+BJ5gXzdMLIMwJpA4eIaEloEVJhXHuIe9tPEL7ngZzi/AOz7I4Iib6saEsJ2OTDmGUtR8IYARAs9C8z8NRpEKnf+RpWdYRrI3TtPP3nziRsPn1xfWpiZKuTDIfICvKB74QIlH/3x1fedfpwpgks8eDzXH/S8lVIQRr6FokJGB0fq8bilO9rOjQwbROK4OSwJmDXzVquhnEvnpLscj3a7odBMzYrXLHMqp00lZtKAEE7b4by4KVWq+Y2t+tjblOTNOEU1PnXRNAfreuJbn4hktjoWsoW4tCaH57sNHm63hrwE1/SQq9o2ZlOpSWlZE1xY5xLlR75ssLZj23GDxR6+9dI/kzZjVDPBCEf5LFI0xG2Fak+H4bwW0rRqfq4lePjKQr54+p5JO5YSqliTU5NrhmP3Uinq29i4/2foejZeICeGwwQw9BMXUmQj66BnHQGjiWifII6i7nCGm+u1m6VCPKwIsgAL0rNEtfOgpfExDlAeAxvgGUwUQTofFXL4Azva+arTx6e3QvVH+h/YECrGtlDWzUzSkTpDPWHxZHq6vTU3ffnCZtec/h5dS5+4VJ1//+Lxr3x8bl0C0FXmTJ5OJhWmsFhrImTFI279Tc8/uXvnXDRHCJIIIfgyfg+ZISfI1LCJQKhfxSinhN8hwIASoHuEc9wliA5u1ZpbzWvOaPDzJ9O+t53ukWLmXwc7XcO5yFx5pizG2xR81LKMB4Tu2DGrYRr79HPZXOyJ/d6eWvjIh747f/0ck040qSuPJSmlwzMmMNDb+PhzW3umXT5vVd/0+JdnOfyWgRrduC0hkl99c2niI7efjnNAJnQrorDofwSaYuVJ1NBJnnz9fAntx37qh0t0+vyXJ1zfwjkvinuehTfI24eaC4ALwIXf25mjZAtIEW4TwTgTfBSRgrI9gkh2CSEji/ttr7SkF7ntsTi98/eS3xnq1XK94pXuU4o3LUQOylfnaO/rLY3Hq3Hd6gTAHnpGN/CpsUv93oVC9cNnaIRvR2RCnwk5UrnycMFsNtYSdq5Vy1ysWOdWLs1pnajjdL/+3MZNt3UPnm2sd1qD8xImTCtdtZK61GyrvZ7IzGRT1NCsHAUzv11KTC2ed3K6Elu/emq+2rq17uMXvv/7dMXzmisQHeoRoJBgSChujqvVjO9FjJLbRFWkoso7hAngCuN7uoYHbdEomQWgeBWr5un1HuhxoQh+qA6e3tgPGfHn/ydeqdvxdPsHuuzOP0h5uPgP0VOlsn2grcgLO14VjBJCrpBLp0/F50K1k5XqG4qGVwtBlA/y6SLOdbr+LBz1l+a8RFmWY2tGu/76ODGUg0wQ5IiOrxKU0lXslcFsFBzuXO5Cqtk/Wfw1ZZIuJx3QQrdvghLJGfjii6rflM9GDPZ5emoyvl4W7oUC0/M1nfNwyVYZc6tXplETJ/Gpks6MfIMBgJJKTdg6cmBQOP9IDVAwNRRK6+LTa7m2hKEiVb1ImV7RuChd/af/TJ9Mo8+73P8QbuMXyXVyfLh24RgKmQPqkw9CghTggUckEJ938aHdG2VN9Ls8vks4N+VWc3JicrFRL41iIBrsNHBs/yr7rYGPRdcD4oBACvqGo4TDYb93sNg/mIyE/PjpU7XSYonpfD5hpSanNu6m6meXHc+tK4q+dEqJhyrFMOenL4fDp1oLZvY739iemZSNGoeBW6jYppVF0BKrZ2fnzjFYvfhkvHZRLYequvbYV23dy0qa1bkfJjwXrl9tCcp6JrYGz7a7b/iBnAEymWBKetfNabodntWpcIxIqfxV26Po+Xla9qLnWfJbZz9d8pw3nAYNlkDgAjBxBjhjm+lXL0pvcWfcXdQI0VAjeEcFVEAwFJ6PSk/Na6Q1DXYpAJjaVnr88lYgTQGIRkDbO6rGOdsmjPHdkf6F9LAbiBPJOJP8r1eTgRrxtbxAcG7dfPTG6XqjlakNqo7uBUFkbJAgr/kO7936n8DGFrrRwPKHNdIb5YSUo5A4yIa+1jgjBqPwGo5uxzLVSLr1ZTdmLanamTe+SbonFL0ViajzzboOCFWlLPR01dXjd9ejoqFVaei1+zJdiQpzKuxQXVRqcqpiMsxEI7kEq0zNe7yBVApehbGrw4slywwdu3sVEpv/0rBToNPEp77uo7dU16AVHtHTHC01OtlDp6nd+SRlkNh9fCCdpAEyG370HXEE4Ay1tKYCOB+5WHZDLUvNEQL3/5AQfLfnAw+RM8OTA0/KAAIj4hIYHwUQ8wNISO9WsD2qICFBCQaytXl8ea7fquczbljXyEPwkOp3Gj5KYzzH9cH/PEgpc17NHV+DckmIYFCWQSfY8SS6QY8nHzyWsPkcA0Cu5bxqrV/qRuvf/oNUmulC5GwkEUmUYtFcjQ7NeowuxzSF69lKhCWeXnoUuxeqX6FRzzxybc2Ox7NZOzepbAACKIaepQZXSksGBwAmdTMpMdGa/8DO8u4EA+AaS9h6mulSPdtIMBCCCSMlECL9lde/0LjWVgkBMn3/Q/SUh+FJcusLRUAGB913hjCCZMyBAsJjFAjhuwI4N4mX8kvBY2+FAmGc7BEEGJEQsOtrXNgZhgjx3ruxutzrTNTbNSliTQjq85E2WgYTe+DD7mEy84EOJD2xoPWjqyoq/VjE6neyBUWJTjXftBRx+xcidiKXjyKeW6nm1jJoTVwdauub8RsVDtzNZaNciU5+2/XoPn6PSjkN582ZL7v29kpird87pdKpWqXQiSYpmqgpseV1d/K66H3Hr6+pIOI7hvDe7ZQKp54cedFohvltfIlUyKPkXUO7kURkJ4CLEACnHoY5D8PGAwwFchR+GvDbGQUIOeh4JRzQXFOHcFPv4zkt5XTUB9G/TmFnaExXK1Nuotks+mQhHEn6D9of/6ofGUu4R7Ef9MfiYJ4fFci5o83QmBLpPagOI3baL+OOMNLNmRwo/aitdZsV02TRtDMeQ+DrdA0cQ9DWt8y4ZrzweFU3JpdUUYiEWeQdF03am25c5FBo/suzrXy2mMN/jVZ+/unb3/je8xjKGSz9nq9++81LUrWCgeP1qmqbNujPzLhRo3Lq1reEebkQituKOn8OnK2Fn1igCpbrvfflQpjPpHLBVPlxzyLnycXhOQIKyQHQDjDPHMTvNYjioamAQsEDGTig35v7uYLvBd2MeVYAYxbbOr914li5Uq+WJiuqSDehd5gqx4OcTzAGJzZHRjrvqh/B/yBZBJ2pGx0bB/4HG2Ss6YlUNhSKSZEa7N6YtkxFSVeTNnWeXbbjuUR5Z65ta04nbKOIV6quR+g1t59Gg614LzFD046NkmeUk+bka0/dXZ+c1lVIJNCMxcMJDY2ZayZlPG5TUJ2UjsKIV7Yv/cD1Y+1rKnStkJFOGKEYAY/B/1l218PseZ+/X6whJ7M5pKMcSpCMD3+8zz4ZjTD7hFH2gpA4ckdKLZ9p2rm+tXnieDoRsg2dPA/PK/7gPHZGHBGNnQCjV1CxfS+ypTiaAMZcnL9yNCOMqdwDHINmJR74bcT7ybZ0bsq2YJpQYinLNWPVLNdStkkRlCJyEVO/43zxYcmEZ+WJlDNpmpWFfqNapEpqIDCnSM4jdUMpbxxLCi1Z4cgZL/Us2+V4PvLif8xRhi/Fw/aw/fL/et+psMkcwwzrekSAbTZyaZnmX/svVSFS2g9eqWwzKs31czPfOJj/yi/7yNpAhaytyFZOClcAj//wZz5b0DJA9fw//+xsbeF89D2QrQDza9mfeKzWL1GXXPO7wQFwrKpIuW8IpMjpnRH0BAhywD0BRy1w5tSxtel2JuWGyDW4Jsf4ewgFfGfggWPuTxzOQfWe/73GWI9c95BW8k30avDnYNumfHZjrsej+erUdLx3DR1qKhk1PFdJMx5uDOYAQNa9EmZMTXm0loK8uNiZTiUK82FDkUy4NUu6xUtJxpQGviSp+/1f+NId9cJb3vet7030VNCsZk6lYUtVB+/8xV8wARAB7YwIbz7x/Jve4gLNf/d3fLydKCXCbWMMqXXzz36voFgJAmTx/l9SdTSPLg3nM8AI+J0AZSPwGNlFEfjtIdOwstTrTDbSSV0lG7Axhu4oRTMuSgGAD9iGwK8DwkEcDu1jcdy+/nCi9Om76xsL7bWTYEyf/kjaRenBpWYv7xtwrXNyfm7pVtw9s+UmQs28queLJmdavnvx+Si+9JZbZzdf84WJZCz79ocL6u1L77ga4mAw4VFB335bLXz0WDWVfdvm+vrOa4xQczOqZ5GL+ObCjTASIJH7P4a/41X0c2RxOHARCfOACA4LOHLPi4SPjj9SINJtQqnfFFG8sBlvxNpf7kiRPuQl/HO42Hj8CsiJoCHynj6YFQ5bTR+ycGQV+zUZkBZjhgJzzVozh29ciSsS1X4iufr1F2IM043k1ddnIpWVD2UxdX1C12biXDFfWwJG8QF1cUhVgLKUSHtZ0zpxLOv2VqlgqGXCINaXqsWZ4rz+7//HC04orTBehAjYspYBgIDFIATIvftvoxHPS3bJB/ypG3B5GqXiT92TI87RRxDhDlGopIr0KwRVRuQNEVw8Rnwekfg0YjD7zv4VDcmp5Pt/kyLxa3etNjU1UY00SqPafUhZHYyrI3r31TNa0FTKIPf51ytLj/eeA87oIOzxW27t3ji3kVDatbX2TNyKgpF5d69VeGJ78I2XcvkT/cfBfPvOsXWTnn78eNyVXMnWotR5ftGJ15rTT92YLZlhO5rRqtu9Xr17PTMB3/jEi+c2HsmWL7S9aQBM1cjVnfaLr79zes/i5WOfKGjPf265FRc0UQzFLDXL0eTa7DmNKlq1IJihm1GVAhh6NHl97irxvdWL2g38bnKLfPVQRyBywUUuAhZkjhApJBF3iOBSeKj62NJ9QlFS3CfIJLJ9FaQ84EOUcflOD3t/H0UCnioBuXegtjN0H7lx5fKZU2vL84OpVq2Sy8w7mogF0eBb4gFLJ+RhIZp7MC8Exhhfpf4qDnxbBRO1Kw7jZODHSf9okITefLlz+er27WqbWu+4gjSUngglcuG8YziZsB3ObTySzuqslg8V88lQ1MF0Lc4idGOqX+p9RRwx93iMe92Z1FB/U4q/MnQGu1HLTmYWTHvrTUXGk8Mn4mXbsaO2AoZZOBMXoHazF8+nQ9TSk2EAUBuzG1OxMlj2f/ufAz2UUzlNQQWqyiuiKez1XO/Gl8YcxhYwgM0H8cCAA/N7LCC7Iuhg6Y2gaq2tzE5P1N2IppLrcO0w9QZ5dHxMFxB4R9PPODACwG0U7pFzKf86eBywqvAXaw9zrmdrKpOMWdbJ0sNJXk0PzpQXqNFJp5571xvW3FazG+N2ilMBkf6T76qbGH72dHxWQ1Qz1RdPUeqPBV9sz5qxiJ5lKBzTGweMyJmQOVlOpkq56VXTWuolQ2cupyveUSXVVR7Tqe7Ek4njl5P5sBz2SuFqW0TCSqM8dUwA+PiV7v8Legx/hiyTLxlqLWCQBmR4MILlCAOE0UyAd4kPIAWAgyEMttLjlJU5KjWaxoBx2PPl/UGtQggn914lA8C3/beMaA4OPvdgEUKWydLkUqtelCL5YKIYmcP1fx9fQW+7ij6+o1niQRIKshX+6Uwq5DhLmfjTN6XMGn2eqkb6umkrlSguLjBUce81ph2lsh01FTudvzfQ/w1+T0m1opGS4IDp1OumfjX8yNlamOncunxa+cs/VNBExhsRLs284E6l1joukcD9/3D/j/EHfA4AnLOfVj087CJIWAAkM03kSDfHJ3nBMnuw/IoV4a3s7IxfUCUSCEhyR4FR97vPALn32ffR9yeE4IDQt1HziDDzPvuE+UDvk79exf8mJQog4R6RRN7ztXzrILvnaeC9QHJY+5uEBN4jQlgHx5Q+fRoHcuXSiWP97nS7kI+GJQ+oDD9rBb33UeI7mKw77oFNo4eHiuP63ROHkfbqf6yVDJ1YXO6n7fKKrZUr8dLpz63FzCzTpqJhpjjdlRhjipazHf5INBxLTlNx97mNBccKKZW6HlmbslXdjkWzuG4kyoVe+WTj4ocXi6VmLzbz52+brFzmThJ1J19/y3+9smFLxi0rXxOJ2KnvAiY/udHUELW1qeLk8Y8/M52LOl458aMoef+n8ZOeD8yTi34UIcBmFsjpsYWShBIg/tAH6H32/RAIgiNCCPWQpUDvEUDw4MVndoba/FyzEXdL7ODftAXFtxv0O35i7wXD8SvjYi44yEvOpJeaOxoCpCPPfTzK2oVwzGbG1ByLfWLr1iMxZCaq9mJ+ImQ7+Gan1Ljy8oWnVTMWeuxzQ93INTHhdlRk6z09857vv379ogYJYTW/f+WnttsaH+35p5jm7flh8ug/HlYMyhA2gw37Awwyv+u9SzgnXpD7na/vVoWjzyig/3h79NhnIQn3SBvr4evntvq96XYuUxKHCIwwkINVGhSzMS0ZDBmBf/SOdCtUSHHQlwiJNGDJPMEp9ACazR6ru3bKQUCh6uI1O8coAm9HDcpjGzbQ3OCFNMunDdcWwjF6mPzifsIWQJWFMKXsq/8oplpCMUNmbrFh45vDhW6icfHerWfDCJ6LqZ/4mtcqVCjcyQp59g/+c5iVzn3zY6aTrXbaKorE1bDzrS+//Clbs/jpP/21TSFe/o2X/0sa4nY4+dibH51/9OoMAdIjhNY9jJ8hHxw6SYYEJyPIybkRp3AQ/5qKCL5r3SGEA/E7DQacHUS+BMbErgJCOMJPxhR8N/N1CN4bZ2bO+L1XiO14FiTe33n7+rUL51eW5nqzM8V8Jl0t6j5/doBigL3ngfHOgUm8B8GU513SL5tBQxkLotmvjVMY9Ju+9Pj45DDKx4N4GdZLjQgYNxdzkZgmVUCA9icNTNpL2WQ64hRPfyipaNyscyVf0RXQi51N185HBQBnIN++r2CGKlTqM/FkZiJVWflYW1G0DOqIT9XRYHSi44QambdrrhCZR9LMLDDDmSimc4lYZumqzWH3zeF5JY9SrUar0tk8qwl1tXHljMvMiqBCC6WL6dpEKjV9LQ3vGazqfmyT/P27+JOevU6T7zr76SnPOtpJIGACJ7iZ9m9wfBOcAaQIJ4zwcTSMxsMx7+/nhvELCkcl6Khmb/sS42kSyAUvUwvwU7d/0ssZepY/EEUci/qzFaBfYiNAet12K+/tUXJyGk7LI0k6HgtFhRuYctTJH238j06kcw+m8r4nG5BOV8LR7vrVzjXExkem9Vi8aEUMIQvJlpL5xHNbH28wJRYuzaYT1D6ji+YlR7DwbmJCUzO4aerR/sbrX/5z87Ta/rqPl5x0wk26NYHR8slc4fl/8/z5pwUI41gj3oytCwD1uM5qt060/s3JKAd11AdWCcH7HvLPw8LQ6oIUReB0CID0oJHfIlIwIX0gqWB+I84F9YMFBcd9YmimZpj+WQzRDNT2dAAYB4TXNdq2c5aYJtm1HCTEIUHtPf/3eqcCQoLY1gE0hIce/A1/zVuHl/5eLyS2SUyb/I0vPvpOz+p1IM/efurW1csXz2+eWT++styZnW4364V8Mu5GbEuVPmkW8jyhO06Pg/KofR10R38e1ZIHZwzjsj2O/fjhGZCMdkf5+WAur9ePUpTB/HhY0f3o71qpb/tIYmZaryhvLjyZsJITJ85lqmVNZnPpSEgtvXMVIrK9se66LSsCGN69lbKmDayENNQmQ4l33OPl5aevdt2iJqZTwlAYY+HC2q5WGjx1ezqXcjUj/rH3JUAocZsVn8s7oOnxvBtxUZdVY/oUB10FcEFDlLHXPJ0BjAnqpAG44BTib7nJQFNoayJSlEi5Pd+4EEFN1wxCkBBCoEVuHfyfAT7+PwOz/a7b9X7eGv/4+8uBL+dJ+XLic0BgLOM/+/8Zu27jAAAAAQAAACwAdAADAAAAAAACACIAMgB3AAAAmguXAAAAAAAAABYAFgAWABYAZADCAUAB3wJfAu8DjAP9BI8FGgX7Bu0HYwfeCH4JfgodCx8LwQxdDSYNwA6FDyYPqhA5EQER4BKAEyEUIxSdFU8WJxbkGBoYGhguGEIYUAAAAAEAAAABAAAa8Ek2Xw889QALA+gAAAAA2LKY+wAAAADYspj7/+L/KARxAxUAAAAIAAIAAAAAAAB42i3OgcbCABTF8f937weI0sCYtSJRI82I3mFEBAjUC+xNAiAAAVCgVwgEAgIRgCAwWKeEn3MuB5eKDOCvACrli4EsJZWhRJL9+lRGn+4xsW1JrEnDncBaui+0bUHqhbJb323P2CptjiT/ByLP64dHzOxE4BNKnxPYCm3pWVk/bUPoN0I7k9uOjl3pf39KRVjDG+i3I+YAAHjaY2BkYGAW/a/BEMWy8f+jfw9YCoEiqEAHAJ4lBrEAeNpjYGJKZJzAwMrAwNTFtIeBgaEHQjM+YDBkZGJAAg0MDO8FGN68hfED0lxTGBwYFN7/Z1b4b8EQxSzKcEOBgaE/jhkky7QaSCgwMAIADsQQuAAAeNpjYGBghmIZBkYGEIgB8hjBfBYGByDNw8DBwARkKzBYMkQxLHj///9/BgYgz4DBEcj7C+Q+/n/l/9n/HQI6QH0ogJENiGFsJiABxKgKQFajAhZWNnYOTi5uHl6oAB+/gKCQsIiomLiEpJS0jKycvIKikrKKqpo6A32BBlm6AIQzFdwAeNqsVeWa60YMHYeW4TK4IN+52W7jsS8z23HSy4vfZxftpd/l9hn8NHLK//poPXKyTKWFaEajkY6OpAkrQ6yW4yghevm7mpx/yY3Fj2O+afNskm5QvhxzpZn9MayG1eqqXrEdh1XCKtTtnrJUmAYeW4Yp3fC4YmiN+M85rs183Ju1RsNoNVr4JHa0Y+cx8dxc7PDTxCa+K6u7SUJF3yhb41moBjviq3J+FZZwFhNA5Bnx6FycQkNyNiqr27K6ndppkiQ2W26SaFZz8XqSeFw1BD+1ZgZA9XAu5roOuKEDwE/YSj2uGQ1ctFbUVwKSk35w+cR5tMrVlgN9SDnl8F1crTeR1nycztnZQhLrBKdPF2Mc2ZLUILLHdcNDodtTlT41DWx1oEGxDjKurGywtQr/XG95PGRIQI6Fq7/X1AqJB36aJmKStkuQw6Y3NKbCKGg5W2SPmN3kj/a9WK6GHhmnFOU6o7UBU8oWNplsgNxEydWmztr9EGOHXOfLuKVw66BL46ZMqDc2Wo1ix9ZO0nI8njBFpRLxWtb2eNLAkIjHwxdyHQsdJDwhuwXsJrDzeApupktKCAysIi5PhinlKfEkSPN42rxciovaWju5zBPr+kePT5iX8/HLxb7SdqA/VepPmkJNhctxMTWF+mUBT7nSpGjdoBiXjwl8sHVWE/KYiwshD9kGeU5l2JajcW1zbffPcQX/pSZBJl3g70K7u1SHFLBQ6pQGWyGrxz3LsspanTKqUJVoKeYpHVDEYzrgUQROA0oR/pfpaUtNqiDI0+Jkw+XvXPsSaDqN3E65Hp8xhSXyLHgWec4UVZHnTVETecEUdZEXTdEQaZtiSOQ7phgW+a4pRkR+aMhn6zOPW+XiK4/dcvG1x+8ZxRPuv8D4PjC+B98EjCIdYBR5CRhFamAUeRkYRTaBUeQMMIr8ABhFzgKjSGPoYdlqnkHY6ZRCgRBKOSDZSL/5hj2XPUzSFUPUpUMqobO7Wp6xIy3QSh5f3SqPdZavtIq6dSaKryZlgtdKZg49vm7oVon3BuysaH8QTBiCH6xXZ39W8tN+rO8W160zyOgm8gfgg/GyCrO7Ht8y/rmHHt8+zhRNuArzOyiJOtskn7oyvKDyeZ53dRfTHq8gf7Yw0bct68xpxL9rgAoDgr/ShEdCdz33NdHDHL7ubR+T3/fBNR2IFXEq8/50Pv6pQlWyf6rMVC8mgbyBwyEGrLTWHUwfqrkHLYGN/mNfCdM1zdUwW5uLsclsrFN5g/beyTQh9IzuoIYaETrIC6KMktJBQbRE0ThJIbmOhqrv8wqPklGzBIHPuf4rtx0LJb8vHBA09ZkBB/ohqHkgauSqA5x1dFeCSbUeir5MYMCoWop9eqgdG5pNJZxtU95oYvd857dvv1AHdfCgMlra+NEAQbhZmlS+nvemuFnKx0aTL6x18DA/TPzCt05jAJ9sqed2qp/utj7Q5pnhu+6BTgPD99wcgaVZgHa/Dcrisw/TcKvDwO5WC2q0uq/vDty18WjgDf8Xrdj9v7pP4Gd3AUvjCdlRbycZYIyEjM38O5K/owcE6Lu7U+4i5TP94ewpmcNTPt/ELH50iP65KZR1+hTfwvqF4TsQL4W1CLxSJweKQdhXRtqRX2L52vTwzmDxBgtLFm9Nzyo1f/VY12YOA0AUhI+hj4sEDRxzLDOzZWYuS9Cgd1aQzfP3JxY7EvpLBvMnkcUQOQyRxxAFzJdEEUOUMEQZQ1QwPxJVDFHDEHUM0cD8SzQxRAtDtDFEB/Mt0cUQPQzRxxCu5T2nh3nA8N6lhlofUiO9nmR8yhhb3kuqJwzVU0r1jFI6t7zXlC4YSpeU0hWldG15byndMJRutaA7LejeCh9vrpKPp2/Te3C96yfnlLxT7DMrcU1jAHjaY/DewXAiKGIjI2Nf5AbGnRwMHAzJBRsZ2Jw2MTAyaIEYm7lZGDkgLEEmMIvdaRczA1CaE8jmcNrF4ABhMzO4bFRh7AiM2ODQEbGROcVloxqIt4ujgYGRxaEjOSQCpCQSCDbzsjDyaO1g/N+6gaV3IxNQH2uKCwBoESSjAAAAeNpjwAQpQOjK4Mp08P8rJlEGBhgNAFF6BtkAAHjaTMwhCMJQFEbhc+/dJiJ77BXBRZtJEIvZHmYv2qxWewd7sord3sEe7MlgL6L84bWPEw4wtYQBAAPIRmaQnREHOVhwlCtmXOSalpvcFL21DQ850dtH7op//v8Dq8bA1SeyMfe77CR/ysHOX3LFKpZyTR97uSl666c4y4l1/Za74p9//+23NerarhyEgXr2V+htmy+3bE/vvfe3HOJLbBK3A9z29ztRett+bEAMMyMhqnrkbJoFfpu8406r9b3RabVbvGC8TUveT6wpExPzapmo6Cm5/emK/I3XM13ybKK7phit6wNzcjqvc5s6XWc22TNpL9duqSrDUuVSwx3V4jF+xmvcEF89ODLO26rklmqpT6/UHb9YOL+dGAwGqtAhu9BDhSqm3v3WZW6El4D0NXItjqOBDRnvGW9c33T56nK8pQvz/Foqig4y668p+9V5GGhnGEBuE1N6iHtl1zgOmeH91Q3erk15Td64JsR8e/G2aiuY3WtZ97XN9VluWOrRvDS7yzqMRVkI9Viz6RNn6+CVt/lV4c3tpY3XT2ieKqppRI4spZRRIKa3lNA7rB1q4ftODYnaGEwLZMgLt8RuH0wLpMRqKAayKrGi6JfObfp05/wN2Do4WlxnwdLUhWMB/TriA8QndApPTbn4OUQ1FBbcPTJAejjRwJeogkuQ1QE3kk9J9WMYv/ZrPHb8C8URdk76VMmNWqRkfPrDfse/33HxmaCBfAqd0xTgf4F1SOqmF1P07j++zOOMlzcs/ZDzKHNMEZhW6mLpmJc+9cmAz3cvx7RFGmrzW6+lKMJ3IDv/yGUf0TmiAdhO3IQhHon00N9k7iHuSi0s1RlRr9IG1m1kAveR88Yjh5j42Yu3ScmQyl7My6Spj2GBazqjXLD7/mjJOEu7Egcaowh4wFcjbuLzcHNksQ+IFQa87jrepG3oN/5G8wNrp2zaAAAAeNpswUUBw0AAALAcKRjDc8zMU1fhrYEmIlBXLtrsEERJR1dP38DQyNjE1MzcwtLK2sbWzt7B0cnZxdXN3cPTy9vH188/xJBCDqUZe2lepoGBowGIdnVzc4HSrlDaDQBBrREyAAABAAH//wAP",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Bold.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Bold.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Bold.woff": {
"text": "d09GRgABAAAAAIqIAA4AAAAA7XAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAB63AAAAFYAAABgRulibGNtYXAAAHs0AAACtwAABEo2OMHSY3Z0IAAAg/gAAAAuAAAAOgK2D7tmcGdtAAB97AAABYsAAAuX2BTb8Gdhc3AAAIqAAAAACAAAAAgAAAAQZ2x5ZgAAAUQAAHSwAADGagQb7BdoZWFkAAB4TAAAADYAAAA2FnR1i2hoZWEAAHq8AAAAIAAAACQKAwf5aG10eAAAeIQAAAI2AAAEaDToPxdsb2NhAAB2FAAAAjYAAAI2SlAXym1heHAAAHX0AAAAIAAAACACSAx6bmFtZQAAhCgAAAK0AAAGwNxUMPFwb3N0AACG3AAAA6IAAAcnRxroD3ByZXAAAIN4AAAAfgAAAIqSjPzKeNqUewV4W0fW9jln7lyQdCVd6V6BZRDLtmzLFhplxUkcx3agadLUcdo0dcpp6iZd3jItM2+X2+Xts/Dsx8zMzMzLDFX+mSuZlr7vr9rmwox04D3nvGdmAgRlAPgNcoCBBvpnVQWBxosVq2IVKlam/JYL5TI5z/13GT8FBGuAqNAvQhj6IddK64iAy4AI6wDgrAARWwfG/GzVzg+nFTVWDFfrlXIkGnFs0lRNzaQLeZLPIuKJms6vTaTSYzrWCbkSjivUwIl8plRaHqfnJUdSCaYH2q9WGJGm4OXn/ic3TqVsbrwEBHk8jP9DPwZ9MAMDrV4FkfAKRyJYZwgQoNVSNFOKplW1pxhyZXBsKYD4/Vq1UZefeqYqBar/yLf5sVy5bsRXvR6v6Q30JE1S0AhFs3/9Q57T7FL52ORA9tys7jU11fD2DpcNGxVj4oc8B4LW1Xl2v9DlNngJHGkt95oEuA91jZYVIvCbxFXgNwd8pHoN0nRVO88QMbDiQV0P6atX7rnr9ls3zqydOnF0dXF/PncgV81X86Gg2ies30g1mtRwNVQ1u1Jxldu5lY7RtIxmq3tu1Y6vhDHC1cz33LomqrjfWm805D2XY7rf0H3eiqLNjGKKvH4zpBy96TzTcoOKZsmbG25UQpHbb1MiEXroYXH5ylcobCjPNNu0Ttx0vnMdNkMnbrghGv09BTUv517GHnooSjHxWswS/+8+xTuDAW/vK+9iZsgf/iZ5Iy98VDHDprgUXxf2ookri0RMt0Pi2vvIwyxg+XRUaevagwqhx7ZMk0XzwUDGMAi9fupM23oGTHjoN7BNn4cjcBrOw/HWkXFkyslD+xln64fTDPlqlAhVRkB8GRSmXAbOkHHcBCSGdElFAkZwCQDuBcYctnrj2Z5QYmzI1gRAc7aqOZlaJp/J52tdOKpaWktHIlHxqZRrtUJe2l26rlKrOBX5XA7KbD1v1MVVxpETmOrY4nW0Vg1V8wWnUhYex/atZ5pEvmPnc6mBQm9UI+QGdzJ9OlpnJ9JLU9kYa/Kh0O22kk+GAkZvT8SgnmRJPX6bjlfPadF59p7JIdIiPaG/PH+vt1oh3y3HU4VCfzynku7ljk+/clmxD5dnD9zi+KsVVUudt8KpYVL0cC6W1YgijvZb5t2rHN9sH7b9JRNvvLHNjk8bf657HVBg39XfYPcLC4/DAlwLt8Cp1okcqsQR2BgKTy8rSKAyUjeAAWgMNkAD1DXcAB08Xt1zASQiToPXy9cNMYMfO3fD6VNHVwfzucF0tlBM+UQ8oExAhagdcSTQ5Y00uIyHjp3llfsG5EvxJpzPpDXXnvJlrVrIoxy8Z/b3DaFHyuUTq15E/UxiwNSWjtbHDw4VTp23oy8+HAiaFtFzP891Xz/d4DMilt9vxQdiiYIHbx1fPDiU7c75+T3v6Lw/yQlVShdeXzTRe8epjfp471yArgtbpqLy5xyu9eucfoVisVtujcWSg0fPFjztF43P1a97Q3fC+J53wGD86tfYAZHNj8ENcBfc3DqnIBjriHD4ADHcQGIpVASgTWR4GBgSMtoEw1DXQVWdFQ1l4vfqBBAUuYhIWeeoKBFlFeDmm06eEN977OiR2clsLjsUTvkEzlGaqOJkND9pmmuwurBYrSKt6XrGzTJbObjWvao3ynUJ+E6O1iS0xetGplaouqaXxhdPmC2/XcZDXnwP3WzdcZ1PPZccSk2kggP1Sv+EoTZJO9O8+aao5/TG8buD1ONbqDKWJP/1TQqpPVZq2EmfVvjInV7P9Epy8aeSCdPIe6kneObviyMHat7r5xQdeT/+DGPN0txoMxNUnMF4yGcwRfGUWuM+tb7Y9JmDWas2hJp+7NqE2TxhIBrBA2O5ZG2Jea+5x2tMXy41X5hpKIGS3nNk1n9N+8dmlpL64h2ql2lZQFjGw8hFNeiVdS2KJCusLG4gaxu4pW20kGZqdE9dk2B0rVZv1NzCtewWqOjhgMo9fs++CLI99ensjM/w+/XSSdXPuSxDgHDbVQ0fEDHYB7GWE+zUdkC4DIh3RCMZUp1iWHx/F//S7sFuJGTyrq8uWi++MRBkWqDUe/RDqLFg4MYXWxxPPfrn86ToaqBaed1ftX/jQ8Q8jJp/8WihWgEUuVXD0+JXU9DfShACSn0BLxMC3IEQCUMKU0y1i9F0BxdWsNBBhoBPuSKYxJY42pkef3/49ufHvH6DSFGZ+/O85/5i4VsBJZDsfTMiWm/r9QUUg6MUoFIt/O4TIz0gII9l/JqQYlFkd+NAMaUrJARZ+WTv8etbNgAwYCI8iFBgHNGk1USrBwAZnBb3ipvkN+SwdTny2FrLGBuMjQ269CO85SanW3nd3NER2/VbwXHJkFSptlVo5ciOUTvJqZb/76TtDDj3KLoe6Y++BGm2RdEBx9CUe5zkYPIHv6BfCvXEw84deJJYxun3jNgR8vU5aUYn8Q4n1NMT+iHvXL/cz+boRZCGSmucIYKDjKiLCEZMsC1pj1PSHrSmICEdyWazOduSSmNdosRJdRnFVr6s1Tr8oZGqVfH9+qBBuCwowDPPkGGHDXrm6WiI42G64Nj86Q90avgHnubhsLhDw3Y09oGnQcbI1SYSfAySEG9FAIDWgci/AoghXC0NutHRcC33veEh+Ekm7dp4uZQfjicjiSkfVw2/ofiHbVIZMiXk5Eun8uOpzMJMeaFkyDAhf2FGiwaZXgZAMOGD2MQIMIlYAEQ4BQC4RoiARzpgsZiIlkYt5Zg48cHNTSkzIHxNyGxBuBWU49cB0Y+rBYfUiJS20ZW3K+5yoV8xalEz1WsEktGBUwNjOg7Z8d5Rg8Ix1z+qy0mCYLX823FaSMlvQ4kzTSVyNW3UAX9Zt/0hxI/8RsgImWEkfIj+yrZ9RvuWdu9YKOQ32TNAMHr162TRa8CBUeiTAAdiIIDNmCttBFeHioNJyeuxUzK3/VqVvC/q5mNVk8XQrYZCK7dmevx5/VMOz0y95dNjofDYtbP8vvh8oc82UFcnsvWeICExeg0m/qDYeM3i85+evv3w5tm6indO9jkH7i+/rZgsjvXcrS/H70lPSlWPA+Dn6bUQh1qrbKPCcRm4wi+DAowUtqEiEazpGjIAP6wCiJFxO53KWpZlqIliKp/UMrVKrZoRuasmJHWTmmVVHPzHSPvHbPNRmlyyrCdXvf6IQo8z1vzyl63mpO5V2n/f/vsmIEwBEBeWmoczK5/0iSSRAuCMA9sERsRuBQQOyDeASDkDiuJXRMZI7xrDGV36AYNE5hiN5EcKncwh80O3CO7YW3y0rnHronbKe0eEk8u8JQHp8BEx+M+LmfGoHohcaC3WZweKU4l9vSuN1mtMw6OwJgZ8rH0t0s2Xg+Mhz+HZsDrAeBLbueJgoCdnF0pWLFdZ2D+VGAvPjHBWpKiNCrvnElfiPYxt3Bdu1Pr6Z1ZQUxhzAFCyCfILnyzBodaBfaipHlR4ChmxZdBUrmp8E0hhCgn1AVQN1A3goBBXXHyd7eArN+QUBnOltK727uodtS3dXXu41nDzyjbpEpmykO4w4bJ4W++aoZNh88evHDv5vCA9FjieS6nhJ269d98Q0WguPzao9/YP7gvr4X6rXFBVz4AW9FI2lyyOFCojqXQRv3Hg5OyUJ7RZVpzxkVIkunR039BUemw8Nx7liu6dik5NNiwdiYdDGhH6lmsjhZhdyw4VgSAJQP30OhiALBxsLaQixBVc9qDIcKBw5bLXIK6ihMJ5zQWsR+8CNimmJrPJjJg6YFmRhoBtyicskpJKSeCmao36PJXLXVQ4glSJ/wqWqkUpbD3+5pC52f73T3yCqYpiqnGFM1pbW/urNx2+JKB8Q/Mv/xIZknj5J38i79D5ibMoMS08yIUHT8CtrY1Z1NQ5JK0PGVkIjCMCX84jX+pEGiMgBpsGAhLgJVBA1RRVsnJiGm0Aor4OoiTpqwjLSwcWJuul0eJQb0/U8ehwAk94REVvdIqh68QmyUyRL7jo7cDerYIS+PL9bqojxjiOQEH3oRzdrZWPpoYrjBemqv0+LyHpvkjq+LBm+KOcZJ0mFjh08thRLzcU48gLwn2etIqEKpWatzz05isD2eF9plH81+FU3UJloN8czg3mvIV+n90wFC/76PpJhsQTvYo3EPTdaDE2NYXIMHHvuY17DXMqm4gmiwC0HQkl2A9v/KwHVS6ZhEckiQwogKDgJjAARTYxCFyVGUBV3RoWEcRi5ZOOGJr7vqGcu0k4uLJ78P/pK9fWWp6hXG5xcCSlieyHro3lRzCS3WVHzWzHUPeZy0U0Mb4zPNKNt3we39gfKfQP2n6VMWYn4pmXTid7U9lr5l80O/mGJzDILw7ouWTfMDrZeMIfNHTUY41WUENOq6YVLiTnhmNM6THNG0tH6geT6f71U29/0yd9eDIWTQ3mk8U/dvyhSKp/btWuFSMvOJwFt+J9jcboaSjBI5/lCITLndSbAJIovF1aghS8AIyZKxwBIiCtOSqG9HaGwOYPHCNeM4Vd/t4x3dfCehZCujdqW0GfASUsqQK7vMPS3E5Emk707/VQtVJxe+9yRNiv09Zo3Q9CsoDeu82jbOP1qmY1MT0wYHgm9LToiB8jep8xZjBECnqHMgHjPW8InSFU1YWQwiRqDa4pRLEY4z9mLt3ff7CmTgDr4uw1kIMy7IPR1vBYys+YMMtW3VZwp3AL0fZV940WY5E0d4l8t6JEu02VG1y72q+G/JO75VuiRQwMl927brsbOR+9sVX0DuWPKdycNbxjTR544NzpF9oeI7qse5bQO3VaT92sY0I/5G8u5/D9pEbGjlBxtI48WDgZt+o5rvWcrYfjy6fmGrFMsme+wLX6ydErxclVG5u9tlpoXx4Zy/Xg2cjI7HQTaFvjEaHvdKvhRa4SgkLLoCCgIlxHoHJyK4tkBS4lPwuMRdjqUC47WChmZAA0bM3FsfjUhDJb1FTc72Y13aUYJnSNuoM7Ccqd8JeFRGokHfbEOXKnJ17YV7yV39A4UtRfWwi8tnXs0Nl8sn8wlBgPqVNBpmqFvkIkqHpfnOvxxgKB7IvCWo/pS0w/rl+ezmLsPbPH/+pU/sD8wHABo6XZKkP/Rqh4NBRPUsDjjwJ1uCP+DJgwILvCrRXX4O4V10Kk4K64hqq7eaT2/bxyIlOOuaxycGwvxcSDBypdhvmze9kmScYN33QlGIPx1ugQKpREJiy/RxZlXbKYFWAsxFbHRmKZQpp/n0hq565z6yacmqQyDfeTEQN2S1jK+Y2BbGXE9Hj8yDWWt3wcKerL7hL2H5YmmOdgZf6+Ya/h15ARcp3lR3syTAWEm65+jPXRCvRDtGXHd/pLALhjNCTZMhd5LpPLdoCfzVa2Sg3nEUWJRlifZertn27/FDMMBQ/iAqrMbxlK+6/afx3CLNrcmPRZ73yKGT7TUJ56O4VMn6G86lWeVz7KDQCCFtzN5vDl4IMYlFojAAoiAZ4HYoxOSReucWTEjpgmgBkzY7YlxvqqqoxTV6hUp4/i2ze2djpqc7wNb1NCkefGhZDdazziCTt6Z/nzHwzHNpDpeS/sskOP7Fq07+uzgwHowZ5On+3+DOYL2U7/GYFo1x4PmiGb0b4Xvan980wL+Q16UjEM1v6p9s+cssygjzA8fegdiu4zLWz/lmIIO7Cn3gkE+wDx7+hnoALzUG9VQp1VDWDEgFxWSMqlrSbDWQFF4evAuZ+vZoulUj7oLuJ3pNrp6dyPurUMV+8E6BaBcNwoZlL4bhl7erZA5p2HX1EeWJgcSBiISFwJ2won5KFmjEwzkEo7aaSBlLsFkcuX8CuFpKWKH02OtgZThVSe5fs8jIj5UmORaw7Ex2J2mHOuqYjW0EB7Znt7wl3T/zabo5+GU3Berqydv+44A0PobHjAY8AmMJVUJnTXxa3u2fD6CDRUGagXANHV3tkOqLiyKtx349rpY6uHD7Wa9crwYG9PKOj3qgqcwlOm8FmuvMX77UilIrL33ta3m9S75nNts/0m4151R7j5r9KZLEDlfmWHZNMvNj/+5nedPPaZt+ivvzeezSoaUe/Hnz3WvO0hk8hXH333Rs2874N91syMElgeQQVRjYyUb3yeH0fm7o8Y1432+i1OqL5sqNkbHx3tGZga/uTTr/3g+rHHX/1edVAnrpHCfQfCvW+/198TD96+OL+M5osulBevf4EX08hQ9Tm3nNJ7r52+hoJLOnvoUdaP2YnoxK+I/4BgEIDN0k/BGNRgX6vpRx8Y5DNuBsacFY+uMMmwTa+AMaouyZaOKtXGq2LG2OhQIZ+yUtb+mPh/QO3bZtrCrqEtjhRybFHfM9tv8oWC3BuRD2W5zKgODpovuMVvVKvf5Ezl0T6df7Na9YZe/c6QOTri8UWuRiI4Mnry1mqZbmGsSUgXFU5kKM+9CakpnmBP/2SjIa4/hw8+8F0CYFAAoC/Ss5CCUWhIzQKoqbgMKmhM1c5zgxQF1hEBzBUdGaM1IPLTKoCQcbw4NJgXU1PJgf6ElfKIbBeudTHQjSLJAXbuhGIWr8ooEg2F0DtaFUpa8qrwj/9mnLrPT+jNZxfRPz8eMRPe4luVq9+6iO8dymo3nj1xrXFT4vQdd9y8YazTZhP5akuPWOpEf9JC8qbs4NBYX+ZOC7FJ5XtKU5y+jGT/6X0RbH8FydlieG36SWjKvh6QFEJlE2R6YJeAaGubkTE3QiJ8daoxURrMpwaiTlrdzWrEPle3M7I1t8i4HxfOwWi39ku8u0Dfxv9C+E8/emzBjHFapQhxRBWVMUVDLTVyjafnVYv1+uKre/Ubxvs1Nsy0A2de+ZE/DxM++sYPZPUgnydimmf8FfsIibinWToUpGv2tf9u3zUYXCpNeBUixX/6wJln3mBHY0DSr2xC+NWGLBRbg4pKjLkKSl5KtLU8BJCIxyJilG1J9h6V/tvtsK7L8hnppR2W8u//o3yx4Vvy9y3f6/2vf7+I4/rK4rEzfYuDE8x3k3QO9v9FZeKRM+HYdMB1COJzv4dqYHT6LfO9Z28CdHH3x/RhqMKZ1mnwIKAHNoEzYpw2fQjAODDZbZCCdN6Lum6sgWGYKxoqinoWVNWvriJUJoYHs5m0C8BYxAr4fZrKFahiVeYtFHVfiJ+pyRQlgVbu6FBxVNKclPsqJXe1BL0WIzq4xONzI9RsktNrFZKHNs6lByxPk4r43CMXL9Ld1MOaSJ65A72nFvEhyk+H238RHho2OLa/G85njzSIUfs/iTVppKmo/6MqCvmPX2Mo/9XV+QNC52G5Dwtc13SubYIGHkPzyI0mg3TjvIqMKWugKOaKF92k4ttZZxqG4aHBQi6dCqfyWUv27f5d2WRHm+qWMpVdFhB3Dn7E/tRTjk9ocgOLs6buqZSS51t9M8Os2WTDM31Psh3JjZGZea/+DSpM2u2/sCcL9I1mJ4q+zo6IKDoBK60lB4lNosIBQWHLQExlpG5qqOrIFZWf31N2XfxFYPXw0qH55tzsTL06Wsymz6QMkTdybr3oFhJJkdxIi35/oG318HZke4dHqC4v5dKMSKCd4iPG0csmH3zPbZejVG2+cPkI8yvXtnoMZXfsqcyYHymMPrKY7utLLz4+OK/i6wK9n/BN9A45zHucOOPehcDY5PKJd9jR209eKCQwHzBoTywye+psNLyUue3p2zJL/QlWKzcZIjZvORljRH1Gx+/srIjFEqy3rgcdwqSHz5uGxqSnfV6Pyrl0tx3yu1Uk4ljBAKpbPi9BaWx0pCgdn+9Cva9XRK2wigSAi4LoXhRUujthAuI7N9ZOcbFS4gZfZ7/jqbCAgi/81Dts30XMXPR1n3T/bP/tRQmHsiwd//M/8v/P/Z5bRvT2N5uAEAfAd7g5ZqI1prm4VTlJVfTOgpOxg1yZYbrSWl5X2uT3CCtFenW4/Qu2efmyab/3PfJP9+e7Pyyxp4sMHhC/OALlVokQ3EqFgCpsKohI6wyJzBUA4Gc7KTxSsF5vOdluX9ZJzjuQqexgZqdRq9YFQX+239trHwgr+OpA4iO+cdMvEOG5BpW+8xPTj4475YXy5Vw/8ZZ/369+tePwr/3KbGC135yLF/RUsZjq+v2kkHY/nG6dbBXCjBgu+3TX7+tej9H1e8gyXb/b4WDAv+P3/bB/Yd+UzLjlifHSqHB9cqAnHrO3fO78YJ9bgp7tDQihWbqfBmgPuaCMqmnO96NAefr9B72hJ4xkqMdP2p333eVBnqiMPzZW8oRe8uYeM5vBX0I7MryDjPY/0Wtf3THBhbMePX9w4dPoooRQs8LZX2p2M9+jwhI9UGhlVXR7EoUYMzvbvGvgKp3qqJaSq7PInNRevbotdaNCjw4898tCYOepTzr+J8dr6umhfi82sa/978o2XNBYGL2gQue3lV7x2zW4tnU8iyYLIJm0DCYjZt7eSbccpSP8Xs11RDDg8xg6alueqEGtWhEuKHaCT4iYsNx/XA9sp15Je8LuHmkj1Qm3LsaZ7CTIhRdl0u4+wLT/837j4kX0cD2xtlmZW0voKupCKav9Z5aIRSu42PeoojsR/Vte2rI1n/699tX7Xv1703w7EqPo5HPvX2j/kaLrdKL9lfYXm7Ar4wxDqzVXQIk7g5OEna6pbLu2rJvyjMqe4pISGBOaRVyM+fco6K6WQ9T1ScclQU3tpm3Gdmn12OM6I7yEFw33npgnbCvMYv/1d11NFMbai4hPuvD5/fYfKJpCaCvYi77nvtMEcmtMP/0ExGHUXZHYIWc7S06DIsjcM2DdruP7GxK+fXZih5R9+cRNE74nn7YQA0du+2jB++QzQUqM4i/Xb72lPqJYL0glelIvsBR6zTAG3veEJ5vx3H/sAgafetSOX7P/SuHYsYOvric/XvB4Ch9P1l8NHaZFfyhs3QsjMNWqgwGcDL6hozS3W8fVTjbc2S/KpJL9YnyvNTwh8e5VE3siubyHMosgDecLe/iXDNp32iJo/+zHDvW/MusZmLin/5ZzF0v60ZXlU9Exv6mpxY6lSe29mEzURpdsjv/YpEuI7X9H1dsXn52L9/YAc0+H5YSlG3AdnIP3tgJHD5ChlxCMGhIwsQZaEAucEx7xgAwgSVd0Q9Pl+q+rnXCJYXTybnxlaxE5hGLVs/aj5hD55UR3dSmye95aK4Fw7ob1tdXlmalqOZuOOnbIa0ADG163E4046naulp4ujO/xeb2xGw2a63mR0dn2WQ5BKspbrX400rUoy4v3ov8qs7BXo1yfFfWED2bMMDLEQHos34FJ9l2XIx3w9I/f7Y1EArnD3v8YX5kojvekhioaat5quln2ot8zo/iumMneRm005LcqpyI+nQ72HFJMhaG6Bab1i54OxE4cvqvCe716j+6h5Vy8r7rw6Mb9Ga6awVj/vB9Nz9JbJkYeaocTiUxK4k2cqzkj8LYPjsNa67oo6j5ZBXXSVWFqH+iqT9/w7qDP6LBIj4s+aWptHYRhNIHDw4cW98M+0fXNN2fLpaHBTCrV4ZTxvXjcBUdh2u6nS6bFS9cjW/St4BJPS4K2SG6TV5MP8RXht79N1plf/ovUIwcy6C1mplGl/QGF62po3I4TcmVE4VQrKM7TJY/G1eCY/8D0xbvS1+ZnDxx1rlWNbvLwrxRrYXUi12sjo0zLHJ+3qv2OwLyqmoVJDVuBsNVqhiaC/Co06frYVeT+05FxK7bVAzYFez0pe92I9K9krZwR3wQOjMOulSIVAVwjRuQSybEj83PFoWzaDsJJPKm5YOy2Q/kt6Lmg6lolYu+gNJN2kReJfE+iyriktjtbWjISwbXG7JLyXraw7rU3FnWd39zSehIkWSsRZ46taOi5cKI8WxjgT7HWdV4KFB800lcOaVTvDCI95Cia8sJKvbrcQxkM3XU4lZ1Z5FjisTgSsZ5PxxmRsON1E2MDo15KY+jcgt8eLF10cJRPELH42t2ME5JirR6VVhsCoK/TByAHh1c+mRYJIb5dt82VXfXcz0TgRwHEWwLc2PtmreXtVPiiW+HDDdmtOG7rJT97CGqm03w6mSGHPuA0PY5dtiZH3h6M/cLPx4JvH5m0yrbjaeJHvqqqX0FVvTWdMjk+95eyoFABuZlK36oCurFyxK2Dc63pIBqEy1trNb6ttRpzJxGx7TKYTUtJIzkRDqYogtgpeNJxW0DfxaydyNaBBPGQOkUQjTdd/vlrCipu02s0Vlc+GUe8SM8KKX/nD/QLV+6szGm//9tS6L/+W8++qdcaf/yHLq+++i22IqTOQaNV7UdCXFYQliRxlEaXxFHhruDdpRgxMheVAjvZcMor5e1KxlRV0zISomxHXIlQlyTSceeeDZEsHr/Yr/OKqvdffHzDG37yqZB5/bmbfL6yc+56V9b2b39rQYJv4VtYk8L+7V8leu+b+GuXacSufkt5lZD1OCy1Dq7MTicUKa7fNHSFI7pcyusRltalvG6VcAU+DsePHRHp5+CBBZl95OJYbC5uPWy5wu9wV+Ynp7uCKNM0CUz4Ke26oLpXq7QTbjTyhT0PyiHhEPbG8PP1dKg3QNr6fYnZAa7zSNTQqe+JzVGVOHkMf0Qx+MBs4spZb+iRN8bN0dH3NJsRc+cO330LPesy3PYfHHr3MfJwUkxUVvFc+29fZDGhKnEPHXv3IRx3WVn7pve/v17oXuJ70bVUCoDtl3lbdgMzcc/ubmDtf+0GZJae2+4GxvI5tx/or7heT+3tBuZJlMU9/q5mdm411ZFZKLoTbcJsmrvOiIeij9wX8OxrbWyMTd5ytzf0qveGzMPTMy8aHfUGXn5f0Hj42hMBfzNx30Vv6JXiVS67ePTIkdExqegTL1s4/nqp8skTz6D889570bHX8h9yzbCxecedKLEdBmDXuB3c4dbiUFx3rZBFZcnbtYSLbmkIn1u3/OZODzkCog0WSVOw8IbUO2ztXU2t7Xa/q2Njj+aqbHjohvDb3i4K0d0vucsbftX7bEGFvWP29ddfn8t7QlcumPpdF++/W4j8p+//aSl50Frsf+yxx1yNnv6pP+msgADQ47KjkLsNKnKFFE6bQKgQXuquc8joRHR3B/2s00RUF3P1l6Q0UVzD4VTSLQO2G6DRaapsLU25e7xycSrp8hmoVDup0HGO+9CDHsWDvzByIRZjFPCZweOr6ViwMDBgYfvz7c8rXsL7lf1He15qIj6LQDwaRGz/8743Z7PojQZiMxdQl6tTOvGYpdAMohp/g6oTIDx0VcUcfR40GGzlAOB7t5AUdwsJQAzQRFLkarQYtTpd+0PP3H77t9l/zH33DXOw6+RYaM/JsaE0ydXhfHcFNRSKRmQmrUILLb9P40roNz6CGDJto/0g/Z4Z1sgYa/e2bzHMsI3sQ25WVOHndiSUAgETIiK6IuIaIOFeCcMd/mLFn3nmdvrU3Hdjc+wSIDxAOv4C/Rj4Qf0MRxwXpUhU650jwg+8j96TRjY7Pz/LME3TL8UX04RMohNSHbj6y9S8+vX//XyeI+obNecqFQCC5NVv0xj+KlRgH/xhKxBFhc0VSSWOmsq65zcmQGHElNuBVEbqpa2F6Jg8kgHrqJNL4DQNznauYTXRqcblzkTa/P+Y2Sr96Ek6due4Z6fiKA8qRBEa9bGRbLq/N2JbAUODCpYNwYRS6TEqdHe1JY4rnf2ijMB4J3d33R5xRK3sbH/m7IiEvGCHEuD4pWRm0Gbe+tnl2yeKxx4OjdczYR7IpQZytHH24VlH5+jP2oaXtR8rNqf8pLMbJwaZJxb2VA9OZ2ZCKdWeqrFoZKCQ7ZsqNaMJf+amF/jRiMQ4vWhgNOEoYbxbG+iXvugTvrhe+D8Bo/CClo8jx3QqyFRO3XYn5Qaxhm4U7z0Y0y1hiVbuB49hzN8ZCO64tZZDMJgf6OuJ2aGAqauQoIQuLBYui/pmuXvBjsspZKG2gpI711DaTnO2SXatmsTPorp4+pYX8Ycvnj7gRAYGiE+Y+J7o0ZkJXU3kQ9GROU2lZ/X2Pw/df7t22/NmemOIozjKrWb7I42i9hUt7dPGBhNLx11W9G38O4HFIjy/5RlCDiFEoi4Is8CBgAsQIhBe2ubAAhaILk2KM1d9dxht/shxa60wQi6bGohHA6ZHgyIWJXHGLh2uSNK09xxtd59w68RyJo+FhVK+HO41Zvq4bjtMU+JLpZEzczc19z//07lW3uRBfM21J1evDWj7fAoxgzwHegNDsw/eNnPwQiqbS8ZDBAR54fPz9GOSCcq//ZFBVRHxh2oYSWPLwDms6R1fdptU4cutBUU3DLqXtMpgZmp0ZKiQTkadoM+jwzAbljGA8pynFZRaOXYmLZSp1XZU6mzy1aqug8PdblRaobM20cBzuL6uul61n7LR01p602RUC26sGolTs/Lx/MQhTctGoyb5/X2lxTGNnlUUsXjy+9waGFAjES33golmJLN4nRdz585Jv39ygrhjL7RGB8eCvXWjm4Xw8/grUIAJeP5nB1HlW6ec8hoCUxgom6ACA5WdB85dFAtDKAqud5JA4kcMjO0eKICPMCE2CNMDiZgV0FUoYEHvdvD29+4Jdx4Jfr29UlMvdI+FORX8/ZDpNB64+GSATs+fGdYPFac9ytvf1jyoemvpgMo9896ziZI3yH7/Sc0b6Dt2x3ow/LzWGHoGpy9YKhlHV1TMhoJe/uoH4nZP1QSEQQD8FfoZGIHHfyxjkqptmWEEVE3R1NtB07rb5Ia7QKijRIQHO50Dsm4OHe0MVzb/T+PXWpEtFjM06GSdRXcd1/yeddxaY+cvpWyHQdqlAN1V8qr5krv9xsH9+5GCl45STJ2ORQanB/1sqMrx8sXrJOFqNWdmPNPzKrJkPD2Qzw0krHKBT9Wb7V9oAijQf7VBY/jrsALH4Sa4Ak+1gn0BUuEkklrmxERQdM62VUEDpmhso1NKsHsWZ/tSUfR1D+p6RLZRrg16uLDM+PY0Rbw1FL0zH7rTXZjEdk9Za8VuPX/3Xeev3Hrl7JlrT+xfmBabr7lM0SsP27uH+rfxEt11flCe19VkMPVr3dPi3dSyvYaW3ApArIh+W8unpSW3j/aGC+nMzjEEt5+/JRPT9MJw4+Lhcd9YI+zP9kbCPQrXiRGPExlCK040PHllYUyLhNXT5/XZ/NH8gfYfHcijiFB8TEPG3up5hYEhZ/Cgh9hAMloS6+mpiZVzw+FoPDBSGst4tMLUdKEWUzNqeMjps62QiogaMT83NdMX0OdytajPZ/dzEo9DI2sjycnJgRE/d7IaPoE4Xa9reW89GK77kwPt96LqEzUvbztRr8R3DoDuEdluEk62rlGRBL7BNGHd30lxmtYtVz5dZURMth9c4S5VJWjUZIcxKkEqklxC7DlEHTscsnwemKTJwFbxctyFjs5ipbPTTEgLboXuztNuZRuUdQz1wZO+2OKSl/CgYW5eElBGFk1Uljzygf/SPeKBzHiinL3vfUbZ+n/dvQeA28aVMIw3BR0gARKsy04ut3ILl9xObZG00qrLKpYt25Il25JtxYqKe4vjmh478aWdz+m+9O5c+jntS71+l34tPZercfpS/wyA5XJlWVb+/v+ivSQGQ/C9Nw9vXgcaHNMeepAr4Pc+KGXTjQHlecf4EZhgMjkneNkZ0ImeFFQhJzRmJi0gC8uZYwFXeLMbkksy0XWLUXCT4Q0tm3bDaMzS0nJGLpzngci28mGJC/TVmHEkNvhFxIlLLhEbsn7NMYMjEI/r6MrlHJ17CGnezmF85NVEFxsCOvNnZ8bAdiGsCLfPqF1AxCxQsrzrlgXC7b8jbVCLItonuVALlLqGRIJvvF18pkjo8fNPdfdeXeMBVlZtGdYqeiWcl8/Gr9oKfLUqQ6WqdyPUKojhemQZ10+JQGhw6vTErnIm1R3EqjYeQBJl+1cb1nLzSzNmOLJppJLu7syEOtBm+6t/pxDqWk0pQUCbGE9O8oh/dzlGCQVYHOrrwOKCoOssGOEypx/Hc7HRFBlTKl6qSsiN9yNhYoxFYiq9PSUeCE0nE044yHhXloRJNGmuqFXPjIBF2u1dpuefgzldJevISEYJXCslTEcDcc+kPjF2fIOsX3qtrQQCY+NRZ51sXHetKS8zaHPjrl4v9jWoDC68wmXLBVbb8bw2BvX3m36Ge4RHSrkg3Ocpjn51E0a+ZuGEAqahM7QlkQoRHPE0xdVs6EPby/UFdv8cu95Yvl0IWXpw9e8yOYDfA0+xWP2xmWsJ4DAsmiDLwqUIHOyK4nB45SAUMBSJ8u3LtoJuXFp2bxQQdmzbtMii9uvWspDk1AQzUoeH3KB0Z3ElGB00ZZGn3kc4zJzsy5mh5xcSFzTKRcf7QURrbrgmo6mj165fXJEVLeFxfmkCH5N3o4vGLRFpC88iUFYfvepVLRqiGxgN6zx6T0ASqBc/lCS2B5rIpaJh+J/PKVKB5Uq55OIh/NKy0GE0DqiyUId6YJli0XaBesFUgc5DFyJOGQF6e9aEfWl6bnQ9HfF3KM10xLBQ5pa2u9cTb6/HeFm9Q0IuG4vomhBGISqGVwq22tsc+AVb7n7sht1HOkExu6TH+o3R/vHPjR8embhevCk5152KBDSz48YOU1Phc2Df11NqHEp2dk7etW/NOg125x1rcnG+YeXzVmN+Zty14Jhjn61JUagKV8zsp6AIvT1IlW1AKtPmFYUth+YtjSyvfFZVzy7b1JasYBOGzEB/F3MrMU5OxDkSoaDJVqaIinprs/NKRDwNo/zMdaDLJlt1uGWvIXl+1+EbZ+avXzuurFqIu5KF9f2y2L2mXKiwVemmxTu/PDOTF9/G1+Hpp9k6LCZ7pf+SRjLDVx5ybZcGOsiwTTN7df3MPLdVZYVnQyCOKlyKgO/lXAlzN4Sz0ctmyqVMf7bP9b1HOvMac76XVqoxvESb+ioZUx4erbWFLeD13VOVK2dmThwMZIILA8yoHltmtdt3DNHAeGdjor+b9MSjjcmjV59WkT6k5LqWPsbx+cCO92iFwSs3r7tMB28XgI8xXHr4Pl2gSJSKIIgMEVGUmM9BkoI8e2P542r5GM4VOQ6poMJUZsHL2PUy7J1nrkh1lN9PrgCCVzVKEpbVWRX2qsbtx/x1wO+mUHxVJgilcsoKYkTCd8r797buBblYXOgJJzsYwNx6hMeYxbzA964wECgCJjpIuA5UIIuu3YPA1Wgxbn3kNoEIlMY3cdPS/0yZOJibmRirVXlmYSwSsoQFWFDceiUOuvdq6bpM9rfHkmpeoJKNeLeb6zhww58jy8mJkR8eNoNBoz7fsaBDpOu2asUOKSpuRY/wSP9VVXoVvSqBPrq5lIyo/ByoIYcQ0ZyqNNgWJIqKbhQaVOvJNyxFRjh4SdCNGGXytUQYbBS7RA2/qiNgIGwft0V2vr+bUck58zu4E93Gdrvjm96XZlpNxXP/EYQRwcdFcL10nFf5RzcMGWylW8a51dC96guCxGbtbX1t1VweTAqXnU7LstxgEsvp8yIxviLfKvyXJL8yuOYOv6nx4hcDRmaHIoX1BhKrnUb8thhdJMyp3ImOmZ9uvPzVCpAkUXq6s/mSVKppeLf9yEPVaPRiDlyJ+RH4bjDN4x11IKgf2J9FyesNIyPfJvIW260Z9j9SJmamJli+Ymcxz/bMhKkJ02iar3uIt93w19T1A/Piy9qIz8ejTniVS8FX1waQvwFcfjmIAJJqFgPFugoEOGt/gf+B0GtCoPX1hbKbLzIQIGmA7QGEvP/DkqUTsTeL9BkkJoLHOK8/+aTrRshktLJEu0e0e++WTVdrS5xZQmuBW8rdM519CYKFDZKIMdc9KfGwde/NmGUVYuWQl7vTijSI7n9edH51TCJSHam7znl4pbFjQRbX22QyXA3JtEKUUDU8Sez1sn7ouKEM1qr4GojF3L4IXfJ9/SdLnJVLJ/vvk7v4zXrjSfgBAi9u9ntcYrBu59G+8Xoa81DU9vlGHxE2aKosEcrBVkTqaju+J2/b1oV1czMcfCexKbxDPysAxeA3aV7M511bs2wihhH/tCrUEGVrtmok77CAoBdjO27uEuNcm6QzsUNx8FibUomEDREdjFZjIBpdmszOzUr6gesZwn19LG0KaXiNpFx8pS3H43A5RJKD44wCXNFs/KoBBHHoqYb+Z/yuKdAoVdkoJ8axY11D+6SExD8j8tPa3C3uKjqCgBYZZWaExZkFDQCxmEsmgPGGmQGCBUZ+inmpj8QjtcFNhq64C6ypnq94zbQbmBiq9IUKEUaoSMhNO60uq9P11YE3z6HVHnCSVoWbRjq5s5MN/Ktx2S5FOtCRKhTn1l8k6weP2EpHIQ+oWCjJ5n527oqRaTyzu7vbP7cdwizfx2a45XM9PTsu5lj29vR18/fpDXjH1eAFmyDSMexyRPTMmMu9o8LJGTsqIwVGa0hQ0GKuQ8dog2d75QQFBEE5IlGCue3B9TfkbkPyfkGWEzKvreZzQBGOP/ukfTNmdagzxJIuGYXyKiNQNMyZoH52WDJaX02dFc+nq/w5hV3JyGhRDlvjp9g9cPgGQ4lFj8ZSI4OSd6ccuR6KU/ni5oRYSMVLeO3VTgKP6P2lu5vuqv9gZM0p/uGH/4bnU9as6aQL2bjMuSDL/nwdeJ3M5csFo27s6shZoatge+gqyTzCfoTrfNNYZXmte74+WvR7UtRqy25dwU0CWY5tiaLj+D5RriP6wa1woTCof+YzRAPU/G3vWKRUlGgmA9YXv4g1dM9tWk8tOKXzERG9A8mIhHWEm28HELWhwWQIRPgyD6U4BoZ3PR4EGlgXjSGO8fozIvyaxYz2CptnNu4BEQZSCFO0KCCRioge51YYiAIw55TAayoOCZgQvFfwkmcw2UaE9Wtn1/T2FNmmqynCXrKXm2TQqmD1vbj8ja+sl3oUdP+2uhcMoCncOVKrtbb2Tib6ll+1kZH6FGL11vAOlJaTRJKsQzGKQJvN6wB6Ps/TJcW1dUuSSOyeRqeOAADJViwd7rBE0eoIp2OWzAej6OeASMiWgA5p+WvuFqfzFoBl9xTEMwJNlxBIdoigrli3+kCAZfnZJiEgRyxHkQHkPP+jOFZE5s4RO57IBh64hlHwBWckN+qmCdmZlKogfHZllywKGmheZVfZCrpKiyU+HlGQHHZU5Tcx+DZ8mzjx3y/G2ldkD5dEm0UEYj8QVAdMuBceEFDkFvCDIC5n/zMXIsZkr0AIDysQvO2iHevWToxVh1Is5d+W3MIMT4ntwJEwjzC5L19r8l9OOCx2IEdqu9lcN3PLN18ru3kdQT+fp74Vx1+wplt9NmojvbTmBSmCJftKvlxiMe+t16zGl6tmS4D+DXUlBx4IZJ+T1JnAA2p3rEtkBzKIg+7iFXpsvnr5aU6JVAmBbIfcOjvhyyx2c7GQ43WSaVeSmwoSNsQBFgTEKQaMfgiEvX4TEAG25XtKmEdD61E/2ODGxn1CcLvF3ZwZFb6lm6FsdzRf0EOEN9GR8tlEZ/txCvYiROxYQbewgtF6KRNd+Zzg1uMBFIXvMT+XJkR4RSQGDgUnWEDYXAyVvBrScKsLTSTqZluHecL+mYFsvjIlm9ljA3OVgWKmHz20ttJfmAgjtDVfqeSLfajfjb5Po0/BSSHMrVMKSNABEPK7GAkIueFYXqYkoC3FzkEP81yO35fLGd65Evv1XRS6oGxhhKSII6Hmz5o/i8LzkSHR5u9pOEyPHwc17HCcHkcxeAx9SggyCdoxExewABiuaCWlos3O3nJbKqoTbvFYlIdBPTPKNYHfHt97VVKqlrSO8XzxM7GiGESxiKHt1Az0wOioEcz0isiJdgaDHQbY0YQiioobUf8unkbfEMrC1My4YyGeMiFghE9wZQ/4kh8UgfsjdrM3QdrHU5clHokuC2WrFC4Uc0XeliTqtcaxWj1yGP1XtdGxvA973S45frMc0AIxebmNjvtWcDvlQAHc97e+1Qm1muk0v+u+cz6968wQfPrMr4SkUJjJLkfrDy17/hO88oidS8yO7XBTCdh2yJXcqB8JLEg1nkvn2kPfi0sDahdou17XU50IEJR5nWbXpqoABOPozNYAAajCQEALYb5WzILA/8VyM3YIFwsnZm4gwGw2IksykVhupKqounLcCSEpAKruF92ArBy0PQVon1u3HzQ1rv7sD1uGF7fZuVMQdl68c8+ui9hld2zf4vrC1s7OjNW5XyeSG0o4VqiQi7QFckbr9uhZtUUVcaWIikd6XOQKXgM9/lqpSqoVvHSckOV+gG7j5mt0eaTa+brOGXS7V4EkJ7NKwFHTWr8yV6xYUcNoNIasSnF6X66WzNkINaCP1VzteGKQ6ZPvK9TqC1wzuhxuvKxBxJ9TXpbUmI2IkogBoPkbEMVIrKI3v6HvNkT4uWLky0fDBPu1TD+/8UZowFGQXvhCbsM/ceb76O+RLVQZP+oDPXknKAsSr7n1rD6DR4ZCmzD4PSQM9klAJ91RFgT7SKLSbbead3pFPiv9N6RoW+eqsiutC3m/ZQAj4xNBjejk1KlTpzFWTAuhU+wfQpapYHz61KkTCsJiCpETbAIg+IVuY3Tq5En22daxTPn3qIx1G8Hpk6eeTyEtU/HEyVM3ISy4udCfwdNsb6oIa4QtvANABJAwPz2RIpw7FpMJJmcBYOGc6eiLG4YHu8t2kPCdsMzurxEXhZWyYq9yNhr2MWzlMOclYIac6DvKhrklEWIqsiAtW7LfrMTjgLKTmexg5R03HVhABMAIJCpV/eYIWQxmr3ls5wYL4QT0984FTw06ht2B3vAYSrEOJM0vQLJ37WuHTXkmDeUyRIfm1u85umv73g6AULQnTTbL218fz77gcie5LUpRD3qRpe8u7d+550Dp6V9AsPnP+64tNBMIG5FbChu494b5BkfQx5mF9ZSXeWIvAFESIJN+EBBeXARhIbl6cBFEgSzu86aPCjLBRMbHlwN/LgnJPi/ezj2qIqhenjJCrQMeaa2e95t8MqjLWS5uB8G46OWSr187VufB+qDpetUJRsJ22KJxf8tKyNVfo/a08ajLg21hkbrfCcjfutq6IVkWG+vMd772KuZZWrdODB7dXNVenGSivaLK9hF6Yv9IKpqLx7KWNGDLHaVMXmWA2KVYoquySwICSlB1vKBtY4M1OAahyxS7v1CIUqquf/n+q7IduXg2G4+GyUi0vnVvytFMmyKEI6mJgf71UvOfmt8HfndhHt/HaeanmmNx3SuED81ECcjCBCjyXt5ULoUwKQDF1A86jQuKrMnKEYEY2OD+Fk1AhoYOCpJgEMk4ZKpIlr1Ab2yTDhi3XFjJmQnvu9rxP/jLbFkSa+cvu3T7VpZ9vmntptk1nZ0ldgeMFN1kvtAIX4iVVna86+iqNBHugG3LFRmtuop1e7pRKS85rhsQwr4/lk/l/hP2vZnPPG8WiWsuu/KoSl7zGrpp68YYVS2H0kjtxJENpHp5Jf3iPK4uvtsBaiSihc4gT0PKdqLwdfLXk7Fmd2+hVigTEwNFj8YQXHloCNHKsassERnbtqzTqYiVYGZznfRq5ArdHM5VxXyXWdR0NzmpvO0OjUx055r/nC1FollF7owTUNeIrvR5HE+h3YyOMaEojMwM+Vl4bNMUAROEDwqEUrLX719A6DZdZz7rpB7TY/VinhfvAmdWnwh0VWuHthNw8VRv3/iact9E84zX5eFqYkeaw+P93dOTveU18B89U/xs46dM/ZG8Xg//0NUY7+9qTHg89jBKo14hy+TkBK8vUhBCwihglAwjwNjNVY4si0nC1789cgDC8GCpYDNdCrJu5ID7OF39Y0VzKkuSq6K4KESXWw+4ddeYrShf0PKIKEF+aKBQ6MnmlMMsnnDlUEkvFHqzuWMjC1+omnsTpirii3ff31FeMxMg1RJ8PjA5EQM0OirO3MXjCwqZnHSP5+/Yt2bnnKhM53dsyzoPv6z5SXPmeZdmFNg97WY4/xpugM8J4yxXTM0CAgyEIj9fpCQgoOAWDxCg5HnLuU9Br96V62NxJr6edV6sfZ6XLlUd7Oli+XUhQxPGYVxaaZnhChy/V5JY8HsOLt8nosMo5CeR1t0WC3zwS8NrERwEqisdYsakUlB0sKSFt9WGFxjnnjXs7JQH+2QVLYGtm0GxYzAoIhJMVBfc0d9DWA20j3Jt66IzT5Pj6KPCorBfeJsn4ucFwgAkIk8PUmRR4QJBViX5oKBpXlw3wKPUrY+qyvdSLrh13d9LGb1mz3eVfYJ/EZeExjmvwWgZZg16t8yztGkrlutycmP5OTeVnytZhXx7L1i3B1h1RVcrrzQoWK2t+WUKvjujCp2dXnyrlafHiNGDvvdvoxfFr3rL4Mby7n+MVrbWv//3OIEagLRCsitzcK46JuaDJpYbDRmbwbw4Vt26S9q8Pqg1lr6tDB3vbczvHts9PiJJkHa1LyrON/bdv3/rExaly6rb/s6kIv8cQAwGzEhWbX5DzUZMtjquKgfqlq2jFEKD+Uj2RQffd9FEYSDzqU/6u8NlbHfoFqaEdTySoYIqdeURZ2eBYoIpS2RSBUxVfFBXkCQtRzJkcJlUQy6XNqaBJ6Ova6yrVft7yiWe3OjYpi6LQjd0G373Kj9V5/yCXMSr2huP8v11RXoXT7880njnDQuyvPboucT1bevWXS4md8dVO7PpqhAFKRiDoiulxVuOjQ3cOSlJk88QzOvWwaOwmJ6/pDhxRWxkaiSRNzyRLAhw5hdnRuEt8FlhVLjmyXgsgEFYTgwrCCAQAchxVwhf7XcFPTs5o9g2i/33vHNOY66yYqmvXLfdTqZMurXd0W6nGc8q8x0Xq7UQz1qwR+vQLRvlUsyWpIAYJhIt1HfoNzpoeIhEtzvpdH5bXKrkY5koMdTeKLoSMJwO6riQKAQoImq8Mh/YxJjnS19Q5suqIlUMK1NNRZMpGpoX4X4l8H84S/qFCMPH0SNCmH07iPm3GyiDWGiDu8Z8H/rLqYhhdmZmFrBIDcCvQa/BgG5WDQox9g+ooSYw2rMHYbcrJ+qAf0dXPHfedYjZXdvhMdQxP8+/93P4FXwVPSVY3B8hg7DAVRJH2Mz+WmAhdwvy1T6eTObe2/BAR3dC3bg5FAY6XImYKnqqkkjZUqkrFgfaGI9QxANV7Mo72JVNnumuckvTvXAeRMc3bpjWL0lcbJzoSTqh8TEUDm3eqCbQrR19wbVrUTzWVZIsAYSr4RfwDTc/pIfViQex62WzATZg4GKWYQ0Q4HunrlIiRCBCPC/kaKu7NfdZsQP2g5AZ20irWujApGNN7a1ibT2am64olPXTXCDm1euoYndWecdYZAi/YJ4ao71jbFTYHA0iMeI1RGo19/rc4mA5jZXBSAgZg6VcnwTZUJ4nRkAVxdDQhfhG4Ll8IzDxhztHXI8Y6mIep4/8P+URQx9+Do/YfXAGfo6+zDijLKRcC/kjPgcmP8Q/HN334Xy2B3GeYT/Kae43SIyGPbWofdQd+ZjaSYvITIGMFXVQBmvkFSsj6Yo1AmfEKIY7aEYGFCoiCRLWcG9rqCvJDoVWVf4TQpbdo6oAg+doJOL1vPJrOtvbh0xzNwQC0PKZWnyu1t43hICkk32FjESWeL0MEsYEAd+HPsZQzgjyh1MJA6HB3lJY8mpcBNf8r7q15ZESp7soRauj+D6leah5JRbhNKE6SSSIgeEERs2nIjuV3puuff4/P193mzph9DqqIIRlsnRMIr/ufCS4+Rt/BiBgt4p8mmknUaGPwaA+WekvxgMID7J1f2bNOAel5O5GZ1WMUx5aZv8ztd853v/E84e1u98eV127+4+vYUY5aoy+Ih68YqeSuitRyCfuSinNOxufbzQ+j6wtl4D54pPdg/dcyuzrba7tvfskiTx699r+h7OSlH24f+3pb3w1n2f/CV6WGFpidOpi62G0rwcX+MuZ0vaqRDY/kgYp+/lX6NKl8E+YmhCPiArF/wSXava9f2wb/ZXNm9Hi5ko/WyOMrhBNCpjq8tKbsRst++pX0Fe+DA3e8VEQ0NfRm137Y4LRq7OUiLMLcck/knVG2B0SLviKUFZy4zhRRpecS5ucg8tuEJu/si3FSaor6G6CUSYDVA8362E7k7m2AXONRvNTb1UagDXcocIHtCT7AA0F/uqvAPDReg2wooxjSski/stP53LsvzPC97CqTCgEASDCPqj4e61OB08IqXPx8HmanuDa2W1O+hoNxq/up6WVOq8m8yXOsGtHELs2YF6X5T8SY7iVppHzb5Z8q4kQJwJnLL46w9W6FwVk4S/UzDQ/2vwgBrH4/Idhx+wjgBjeG5mcT3ASgbF9V+n0JSefJxGq3JtbsG09cO0r8BXlPoOfDjSfJgSIIuYP33Ng87sRtmIUuSohiNKeiyTywAslRVZOp2aCQYTkzr69Jvh44GlW8zzO8Cgg8PmfLaerbbgfw1LBNZElcSWdxm9ivdzbyuFzZugls5tvTGBJGzqQzM1fTLSKtj1MZ0pxAg+YkeZjUfMBIPHSDA1vZ6dQ35qtJw5JqCN+R1q9aCIoS0oUpI31Wfm1r3ITbV4rz9Y3ShBVJJkB2aJ4t1AX5hgHMoO0JyzglVWtcVhcb2B7/S0nt7uBM7iLLhZ+EnhphImTfNhVO9HB8HvezRqGmA9srtU2szfzrOPmj5Ae62OR5bQK0mDNBFDTPTkG5bWgTfef6J/W4NrGWYff/rVsDjOPhancPjEq418r5nCL4gyPnYziXQKsht9/uazjN0n1n8PShpM1ymH27qNWqLGlEfIFQi/w4FcXB26UwJJUTdbwrVK/AmjQtiIElhFEWB3sQwiUfulWosqaKllAb+7p6qHwgIuOEp94VZ1HrFTXr6SvF4tHBm1J++IXObrNE0BDFy8WpfU6QtQ2VR5IHH3ldFiSajX3PqkybDUmZ/dz/gKXv1b3sOCmaSvg6fcUb/lvvAInX3T4poJrhdWqrVCeGwnw77aluV17To9epgHW6l198fKQISJRRdAAO4jYja0BLXVIcvNhWeooUdAw262CNjuNVDbRGCrH6by+9mgXqytPZqauomYkMLd1eK4gAYiYatUgYAzXXIN4QpipzN59WVel9PGPlypdl909q5hhwk5ccw2fE6xqFIsAUkG5zLxq2/F1CV4dKPyGu96fW0utudWBv6lWBe9b5I4L/Ra5w//WBGwUnmaaT4bHWBJuz00TYAO/Huz108NB2JZJ5ZHoeFE3j+1aep0XvpbC/PjpwaITSuUviukEr3qoBzy1YUgx53tuvCgmItWQZGnluR7/Dz5RBAnPg41oxP3lcR6dxuAijoFjjoCjPlbPZZLxPGHow1noc4HBsY/yz/R8J6F7uODYqfwuJ4CwGLdSfQoGSEQ6B0B71jOPlQZdmu1yFIjpprOhS9PBqBbOPSz8/+qZYzxi2Q+fYlbBdmHXh03OmH4xUQQDEBEJFAQeC3Q2LZcLRQQq0JNnnUWeQ2x6vLe7sxh1FEnYDtslnjHXZpxU675kaLE0wzrqp+t6+ry4oun1Il/Vq480yGidt1u+O52P2VIg0ZOmIIGCwrlUfwCFkcKOaLonmcrnU8melAhWGJASUKkSCChUDShusoLEwORepTvzHU5OROEgpHCHPJPLFHokKzcjd+AUBMOFeiEcRJNzUjB//YmnHFl2njpxvW4bphyQIuIMDYa9rq51l2rrhQd53c6aNMLC3ZcjRUSLMogaKKqoHKKAscveQqhVb+fwqId6qaCqCXXzg/ffctN1R68+vHf34sZ1c/WRnnIh54RsfdkoTWMuUmsjq2jGs/Rb/e49dZhL5OUYCBfRfiyu0x7xdq0RLqRXriCFly8R9vXpsOOSfcVTP+JdIz9TTMpmQA7RmEgsn9wWEWP90Y5iPiXa/WeP22IqD4V6TwdByIi4JyIGQqSjN5EsFDoSzzzRk+iA7yYLiGIF6Qghsa+azeR7pGC22ieyY91hi1oI+6cafLEy/plwoTkxkXMMN8kjM97g38qMZ9zEG8PJTeRbp9LuIqdb57iYZrKPfN59DktBqAnJmRhBiJudFCPveSwx9nJEMXGOZ7KUzj1yvue2wI/Pf7z6uS7d5zkSgEGcg02oKjirKve7XH9AyBMoqOU3dU2S/yyPYOlzSJXJJMH3kkAPQdXhnKrbzbtFK4Yx0uH9Ul7jcnnpXxCc+Uf0N0KOe4S4FopHWmpCWxUS1+28DIVc558G9IAhBsthPVgphXXD0gky3vWuaBROhNFH1JBiFC3NNnXJKjEGNzWCTFDCtpHkwPef+TW6h8nTK9jvJbkOFuGXD41yu8mN1zHngydGPBqHJS/d09sNn6m71KvLoy0XRisC6I7d0pddqO49wlN9DFWXQZcRicxuNG1sPfm/ZIsSZWxzKXQIaZUgBiMSTgd8z7sdWlfSlVK6FpgKx+u9hTBuIEVOODqkvjofAABs0hSmGJOAODefW2dbWO4lzj47OHFjr00lDULpAe6Wl618eUJEgcRwqPjHo4kYizTSX4kRT7b8GqeZbJkXHmY2+NF1Y9wGD3GXgl8qmUF+IsIy6jzdeFn3d8nQntXW6tQZaoubeuPllkt3VaC7pfVyakejaeTqvC2vryeVfwsGJQG8cWvfTF5WQ2siDkaUN8m1EztoUb11Jpoc1NK54fUqQurhtQFRxPr+F5soN3A5+Wz92gH1cNpgZ8JRBYGe3GDTfNAergS6q6nh8pV7naEraqlMKiCBhDdv0lNVluAdKWhgFSvECBp9Y6EE+iSAXEkOxikBiWoqRtxbGugg0BPsGJSjG4cZR+r1BXbWChF85UY5OTm8MQjN/1UHbdiJiIQiqgf0JLImYsFAOKQm+hvlmKlQfbao65incWEESErEO9IBRoZq2NEVKxKKFnsFdObMmZ+7O8CcsJWt0uLa6RhbpVGxIHq6iXtzeHRfrcMFkFtK7nnYG9ilfIvu4Nl1Ev/KVTNAJRxBLOcsEghao3vyBaJOB5FkjfTtTmAFgDqRiZ0gYUZaohhIbszMDBT6ApB0ImEnWdAOJ+VTdYQgxc6jaMIMyf3zm4beui4pwbQWy8bXb5/bm7BqRWooKJFcBxLCgIhuS8FSMZmdg6ViT++BF2vPvzojIGHDmQr6e/iasEs4wPC9dPdIjnuGhluPbfFDXv7TQVbdfeURtvnUGD2WVQH/HOc8jzgrXMmmYK9Xl8uZ8JJSFCG5tKEUDJobbjzWWUzCwEBIMqe6NSskN3QAMSrGDq/XcRATqhTrSN5+w+59M5cEJTH20iMDE09EM3ijqIt/UgiHQCxsyM9OdsxckR3Mi1CrpYuhTG1BxcjaSRw9hoemg+WBqz6oI13SuK1yf5Xq+tHR3tpAPFuIXXpjvTLf/PPxDk3aPZmLc5dlz5n/xGPoi8LLhDcxqrz2Fddt4VzgbrU8oB3lmLlZJKN1L7bN//i1Ohxp9z7020+zY07E0ZaK1OZf9MlporBbTsK+4Epir57EdSgXPPbyCC4tyzxWmwBld1XcSjU/kbJzMiNTUQEC2AExgkNVS5IZFZRAKp5RQynTontTRSSSHiIiTBREQE9VNk3sGYuVNz5A02KE0PrFknhSBduQZBCzyaRZNMtD6YwyNKeCcQSkRmyguNgdJURWTYOidIPa6d0ZGoaDR3QgWmfH7WJWQmGIYEOiZRkTOpbujsd33fxEpNyTMgOhTDIz9Ef9GZMiRINhhEzN6c10FKr99c1rY4GMCAgf+hMiUbKGgiShYydoKRuNOSrVk3mkrR0iX5LI0Jh855qoU3SSoJiSht3ILrzuuGT0aFObewED4CCqLnuQ7mR70J1sD5ppWcbuKpHqKOdf17/CqeqfWO6X7lGde0MdSXQJHW15+vmr2C5kWzKWr7qf8dD2pBX+Be83jhIkigC4SKACgDpoWVVERxFFEZECxbGyLIEiRhRJIhgRMYaUbSb2ZiD2LbH5TUBUwkq2S0bIXEe3LGIuTAM1FSVCRKH6kIqQjDcbWCEh9CEkKupshvwUI4XcpiOwOpMDHVZK0pGYI4iFk9V8T8rqCDgEI9u5V5GmR7X0MJsh4uBshv4g0zUQ0+2OQoeYIAMyIBwKU8Su7XRltFDEjNa3BBES8URdTw13eLv+zJn/IFNIFEqM4h0a99m5+Q88/VPkDNxyI3gSNOKKSYmSsuM0r2xeeV1EVCM2EWn4potN8+KbwlTEoYgqhiaKQXgM4rodleCS54dMQNjedXOUmAaJ3rzLIgjM0EXryyowGMwza9AQW/VBBkPZgkHXXvGNXW51VFsL3Up0wxb/gC0OTU6TKbG33+EAAkzYS6UkfusOi1BZM8tXNlTQ7YgM6szBMrxEDzgim31qG5IxQYCQZGw/ESJUdAK6UdioN9/UfFMkApfD5frGgsEpNMsoNI1EYYBBVzSAS5bRXMllqpZHyuMqk7oSlefmcuD5rNkI/DE8FsqNRoiGilikodO7bQBAiGKKdp8OUclxyZWMM3IeivzO1sEozrE5GuUk23mrI8qIZ1tiQODcutOmLuFSDsgu5Rou5foYbHndhc3PEXQzy/l7qD1bUBR9ZcQF3+T0OTijIjkSkjCojSvLJqeltePWOA6qEnHu2G4TusWjDKPJfjGEgqT5xuabOHE8UoZObI+o+rZTbKLI+cmn1gKDqAc4P7WYJpobdX+2Pno+mp2L8WCqxVR/CrveEcpNB122Ox85l/Y9kzfRCtsxKm/cHjLPT+NzMK7Aqd58mlH9jLCR4Tist/Mr/2/4GcwqWdGzF0FsLUKttWJtvHxbjEi2eBYXr14gItoSid+2jdHdX0aXwf+utSqGIpurWPt9zcfft2rdTFlZzfzoM/y8u4oNJhX+VphkGHZz24P6uAgFJ+L4aLgIjCyniy0/GI698bMFV2PlOgiZsgxRJP+y9CACUtBFRSRRQFKuqlqitDB/aKtmm6a5/8bY8xL3f35h85t6uqU3mxaGz6IsJjhU2rMxzt4hjIlqrtl8YGOA2jg3rpqara7DV0ROvWN67qXFguxCvYZMM6inGdRRAQZbz86pC6OjK0+lG217iJ1ny0d9/1WrkjQP7Ohyw5IlGNgPI6nb4mtnOqYIiohEErUdh9fNSaKlVnMSgihhGOmOQkVYWvN6Qv48aGiqBGQbKPFrk3pRFr0uKBM5bNPApss3rzFVgsNcUsX7qtGeSnTpT+4H5EmaLIP/I8KUT/VWxq9QLY/UfBZzmcuH2gn78deWe7BariA3Fts5y7tn4e+jm85F9dnD23VJDrSTvbtHQn/k0n3pnzjdO/dsOAfdJ5Rz0n0F7ginu58gAKIgSdGVwOEKsDWfbbzbu2X5SMCOSNpkdG/+1f7mV1t0NwOypO08J9kJQl94WBXRRyxO9+bvtzV/FT8KHuEVzXw2unczgx8dvlNCbRJ+gu8/QV/riDoXKuTzPFeHIzerOEETbrpwef8IYKBsZ5bhHZHIKy9U8MMrIhFf0j7FoK4xqHMcalh+alzhObfvXL2l8pC+NXtFY3sNX8B2/lh3XXcaefgN2dyI2d2T59/ZcVcpHuikuCPt0/jPGbSzDNqSyWnMlO8LpXDLfq5Xfdlzx2gXvOEP2Fihsi2oi8bO0Vx+KqrDtYU+dKHkHirGs1G7dwJ3JDHtDLha6ndcnSnH+Z22dCY3Ot+gLVvTo7WvKznNEDIAAcUifvkiF/IOlbCU71ujwjt9PQlIiEgUYfZafJVFkSjLidGNIzIs62kQd3/TFFb0tKhvuxY8X0JFdAOs7k/ubu5WZ3rzEpaoQ01ZXnw5FjEFBBqGn/s/Kdc3jCZkWRTtVy26P0wlYlFPGjEs+V3Bsx1S+rLe44lIhp/nikrjsLsinqrzDninuqaP/aKObf6LGx7B3GwxUDPcdFzdRh7ZOJowJRDth7cggjBnNQIgL2sOPoaWp/t7XT/FsIlWMr5c8o4uVyT9DH5KNCBIwY9skGWTekTtnVEZ9nuiEEWIhKjIlXO05WFbdCm6oS6D7PheHn7nf53hOMcsx4FcSudenvPjSc9H+OckAv7hc67MZ89Dp1edf9U4Ff+aYVRw77MKp6Kw4vbgUHvA8wPPpRTlY3yoDRv/5fv64KOyFaFEzXSrsNGtaGq+uvmo2V2Lu091H+8LwLVwHR/+SPNJuTenUjFCDVnZ/OLxyTRGinXdh2ooQ2QZRGt0QAMsObYGWiZhAiAMHXnVfSgeKENTlqqIwQc3pgKiTLAm4dhDl3Gc0sw+eJztL2s5Tpz3ab5sccXKvb+ssNvPzNterGCBD7p7+Sq/j2/2uZiV8/xJDPAXIU0tpkWM00WVAgAhVHFkBJh0NrpUQwSEM47x9jlRN+imz2QwAtFQuxqdEiD5z6PoNr17RCF0pFtvxt9AAGGMQjJ0QBbjbC6MiImKhAQU+coPm+ZX9wcIKSKToHAuK/ICBDm0vFpT/mrldGjjPS/Jx9clfaHXfhP4twD76z5F3a32KbOhmShbpI1qd0ZDiDMFW4jah64LKoDTLzk6XFRkg0ZEquZ65eaTzSejUb52Zv84EglC8Vq32Xy0+SgbDAZAGxi1JYUgMXjZQzEsaRTJYuHo8JqgqKjW1JACatgyQC0kwXXVJzJsUb3VarirtYPb8CUuqRoSXwEruBzTdlfCfZkkX8HL/DbiawLRYd94YS/H4gPuLQ/vB4wwJlTEfJUI7Rvu0b1VemSnowLFVFRF9hdUZ+cj3nLpPcN9CiA5asgEUGu10Z+AiLighZDc/H6T6TuFZMRdMUwDCy/rTGJDlDCWRAMnO1+2EKDYXbtIsiBBFjrkMGILH3ywGW+xgICEAbaWW9la7nR9c5ft6QLErR9vH5ByywJlOOL7cqPtq9oSbC254t+HFcr2FMLPAV9gz4eUY3fl9ThPDBIc0eAftYjlyOwgr8hAmbn93jBCBoYj2+ZLksJn0UTIkZs52QklqDtPKs1vOwKiZwGLWEHvvSSCTk72aUvvpT3zemkW7ZjoQzluHQ/PBwIdmVzckJAYxKqO37RGooSqEkBpcXZHQGRzggPZpKomswNBPiuwY3axBBgwpphQwj7Amjf1N7+b71QI84o59eE4l71pZkU97lpRlzJ67d7s06s63E6eQueK/TTaFmTItzV9iSwbT1Jb8Dba6UuHaMRjHwsuJpgw8OCKzxAiIlFzrkwYAEa6OBXS2DEhTx2UbOngU62zprly7jNXiLuNCUI6CprW0SuKhZiGlhBBKrx/AWESsaiMqiHlweZ/Pqg4dgbJ1IoQjDY8qapPbmibgLLtp9d/wPigvkDErpy2dKuWHBWVvqiG7mfUgTP/ie5yY/VFRp1CKmKilj3A8M35BqUkCp7gw5gW8tznOwoBTZZls1SBi7uLqm4bNqDmd6lsmDJ55GH4i1e+IlfesBG9RrcQie+65oqtcSesK0vHqSwTWITF/4bFfW96M1+hqTP/gV6JviDUhE0MhrWjvWnk6vZRN53fe/Rwq7Nk29NEWqu0krOC3Zwi/4Es+bKfNwXPq01FQQcFL8ys6daprAeGM9EssQ9vCXTL15yyunZcdLcYvmGipsUv3r720pmBWCAm0RmIz3dacjDswNe7emBErfQ0Zrp13YzmBlIRRV+3V4LAnceG17750v0a46iFXPno3FTz8XUD0a7pUjh1cRSxjSJz0UWuLgeowehc4Dajq/vz2y1X80Jqbp6lJUo5vxSYI7QDIRGpAK/9u7+LhumPf2QTajUHePHvO772NWLDpVQmIqJwBtx6ICW4dLstejXAAnKztipnnkRBxvlTwjbhEMvaOrhjsZEQsG+veoWb/u7rPx+j5TwQ3afsr8Q3mZQocDEaag86MYYPMY5YfuLIiOf8r5VF6U+0sKoiKdSbcTKJgzPlnEEopVJID6mIApKK4fLkpqGJrgwWEcIE8S5Qj8TErnGqEsCAypVdSDvZUSrWVDYAiACUKxstXcxkEAkNPvS8QzeO9NdUbLB/Fh+WApQgkunf9tYH316Iqgg0g4RFjaBv4Xq5/qIrDqhJRTn5YhBAWXpftDeb3GP/ONgXRRQDOvFSngt75seY944PCR2MB2NhFfkaGiOBwP0MjFaIVTeVo2lcHrZHxxQ8qTRfJFK1ror0k/svg/8KDF49D/AvGL2Rawl06TKZEkIl2P3EE4BuSl78ZzdjeJ0kgHDwzDvQY2iTMMb9OqLnTRsd5u3MXMHji2pO5eWRldZSUX/E8zIc/Ph9UBxPPo/YkRM3SjFt8w1h+RdPs6OnfyHb+2fSTvz0CXZ03a3RI2/o0H734Cc08CrCAQgOXbOQ0pF3jPRU42BMw8RXm0jg3oPdbha3D+vEirZcHV69rfh1696u6955yyN+ehh/8ZFT9Pobo8/fvcdEyNx92QuVG65l3HzitBTTN3G4f8GOfrEM96kTUbQRkcD23aeC4Yh5etclCoDCfhK7oB9Zz0D3jldA5zeCC7PwXZyCuKAzmKnA6dtec3cTL65bgAVGl++uVNJ5WlIKT6O40M3vUd8yOKsGX3IjL6zUgt247WX7u/ynMvvF+OwNKV0K+MX67A1F0apafHjzW2go8pa3+jgVfNhbXfqDPG+WwwCe+EVehH+0LsBn5bBpA/zp/7IV2wgBgrvRt8JMtDavanZUbNs08Fvbr2TzrGUEg/8HmvwLwHbPDngaviFsZVfblONwScP1dmej5MlndyPlotl1PfJ83LzvDPZ3zJYz0t1P3cAzvwjsdKB/0lAkJxXBgf41d0Y6HFGx+8cp1VC6M400SldNWNMfwG1zIOWEsvDeF+b7FFwIpzQQA9F+rSNcAD3f09Exq1qxmKXMdXS0T4gGRGifE4xHXWuN4dqEbzFZkGSyIBExAPkRorNKJchIZ14MR4Y/OFxBOj4wMXNob9C5cnoG7t7zml27XwNPxWBi8ujlxwNocvLoK7/7mj17XrNHgJXr85UBOPe1n3HN1Rfja7L1zGb8HTzixVQszufLVGaXCgkrvuCw4CotFcSNluukiCi9NqhS9DGoP+QQRQ3asPQjLFsWhWuPQjDc9YGIpBDpapWg5p+gzNNFSbFMiuH3m7EMFL78Jc1IcjrNstyFBqvKqrv79uxYb5bv237iRStZf5iXTBV8D/VyXMDv7sK3Hc9w4o+yXc4Obj12HzfkaEK5fJ1Vb2w0Q5YIaigQOH1xNKiJEzsrg5tvsEXJumwtkfQndmubLst1Faxm59CMOjw/OaxEoir/ZhLuxSh4eZSK63abGJfLiGyORE15a9a+cmNiLjW3T4NbzEMJVTxZlndMrrk4gPzpvEkrx5FMweeELqEh7GJ76MaZ8f4wYL5m/p7ZHrNtx3JZb+TPVfZp0vaArtLKRurjy6d9t9zz9iNBae+xQnrDzEYLUODuS6/eWenxhhYbbKjSg49vrQfVnvKOWQlqxsL6QLC6JagspZXQ2EUq2lqoWOEju8VRbRGeNG4JyVfFpMroFXI0rew+xjIo/IEDUnT79NhnGvsVFEhfJKOGucXEta7IW9DcgOQcrESwdZ2ISUPbzjltVBDQW9CXXcloc4la5ajVWn/qILis5rrsTSThaM4/WAgCACAVopDWsaypGNY/NLv0H6AZakDRACGE3T9IDEADNhJNQdQQKWx/bLH5j6BoSFYNSWjveMRgEBkMF9LXCAmvPCPDe9i3TCHHeDRta4DYN/3l8e2/amsRraC/dl9Twwrl1rocsbW3aBIVZUmlCLEx2VH/OYpEjbIf+hYNQ8TGCEuq2uxt9qiaiKKejwl9Cu0XMgzWkLISIRA8e1NoBW3AJJJ4hWlBFAJICRgSgkAUbENVUfOXo4dr3UEkBy1DRP3IRAqS0NL/VBA1bRkhuPapq3ekkOzJ+v9s/V7M9+gzhKBur4hooZWiASOdM1ZCAVBrL11PVNWwIdr8LwQiUMWUleY/A5oybQWWzlwN9gNEtk2K+pf+GwEBJCtoBMjKb17qxit1fz1YBgJn5WWfAhcBYSfsOL5M4xLIFw4s7OEoQCBx09oF+/b3xYDwnVBBIG67fubWDWMSICUY+1J68IUmgiv6O3ZfBChwvRgcTH8pFqJ//jlxYDY5UBoVP/fnNNROAR6hjGtubCDqhHm43t+JuHJaY6/l9JxopO2B4OhxF5jIu//tXVHgikSIg6K86vDNiy4k6NJlULbtu3g7h0QKMEiIE+agrFsYXAVJP7qZZYmsYZDUIwwSN/HS8X/Nd020EmH4OTdbs9ZKWPP/5JeDdl/tTLF16XBCpiwr4REdmQuDuXhPl4zLmXTX6pNmPDu2sb/HPdUz0Q22EyyEqvs//U91sbYzqNUHA062q7v9xPxMdgzXhk027kIvHMNT8IBb6yS5ulMrp7clvWrevR5uT0RzxD2KceX6oDJQy6+ZTg/0z+2WdUU7uqc6zI8rlbnd0rFkaP99CuoI16p28vDGWNzQLnuJd3TVxqhHu/cITbQg9K7wcZuG4W8PLtnaeoX5jZg7Z5LW+s1ABzOqmo2IsqOTvku7zUi2n4KjxJVAAg0xELcGafWSqWw6071Jx6ATEtlf7ivOT108QPVa2Ypqnr92CU/DL4VxYTOTGpvmZAGt7K6t3Ly0zEV5ixzSqsS8sElGRqsTuD6BqjmOQY4RSDJ7R7ZQE8Y30F6SVpNG3IpG9Np2g8q6rKcnDq/fKfUUc40RNoQRlTuiohjNdFdGx2azcE0ksjT426QdS093jYBYwWnsiLZoUAlN9nShWMxQG9X9NZyOO4WJHhwNWMovemQImrbuddH5AZ5Gd7KVrQmzbCebrFe6JYHvZBe6wtKq1hWtg7D03EuvRcO+hsxwiEaw/xkOn5cl/kQNObKnN/8Tlw6uA9fT0LIMF53xySVsfYb7iOB6DFYD3JYQ6uPmKxfsOORGZC9gdt2djsuR63Yl4qOXbimV8tUdJkIgGYQY121LJ+qXTc8XJGP9QE7THNW6Yr4jPrJ/U1fn2fOqB9x5/dst2UB6/7bDol7rNfRKniRJjGhpd6CQpFBOJwMdzV8MppK1eVGr9ZhG+xx1lM/pzAQ1O+5y6j8xSjhCydXBhjoVjxKRNs9IK/qfJiv1k5Bf9ltXRydQZHntfQL6sgizEKmidZ24sb+/0n/jiS5NsQxC2UvB99yT7kil77knurTJnfOSl4oqICoapK/79Ek+01Sj99wTK+RjbBJyQjFFS++Oy3J8d1pTDN0GIEhG14cpDV9vL33FPX+NCQBKdA+bEQvZ14cJYee8+rNjDMu/EnQhJvTwCsiUbVCXd5+NJeEZGdp7z82CzfmzMrW3nIvpkLk6KVvAvoz4jRAQOoQBXsVacoKrYEqTVTCxg7MlwjJIoGIRcahWIIw/486HT6rhiIhAwpJMbe2f2rrAtO5yxOz1cZxiNYU5oc74oT8fcGt6uWFWKpZ9HcQXqSblQcNoBDh3rAIMpyxDbn68+TGs2Do6SUTM1hjNH739jmuyOTBgDZWWLokaKhXDqVLP8MhkChYikVHdfv0bsKLbqgh9gGxDV1CuOjk1GAy84DWi3PyV4igWBt0Oae2QxoR+BmkxbrTJ2FJJcGsYPE1JEimVngHkXQwm7kiEpY9Kim0q6AGiKLj5seYngs8ALR5kwNDHbgNHUhIWNL9MFDaA3/D6f1oN08yZl5BpdJTX+jCYKtkgpx7xmit0+vQrFav+lmQgEj3vSfQ9y1DEP3pN82uiophQgglEAiFLb/5386eQgARbbT7hNX/0rBMWYza+aNc7iaIbivrG9wSNsCw++ro3vJ7Kz3aihcW1q7Hwfbo+QYWWSd6PGOil852csQxRpWivpija0p9SSTZsmXLomj9t/rduwRXnP4826zbBzY8onORK8yMYW4Yu09e/4XWPikroPOc87xNOoY2uVpdozw/qbEX03ajUKkeE5OdqYiYkElTpP9T85/rRqKwocvTFX/5Ab1oSI4GQGNm75faQOb1rem9EHNet7Ib6qRhFIHNIZEDJLTP9E9mgoXYcWTeVoRBKVdYd6RBaMC0KnQwmh8Nk+xtGGi27pEm7w8PzeJQPWEaSSuneD3z5JeFQ+fMnmr+K0aRheXAEJ3YzOFA2Zucm+me2JBEYwTTgxMTHspbug4BsDoIHwTsZBJuECs8jkXz/4QSqDz/TgRhtdxrmPKfhgU/cB06hbyz5HiZoPvAh2bHXXxcxRGt2/grlQx/gIvGHezI7781nV/sLiX3lXGd/pmPneMMEz00oWoc2rlumSQeDqJ/XkPgeDfa753USltsdgx/8QOC6x5IamHsuOhn76DuiNn3/WYC9n/sDARkPHuyupMXTu7daZNkfiCkHrZL2QeOutDb5UnFj7mMDZYnfBX8QpUKdKwLbHb9g0tUiESqGksWuwaHxJIyxM3D0gqjZjMl9kjfNx6GD4dAvjDMcqpUgoD+Utsu7EZ99YXSO8m1oDMYcBz154RT//UPuhqSzzVMQUJs9xvWS+ZG4hv5AmwwY7d1THFOn6ntfxYLvfH0uk605EHkFkqKOiF7hOBs2GLyt74YNkQu15JrftplrhYaRTRfWayFH4dlQGzaA7K/KFFuVlDDIszk6dXfn6ixbodU7FM1ZuXNt+3cFJZBNKkZS5d6R+nQadkYizU83P4PujjhLE1FRdNLl3lq9kYY9bGBHnIRhHMYZ9Q3bkWHpm2YwIvM9n79zWs/5nJ4UygyeXEc8gLwsGitXauNgP8IUbWOIuSi6q/mZ5mciEZGuQMMjTUv7IkyYEdjDYIiM2joqA2dMFmV6pS3KP5YjzrLOAcJ6AdBH2VpHln3Wo27SNHOuuL8T9XOocy9UImEFEDUo5CFnE/ewKcdjEWAvEiA8iPX37IgAab8u95MqXNKWOPxl7Dt9chZ/Qx9lwH48KILr/4FfKxFm7NmiGHSv6cSXfovEWEygjCNvZ6t2sxATMkK3MCSMCoEZvVblPcQTcRtTT4y2Bzda+nPJcgvQgHcZcwPsDBl3GjAaV4szn3zcqWqb17w9DmC9++Fg6urdT8QRHEB3PKoBnA4gClkwjky/kzm0tD3rT8IhaP4TBfTbJ75kgJq66K+1zpL28ncHUfdFfx2ZgKz2yO0ipBCbJD68ZWDppZCT7ltsGJCQmv+YE3AbJnmhj2merJA0aWN8PgS8IKok5WB4Ofh/bqjRJ/UnXvzOPSMKcM540Ts0WHoBA3rXOWGdufePTqw7LDYff+09EgNx8yoqF5jUmhIWOJXnpmsDvaV84vxUBhdGN7ZMy55Mro8yPynPIYr6xRN02WM6Wn4W+Be23XLd1vjAxNG/br72WssszC28BAYpDI4fPXpUihUKWvPf/yqx7cjN29Wj58QJspODQTQ4ceSvX300mlx/ya371r/kKxK73pGjQ/OXXT4f+de/xCg4MCkdXbUSZWGcrcRQd5EhiZ8DSdH3jzPVIMrR83HyQqjPglZt25HxG3KjqcLcT37sLFA4etePGBZXvbrAMDo3Hn0DuWTXFEfgxz8JzEtH7v4BYXDvXVz/gQ0RYRXsRWGQwd5Tek4uGvGrmRis4NYkeZ6DZwH50+955NXvfPcjj76z+bGRmcaVjdHucwLa8cr3vPvVr3jvuwBPVYemZyvdDcnNCgR0B/qwEOO5jytxR8fJpbHravEDcbNeH+yfgomoTZ5+mofd2NYQog+/EhSsSWEZPfwwDUUEPwZ/J7umxa6pia7mttxt2/L2ldxMHH4MajCmerIpCgtd2iOPOLGl22ORRx7xroF5DjL3tEZlDpdrlqD6BK62YoWevCuwxTSVFTPOjw+6V+YRwddoQeQrBEuPxyIwxF6q4OGOpxmcYe5tlz39rs4kjUsCPxCZ65yVqeL1AVdh0TVqIxnZwCK7yjAD+HH3yorvOcePMh94xzk858umac5h7+xtxZWegoZnijbQU+7bim+9+UEP7rdw07j5gZiAhMCZn6FBpAlJN48knzJbWUmruaiVJhwtu5p6fRRiIOv0Nxgh/GuRqApmnzFGvyUnDvePHrp3fv5epALGv5KJLBH5lwQh9BuRKBKlv0F/eqi/fvjeubl7eb8L4W3C07BdMPnqIpdq7Q6AzsXBvG/llwd+lxvxbflh9k0eKOiEX7pVCBNRYHCHI06rhSfjeI6C77GvoLKJltV7/+GnXtMeXjU2DIOdvb0HVElR4U220wW6hEQxvG4wNl8RRSTp0FV+s6pI6oHe3k4xAj+jH8KUapqo0cugPLCbh981JNpr+iLTPSLSJAxk957LKZugUYo/RDV+5+bOfBN/EXUIErNB6uzO7euKh0UekyqNFIgUJsNefKNYFv10RYtDyMvY6kV+Z0NxKO+Eq6MNcRS/CJp/DHAITSs8x735ji2Vv92zG4kRWQshiv70r4a3wsUSialLv+XzdKO7NjlZ69Z/97WvAnxtMobh85XkrUNDEEWRCBy8JTXwBRRr/vprX/u6JMUy+XwmJrnV92f+VXgaP+lX3zM52ZWJGAQPnqPY3jr/yLmK7c93NLrKbwOfXX34Z2d7dTgXkc+7XJRy99bubMLSEH4GN5XOe9jOa/Dj1Qfn5MLCOT8yeF4gXEXega95JuVCz6AKXMDIC1ZTBz59/mNsrSJQc+l8hwIIT52R4edM0kTZnRQWXanNGG6Yq5/VduH4lGwSbNjRWNq8k8mWY9dzoYi+ERD99JPf3xBzJbbFrsc7v1vLkXLqi9aVrCmYdgXq9ddHw/SuO23yT7EIfAm+vJwUJbSg+rknGVp7ieVCxBN7nuIC/5sMjjMWRd9wYr+/wYWCWssQsO8GuA7qyk7P1vKFsSh1RW36DVcKU+vXXvrVl+HL7CKbbNGV5deTKXi1G6NXW/GU1fnCDI7VflcWEjQs3cmUEm/7h6nBd9+TLscpWEYgcOr75bn58tuu7coGrg8G9GBHtmjfLqeuj/VnZKIEgqHXpkTR2Zvp9SJRwp1kGh505b7aqpd5hmOYQZHL8noYPYTFxPzOhz+0c/ZLdyUkbHUEHoYhGHzYhActQyVacr530Sjfm9CJaljWG99ocetjnQD4z1i8KyRkeYQ1rghoOePGtkfb/ErYrReSRIxZWuGlEQxf+guiBA2FwGOAIv9VviISAaK87QMfhMMfAMWRRQTTsCCaCl06RUQS0uCi6UcLBRD15m+bPwYQEJeEKI062G8X2G/HneBKpsYqZ1a5TeTluGQDAp+nikKbMwoXdvD4KunGhgCav6PcF0SbTQJR0FaJNCSsPVPBfwa/EKLefhcPUuTrAvVqrv2XOwWmtdbzBTZoM8vaHl1rKugr34A3ExtB80rC8yVx82qKcRru+FHz9SjxsYWFD+yDv3e1AznMMF86RWUZo/sVMQaku/md48cxxF4quPh/i+GfFMJu1loyYnH8qfezrXocgct87G8NKO0J+hmiIKAgwqcVJt2n/V3AjGEA3l9A5qdEQJgLcy7qvXyPfjLFVjrhemzLKT8vJrtcKtbGVi6HU9/q4A/x9vXbf3gRfOwlY1t0QvTN4y/79ndflA5vtQmxt4bxUPd33vzKqx4cikR6vvvmt3yvN4J2nj498MrtHRd37HjFwOnT0eSBO9nnOw8kP3Lri0fmX7buJetuffGLblv3EjdueBeeRn/hVuT161xOdDIngdfnpi09tFbws3f9Y/9Vr67UUjocC/RHdynDOCLZpKub2FIED+NgdndcuSSjgTLRv2soMZChumkYUmrd+DXdI3jttGKRTXJgbk1Y4rF52ZbCa+YCeSuHwbypUrGkTetrM+XM6PqAqQXmLu7bMb7hIrrrZgU8uv4Yc7r2CNu5p6p3uTrEL9isr+570qZK+a9Rt1drGvvP7Fh5IELbU/5mp2prk+EDVSmRnd4wPrID6dOhbPf2nv4Qf8pOqJ99zIamdfTRqRmgXRunBsdSipoZ3Vo+1tsZSqeClYZER6iyUJXhZ9c3hlBwrVKIlLOTL8ipOzbHst2zubG+cLh3LD/Tk41t3qF++pL1Aalnx5ZaZ3+fafb3rSkfu3p8R0Ci2mRXKtXbUMDzEl2Np9i6dQvzDPPxgZCrNbYEI2eqVeKqQkYa2F2yKBcmtXzL3VutLfta4UMisY1s/cj9UYJw5P4j9axuh/Rs/egDyMAiQiI20FN36HIRqwgDufWtKhHffjMBLXvdSzUqvhF9DUXGN77sWlu1iWhf+7KN444zvvGlx5BCJFmVJaKg1/99WDlBTYJB+uRLVEpf+gkJzOHX3sg+PuA+0Y3x42UML165O6QA7+gS9UTiSraQ/xC64bbea8/CtJwn88upul+o9yV2Iu34jrX1BR12xAHjeBmH6NpD5Z75aP4WeTXj0tnJQqSxZ9NoEI6X+yYOBPR1B4rD22jkwAT0IhyT0bGdM7VRi56DfeXuIqLBI+vXXWMSv4oJ7mC7Mc+Q5LniYcOXtj7IAcSgDPo4OiG3+UUA+RnZd071TW3R0cSahxQrSRDCbNOl6JSDtSkLAwJjj47gC4mZuhLdt/3iXRRUgv6FyFgjL2n+dsxEBfGVL7OuO2wyOMbP5OA+9AN2v9Tc6G8CoVbv2GCVhwPcTB6T+vWqBU5cL9sHRgoMTIf5D9agPNIJArjxDqqLCAFCBEs4QPngbc833DHQYGDsGoBrjqC/RQGVNH8Po5OIfa/5gubdGGGMAIOs4Y9NjohsFN4KbyGo2Xg0khx69NGhIQbrmjNZuJPVCl8jnGSwPu/ogQri9lcFj9S9NhDWykqP1pZvdWZ98EO+3v5AW3WV1fZ5JWGw5iZt81H/WAyNFPhs91I7qcRxRYhX6zIMKdINYgdFXm2j5M1ZIDhL2Lgka97J1gdqrcyi3iT6eUgVZ9yRF2NJMrWwNIZFWYQ+ouKxSYok8dWyoih0dpYQS8ouToYJDqpkbpYoxDvf/NvWx/mEwiaTzpI7tzJMcVDD7AgeejRgZdlEPuw+uUqCOzn3cd3SjXrU3NCPRwspvKJF3XUgOpwAuUtBB9g/Ww8r+OD/BH88ess0CodFUH/0I/z9n4iGFVZ+6O4dEqxh102w6wbaq6F5a4+29le1TjcUxtNl9X0HDuzTFVsPHTjQWzuA/lK3JaRk/vrHwZ/8dca2DfqT7+Mjd/3Q73shfg2JbmQkxqEuPXfR7HC42ooYly+kXBbAhHEvo/n8pbLgRxZAOMDg+jmDa5h3QrVWcqQvtFTWy6JG3/8DamPdbOsLLof1aCcbDMbNF067CwT/QsiKJy8Yt+ei+oWh7NXpSToqCJsYxmPnqKpseWtWl1b6J9j4hddXoiDs8fw7Q+eqs4Qg7PVPX2C9pc9bqysu4fw1ly2M3T4eU+V2PlxVb5jzRy+4ZnGvm+GB/uqZVYd+mgV634WXLx5z80BW1yC6WSLPXbzo7Zt/LXMcdwgn2B5weGcvoLNX9oLxOt8Ct2hWHfGotopLVq0/euTCsT/P+oOJ/m6FwpDwSXw2Q7WzyXOT7Fm4pfmG1gKAwVegndM8v6kv03jmZZ/T6q9QjVYvXK7lVjVZoAilIPUHSbmluxFu67UAf1i3Bb9v+nvcGuTh5d2IG0+tx7WwuNfKo0fax1sPpOf9+6eR6x/xppYVp/tk+tqYJalkYAC6BwYYTa3w1VuvDrtD7B/hdaikeap5Emsa5iNYQy93VISMSEhES19Hw4g4EWPlmKhplSBEbEmyCeKn7VbU/aMMjxGef9Rl+flo7bkZfvpmuYK8JfEzOKA9VQr9biVH48cJSPm5Ey+OykqXn8Wx9PBKJQ/6aFuqxo5PETm3nEghK3p6OZ3j9y9YSZpqyxDoFKoM1r5yBKHV2RyudkWW7Y/2bI5VeWdtqR3lUPgbze+vSUtSzJERCh5sJXdYbcC+fCXPIx00AC9e1j+RC0v2LZtaeR6//9zq2qTHz1TQd7mXpeWH8jPK2/O7P6lbCCFAkq1bWGpirPx1SJcpxpdgwzIUavz+Xdjt0Mz+Md/FYQELEsOcEuCrNOQ/NOAw9B3m//x5feeaV+XzvH8cOv7vMJ/HoAMBvDn83P8GZAOcVgABAAABGgCjAAUAAAAAAAIALgA+AHcAAACDC5cAAAAAAAAAFgAWABYAFgBbAMEBkgJDAv0DyAQFBEAEgwUMBVoFmQW0BdwGBgZaBpsHJAetCAUIqQlVCd0KVgrSCxMLcAuxC/QMMgyrDWQN0A5GDrwPDA+GD+kQghDuEScRfhIDEkESuxMbE3ET0BSpFUgV4xY/FpoW8BeFGAgYahjUGPkZJRlKGWkZhBpKGsobRBvHHEsczB27HjMehB8FH4MfvyBhINkhKyGiIggiYyL2I2gj4CQ2JMMlPyXGJj8m4CcIJ6gn+Cf4KCkoYiiiKPwpOCnqKlYq5yu3LJUs6S1hLe8uxi9XL90v/DAlMEEwbjCTMM0w8DExMYExzjICMj4yljLWMzAzXjPCNBc0ezTyNXg1eDV4NXg1eDV4NXg1eDWTNa418TYuNpU2+zeWOHg41jkFOT05xDqXOw87mjx/PTg9ej3JPhc+YD7SP0M/nj/+QFpAukEVQWxB0kIMQkVCfUK3QyBDikP3RGFE3UV1RgRGRka4RvJHiEe+SBRIbkiKSMxI8UkYSY5JvkniSiJKlEsXS1lLdEuvS+dMIUxoTK1NDE1LTY9N+U5fTuRPV0+hT+xQQVCLUO5RU1GdUd5SJ1JxUtNTMFOeU+ZUJlRSVHlU3lUsVaNWAVZQVnpWnFbOVvZXKFdpV4ZX3lg3WIxY1FkrWVNZdlmUWbRZ8lolWmNaoFrjWxpbZ1vGXENcr10aXV5dtF5ZXoVetF8AX1Jfy2BEYLZhamHMYixigmLYYv9jE2MnYzUAAAABAAAAAQAAm9RTZl8PPPUACwPoAAAAANiymP0AAAAA2LKY/f3i/vUIDQO3AAEACAACAAAAAAAAeNptkjWQUDEQhv8kuLvLubv7Pdzd3aHCocSd7mrc6XF3OpzqOty7a9DHvzsvM2fFN/9Ksslugl/IAwAzAaANsxBz7DwkudsIbDUC6hC3FTmmGmPNHawiEh/DWKCxbegoKmtJJplMSkkOialnB5FqLYE1FpNA1A7GELVXIMXlIdnJ2RuQbOvIa/r76e9GsrmIvnYq2rg9jF9EcovhzO0mi5nvFulC5rZRY5DqNjO2An1bnEEfaizpbu/o3bfbatW+1K0ENhsx3DfQhLo/yXZGjFmEFOYG0U/k2hSzKLxmF3ENbc4mUeLM6z7Gk0wtc4+pd9BTcoz1czyD2pP0NqHOZCT37xAli2XuojbUGR3X2YbY1qIbUmmfF9/OwEDWiVGbag6iT4saTKMfY66EdVEPu6L5/yAbyEqd8wqTL/XJHpkZ712is05ibyFydH6chcTqab6pA9wn/zfIuYhpel+02Aqwfpm+/zysIUmGPQgtO/ONZyMe+PvWHkam1DW1YWjfYzTtNHmDFtoLOlGHRBp4jRjitaVFQIY0k1NYb1A9zRbl/I3dhAqq1M2SvtnvEsJ/J2jcM8bbXDfRSX1iX6I4eqsafZ/6lEJnxTyVfBZtwmLB31Ps5mA9nxtKe6TQtJb2N4R4f4h7qnfrLG9A7cM7xIrdsjNJxw4T4j7p6tXPzf3DCK6PpQ4XlbivGWmM4TmklFSTbeK37khSsbjNROp4QqUtsSHyj+r1dFz+j8kAsBz4D1sz0KYAAHjaY2BkYGDe/u8rQxSH399H/2dz8AJFUACjFACyrAcJeNpjYGJ8wbSHgZWBgakLSDMw9EBoxgcMhoxMDEDAwQABDQwM7wUY3rxlgIKANNcUBgUGhff/mRX+WzBEMW9n5FZgYOiPYwbqPsS0joEBKMsIAFJZEe8AAHjabM8DFBwxEADQuU1tG8kca9u2+1Dbtm3btm3bNq43OdW2dpumZjJ+/ADAvmcKsIF+rLjebF/3CMyj+1HoD5GgJNSDvjAflsNq2ADb9fU6SLgD72xZbNWMXMYx45Rx0/CxyWw6m8XmsvlsEVvKVvBIPBpPwJPylFxwF8/Kr4nYIq6IL5KIFCKHmCGWipVijzggTosrCMgwIkbB6Bgfk2Eq5GhHJ6bD/FgYi2EJLI0VsDI2wCbYCnvhIByGY3EGLsHleBSP41N8bo9utzs3OXc49zgPOZ+6Grnaue+7P7jNtIXSrvfzp0op7eHQ4Ltj/VfHta+Ot9pRVTuOGieM68YtNuk3xxK2nBs8Ko/Pk/AUnP/HMV47VojdYr92nNcOQzsia0c8TIgpvzvc/zgaY0vsiQNxqHZMwIXacVg7nmhHFDv+5qjvauO+53791bFOOywNCamgOqB2qm1qs1qrFqgJapQaorqoAirlp7zWamuVNc+aa94375hhM2gGTGmS6fMP8Q/y9/J393f1d/a39zeRB+RIOUIOl4PlANlCxpZM2ugZPaEwBWgbbaUttJk20mpaRStoOS2lJbSYJtMEGkdjaTQNp6HUlTpTe2pItakmVaeqVJZKUwZKT5Epku+Z76a3nLekt5i3oDf+zUU3Z97Az7spflPs2pVrqQrfBKWAqWyYAEY2IIaxmYAEE7oCYL5iYWVj5+Dk4ubh5eMXEBQSFhEVE5eQlJKWkZWTV1BUUlZRVVPX0NTS1tHV0zcwNDI2MTUzt7C0sraxtbN3cHRicHZxdXP38PTy9vH18w8IDAoOCQ0Lj4iMio6JjYtPIOjGKSlgKgtEJDGkZx5PvXGTgWEHkHeegaEtO5eBIfkowxUgd1oikMgv6OufNHnCxBy4/qnYDM0rqmIor6hMq2YoBgBOWioqAHjarFXlmutGDB2HluEyuCDfudlu47EvM9tx0suL32cX7aXf5fYZ/DRyyv/6aD1yskylhWhGo5GOjqQJK0OsluMoIXr5u5qcf8mNxY9jvmnzbJJuUL4cc6WZ/TGshtXqql6xHYdVwirU7Z6yVJgGHluGKd3wuGJojfjPOa7NfNybtUbDaDVa+CR2tGPnMfHcXOzw08Qmviuru0lCRd8oW+NZqAY74qtyfhWWcBYTQOQZ8ehcnEJDcjYqq9uyup3aaZIkNltukmhWc/F6knhcNQQ/tWYGQPVwLua6DrihA8BP2Eo9rhkNXLRW1FcCkpN+cPnEebTK1ZYDfUg55fBdXK03kdZ8nM7Z2UIS6wSnTxdjHNmS1CCyx3XDQ6HbU5U+NQ1sdaBBsQ4yrqxssLUK/1xveTxkSECOhau/19QKiQd+miZikrZLkMOmNzSmwihoOVtkj5jd5I/2vViuhh4ZpxTlOqO1AVPKFjaZbIDcRMnVps7a/RBjh1zny7ilcOugS+OmTKg3NlqNYsfWTtJyPJ4wRaUS8VrW9njSwJCIx8MXch0LHSQ8IbsF7Caw83gKbqZLSggMrCIuT4Yp5SnxJEjzeNq8XIqL2lo7ucwT6/pHj0+Yl/Pxy8W+0nagP1XqT5pCTYXLcTE1hfplAU+50qRo3aAYl48JfLB1VhPymIsLIQ/ZBnlOZdiWo3Ftc233z3EF/6UmQSZd4O9Cu7tUhxSwUOqUBlshq8c9y7LKWp0yqlCVaCnmKR1QxGM64FEETgNKEf6X6WlLTaogyNPiZMPl71z7Emg6jdxOuR6fMYUl8ix4FnnOFFWR501RE3nBFHWRF03REGmbYkjkO6YYFvmuKUZEfmjIZ+szj1vl4iuP3XLxtcfvGcUT7r/A+D4wvgffBIwiHWAUeQkYRWpgFHkZGEU2gVHkDDCK/AAYRc4Co0hj6GHZap5B2OmUQoEQSjkg2Ui/+YY9lz1M0hVD1KVDKqGzu1qesSMt0EoeX90qj3WWr7SKunUmiq8mZYLXSmYOPb5u6FaJ9wbsrGh/EEwYgh+sV2d/VvLTfqzvFtetM8joJvIH4IPxsgqzux7fMv65hx7fPs4UTbgK8zsoiTrbJJ+6Mryg8nmed3UX0x6vIH+2MNG3LevMacS/a4AKA4K/0oRHQnc99zXRwxy+7m0fk9/3wTUdiBVxKvP+dD7+qUJVsn+qzFQvJoG8gcMhBqy01h1MH6q5By2Bjf5jXwnTNc3VMFubi7HJbKxTeYP23sk0IfSM7qCGGhE6yAuijJLSQUG0RNE4SSG5joaq7/MKj5JRswSBz7n+K7cdCyW/LxwQNPWZAQf6Iah5IGrkqgOcdXRXgkm1Hoq+TGDAqFqKfXqoHRuaTSWcbVPeaGL3fOe3b79QB3XwoDJa2vjRAEG4WZpUvp73prhZysdGky+sdfAwP0z8wrdOYwCfbKnndqqf7rY+0OaZ4bvugU4Dw/fcHIGlWYB2vw3K4rMP03Crw8DuVgtqtLqv7w7ctfFo4A3/F63Y/b+6T+BndwFL4wnZUW8nGWCMhIzN/DuSv6MHBOi7u1PuIuUz/eHsKZnDUz7fxCx+dIj+uSmUdfoU38L6heE7EC+FtQi8UicHikHYV0bakV9i+dr08M5g8QYLSxZvTc8qNX/1WNdmDgNAFISPoY+LBA0ccywzs2VmLkvQoHdWkM3z9ycWOxL6SwbzJ5HFEDkMkccQBcyXRBFDlDBEGUNUMD8SVQxRwxB1DNHA/Es0MUQLQ7QxRAfzLdHFED0M0ccQruU9p4d5wPDepYZaH1IjvZ5kfMoYW95LqicM1VNK9YxSOre815QuGEqXlNIVpXRteW8p3TCUbrWgOy3o3gofb66Sj6dv03twvesn55S8U+wzK3FNYwB42mPw3sFwIihiIyNjX+QGxp0cDBwMyQUbGdicNkkwMmiBGJu5ORg5ICxRNjCL3WkXMwMDIwMnkM3htIvBAcJmZnDZqMLYERixwaEjYiNzistGNRBvF0cDAyOLQ0dySARISSQQbOblYOTR2sH4v3UDS+9GJqA+1hQXAHdZJMsAAHjaY8AE/UBowmDCtI6BgWkb4yEGhv92TKJA9s7/X5m2Mx79/+u/BYgPANtqDHsAAHjaTMwBBgJBGEfx930zsypm2iVhUHdIALrDAghB51gAQRdIIB2nU4TOEeuPAX4eHrC1ggEAI8jGilF2Imc5sOciR9ZMciJzl7umZzvwkAvVPnLf/If5H7C4BF72k42N32Rn4U85cPK3HNn5V07UgNw1Pfs1VLlwTJPcN//h3xpVbLcOA9FZ+ytm98hR4HGZMVBudz2qo8ZqHdvHVujvezMuMx3T1ejCjDz2X0zSUWY7oeOvwTeuVSr/S7VKtcJLJredmHcDa+LA+LweB8q7T67+GpP/8WaoY54PdNt0R5t6zxwdN7SNF5KovZLEbiXJOoZrqsITfLNbGm/fWx6YLLdJzBVVUb+e6Mx/tDX+OjUYDFRXu/BMDxUSZ769qt1L4TlKuqgUYt8bWBfyjslN1jdtHg/CTd01t0ZQnrcX2rzY201O3UBnhlGIbGDiHKpe3DYZu9Dw7nqdW6mJC3K9IPh8NXFVVRXMbrSs+9pG+iQyLI1oXpnfZu0mvNC5dKJczoPMpi5XuY3GHZdbK/Wnd2iREkppRBlZ6lBIjpi+UkDf8K1RBdd/Kgmq4mFaIkO5cGOsdikANsAB3j4q64IVeS86V+nXtfM/1DbB0eI6TwFQG45d6DeB94CP6JgawBacBXhHYKzgG5OTb4YUI95KOp0gflRbulY/v3uAnUxmHWcwPJU8v954Zv7rT018pmggl8L0mhz8z/AdYl3MOEPfPvF07yaeX7L0bc6dZJ88MK30xbQjcxns9smAz9d/hKlJGmrzxF9Q8PFQDbHK7+h2gU6BBmBmoi8YEb6BnFp+mdUDbks6Sz9G1OtUx7dFqXBvO9fvOPjED/5xlZQ80tmjuUya+jJDhPcJ3qjdOhEtifO0LdjRBHmoO1wpcBlXDreMLNYOWEl6dH3GZWpBX3+P5gJQTU08eNpswVOCFQAAQNF7xzbf2NYbG42t7K00P9m2bX+3iMwV1Arid+cQwj+/VgjyHwYACSGUMMKJIJIoookhljjiSSCRJJJJIZU00skgkyyyCZBDLnnkU0AhRRRTQilllFNBJVVUU0MtddTTQCNNBGmmhVbaaKeDTrropode+uhngEGGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZjVrWMs61rOBjWxiM1vYyja2G8J+rrLCET5zkB8cYhcXeckl3vCQR4bylm+GGW4EH/jIJ97xxUhuGmW0McYaZ7wJJnLBJJNNMdU0083gMU94zgue8owdvOKOmWaZbcAcc80z3wILLbLYEksts9wKK62y2hprrbPeBhttMmizLbbaZjsn7bDTLrvt4bu99tnvgIMOcc1VHHbYEUcdc9wJJznrlNPOOMsN55x3gaMcc9Ell38TBA9GEAMAAMAuQ75t27bZjZuIiIqJS0hKScvIyskrKCopq6iqqWtoamnr6OrpGxgaGZuYmplbWFpZ29ja2Ts4Ojm7uLq5e3h6efv4+vkLwqLoat1RHgoD8C9Tl2tBCoVDdNz1NIXVkmcHmciWu59Cvu6p8C4BYgvTccdJnEnPP1qzGCYwnb1kbctm3xrSbP6Otaea/feL//eJz77yS8sW3wfFRd/9/6nh/39SfHzMcxwP+vAAAxjCGCbzlndGk03z46TrlMvXZ8nutJErduY8dL0o3jwQJ6m0ZEotv6A9Y4KGZsWk7B8EnfViisywnpT80mjbrPuHzkanXuMBM9SdHTAO4RFGMLYmIYxhYk0zmFszB7ow29rRT2Kc3fqWmGF3C6c5Pt81TvM5GWdq35MHq6v3JBUTG3rkSlOnORNLagf9pEgvL5LV/FpckKD26lKZqtEN09MLPNeHAQy3TGmSXN21TDcoRjDeDrIfeql53zExY91FkG15PgzWor/wignW1SuEvdzyTpNUVI1Pzkx3vS4Ub7lg0j53cKC/qvruIg11GpXcGjgb+m34PRPUVRg1TGBqPSYwnSZKUpmTIr2/JeOF9FbSWdAjekjQs89HhTV2oQd9eFhXXFaCBmEUSuHellojNB/EE8oRjK2JB3142A0kB+pqXhnBJKp4Kjss6l7/PYgshOgXBSytpTvpOxGMYQJTq+dBfzJIb8Ywt2aoF+VMDaymKQtDF3ovKmFOSHJYwHLyWEQwtpYBDOERRjCGCcwmE7+0JjB1RgvHs5ZlDgtY/gEBHN7nAAAAAQAB//8ADw==",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Bold.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-BoldItalic.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-BoldItalic.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Italic.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Italic.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-BoldItalic.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-BoldItalic.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-Italic.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-Italic.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Bold.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Bold.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Italic.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Italic.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Script-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Script-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size1-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size1-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size2-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size2-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size3-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size3-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size4-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size4-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/fonts/KaTeX_Typewriter-Regular.woff": {
"text": "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",
"title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Typewriter-Regular.woff",
"type": "application/font-woff"
},
"$:/plugins/tiddlywiki/katex/katex-logo": {
"title": "$:/plugins/tiddlywiki/katex/katex-logo",
"text": "$$\\KaTeX$$\n"
},
"$:/plugins/tiddlywiki/katex/latex-parser.js": {
"title": "$:/plugins/tiddlywiki/katex/latex-parser.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/katex/latex-parser.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for LaTeX. For example:\n\n```\n\t$$latex-goes-here$$\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except latex-parser \n\\rules only latex-parser \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"latex-parser\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$(?!\\$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = /\\$\\$/mg;\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext,\n\t\tdisplayMode;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tdisplayMode = text.indexOf('\\n') != -1;\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tdisplayMode = false;\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"latex\",\n\t\tattributes: {\n\t\t\ttext: {\n\t\t\t\ttype: \"text\",\n\t\t\t\tvalue: text\n\t\t\t},\n\t\t\tdisplayMode: {\n\t\t\t\ttype: \"text\",\n\t\t\t\tvalue: displayMode ? \"true\" : \"false\"\n\t\t\t}\n\t\t}\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/plugins/tiddlywiki/katex/readme": {
"title": "$:/plugins/tiddlywiki/katex/readme",
"text": "This is a TiddlyWiki plugin for mathematical and chemical typesetting based on [ext[KaTeX from Khan Academy|http://khan.github.io/KaTeX/]] (v0.10.2) and [ext[mhchem|https://github.com/mhchem/MathJax-mhchem]] through a [ext[Katex extension|https://github.com/KaTeX/KaTeX/tree/master/contrib/mhchem]].\n\nIt is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/katex]]\n"
},
"$:/plugins/tiddlywiki/katex/snippets/logo": {
"title": "$:/plugins/tiddlywiki/katex/snippets/logo",
"tags": "$:/tags/KaTeX/Snippet",
"text": "$$\\KaTeX$$\n"
},
"$:/plugins/tiddlywiki/katex/styles": {
"title": "$:/plugins/tiddlywiki/katex/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n/* KaTeX styles */\n\n{{$:/plugins/tiddlywiki/katex/katex.min.css}}\n\n/* Force text-rendering (see https://github.com/Jermolene/TiddlyWiki5/issues/2500) */\n\n.katex {\n text-rendering: auto;\n}\n\n/* Avoid TW5's max-width: 100% */\n\n.katex svg {\n max-width: initial;\n}\n\n/* Override font URLs */\n\n@font-face {\n\tfont-family: KaTeX_AMS;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Caligraphic;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Caligraphic;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Fraktur;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Fraktur;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-BoldItalic.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Italic.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Math;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-Italic.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_SansSerif;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_SansSerif;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Italic.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_SansSerif;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Script;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Script-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size1;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size1-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size2;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size2-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size3;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size3-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size4;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size4-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Typewriter;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Typewriter-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n"
},
"$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown": {
"title": "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown",
"text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$view tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$transclude tiddler=<<snippetTitle>> mode=\"inline\"/>\n\n</$view>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/KaTeX/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/KaTeX/Snippet\"\n\ttext=\"\"\"$$snippet$$\"\"\"\n\tcaption=\"description shown in dropdown\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n\n[ext[KaTeX functions catalogue|https://khan.github.io/KaTeX/function-support.html]]\n\n[ext[Chemical equations reference|https://mhchem.github.io/MathJax-mhchem/]]\n"
},
"$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex": {
"title": "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/plugins/tiddlywiki/katex/katex-logo",
"caption": "katex",
"description": "create and insert preconfigured KaTeX snippets",
"condition": "[<targetTiddler>!is[image]]",
"dropdown": "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown",
"text": ""
},
"$:/plugins/tiddlywiki/katex/usage": {
"title": "$:/plugins/tiddlywiki/katex/usage",
"text": "!! Reference:\n\n# Mathematical typesetting: [ext[https://katex.org/docs/supported.html]]\n# Chemical typesetting: [ext[https://mhchem.github.io/MathJax-mhchem/]]\n\n<hr>\n\nThe usual way to include ~LaTeX is to use `$$`. For example:\n\n```\n$$\\displaystyle f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi$$\n```\n\nSingle line equations will render in inline mode. If there are newlines between the `$$` delimiters, the equations will be rendered in display mode.\n\nThe underlying widget can also be used directly, giving more flexibility:\n\n```\n<$latex text=\"f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi\" displayMode=\"true\"></$latex>\n```\n\nThe KaTeX widget is provided under the name `<$latex>` and is also available under the alias `<$katex>`. It's better to use the generic `<$latex>` name unless you are running multiple ~LaTeX plugins and wish to specifically target KaTeX.\n"
},
"$:/plugins/tiddlywiki/katex/wrapper.js": {
"title": "$:/plugins/tiddlywiki/katex/wrapper.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/katex/wrapper.js\ntype: application/javascript\nmodule-type: widget\n\nWrapper for `katex.min.js` that provides a `<$latex>` widget. It is also available under the alias `<$katex>`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar katex = require(\"$:/plugins/tiddlywiki/katex/katex.min.js\"),\n chemParse = require(\"$:/plugins/tiddlywiki/katex/mhchem.min.js\"),\n\tWidget = require(\"$:/core/modules/widgets/widget.js\").widget;\n// Add \\ce, \\pu, and \\tripledash to the KaTeX macros.\nkatex.__defineMacro(\"\\\\ce\", function(context) {\n return chemParse(context.consumeArgs(1)[0], \"ce\")\n});\nkatex.__defineMacro(\"\\\\pu\", function(context) {\n return chemParse(context.consumeArgs(1)[0], \"pu\");\n});\n// Needed for \\bond for the ~ forms\n// Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not \n// a mathematical minus, U+2212. So we need that extra 0.56.\nkatex.__defineMacro(\"\\\\tripledash\", \"{\\\\vphantom{-}\\\\raisebox{2.56mu}{$\\\\mkern2mu\"\n+ \"\\\\tiny\\\\text{-}\\\\mkern1mu\\\\text{-}\\\\mkern1mu\\\\text{-}\\\\mkern2mu$}}\");\n\nvar KaTeXWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKaTeXWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKaTeXWidget.prototype.render = function(parent,nextSibling) {\n\t// Housekeeping\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Get the source text\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\tvar displayMode = this.getAttribute(\"displayMode\",this.parseTreeNode.displayMode || \"false\") === \"true\";\n\t// Render it into a span\n\tvar span = this.document.createElement(\"span\"),\n\t\toptions = {throwOnError: false, displayMode: displayMode};\n\ttry {\n\t\tif(!this.document.isTiddlyWikiFakeDom) {\n\t\t\tkatex.render(text,span,options);\n\t\t} else {\n\t\t\tspan.innerHTML = katex.renderToString(text,options);\n\t\t}\n\t} catch(ex) {\n\t\tspan.className = \"tc-error\";\n\t\tspan.textContent = ex;\n\t}\n\t// Insert it into the DOM\n\tparent.insertBefore(span,nextSibling);\n\tthis.domNodes.push(span);\n};\n\n/*\nCompute the internal state of the widget\n*/\nKaTeXWidget.prototype.execute = function() {\n\t// Nothing to do for a katex widget\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKaTeXWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.latex = KaTeXWidget;\nexports.katex = KaTeXWidget;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "widget"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/markdown/EditorToolbar/bold": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/bold",
"list-after": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"**\"\n\tsuffix=\"**\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1",
"list-after": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2",
"list-after": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"2\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3",
"list-after": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"3\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4",
"list-after": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"4\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5",
"list-after": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"5\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6",
"list-after": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"6\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/italic": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/italic",
"list-after": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"*\"\n\tsuffix=\"*\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet",
"list-after": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number",
"list-after": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"1.\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line",
"list-after": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/quote": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/quote",
"list-after": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\">\"\n\tcount=\"1\"\n/>\n"
},
"$:/config/markdown/breaks": {
"title": "$:/config/markdown/breaks",
"text": "false"
},
"$:/config/markdown/linkNewWindow": {
"title": "$:/config/markdown/linkNewWindow",
"text": "true"
},
"$:/config/markdown/linkify": {
"title": "$:/config/markdown/linkify",
"text": "false"
},
"$:/config/markdown/quotes": {
"title": "$:/config/markdown/quotes",
"text": "“”‘’"
},
"$:/config/markdown/renderWikiText": {
"title": "$:/config/markdown/renderWikiText",
"text": "true"
},
"$:/config/markdown/renderWikiTextPragma": {
"title": "$:/config/markdown/renderWikiTextPragma",
"text": "\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock"
},
"$:/config/markdown/typographer": {
"title": "$:/config/markdown/typographer",
"text": "false"
},
"$:/language/Docs/Types/text/x-markdown": {
"title": "$:/language/Docs/Types/text/x-markdown",
"description": "Markdown",
"name": "text/x-markdown",
"group": "Text"
},
"$:/plugins/tiddlywiki/markdown/remarkable.js": {
"text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=e||self).remarkable={})}(this,function(e){\"use strict\";var t={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"\",Afr:\"������\",afr:\"������\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",AMP:\"&\",amp:\"&\",And:\"⩓\",and:\"∧\",andand:\"⩕\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsd:\"∡\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"������\",aopf:\"������\",ap:\"≈\",apacir:\"⩯\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"������\",ascr:\"������\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",Barwed:\"⌆\",barwed:\"⌅\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",Because:\"∵\",because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"������\",bfr:\"������\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"������\",bopf:\"������\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxDL:\"╗\",boxDl:\"╖\",boxdL:\"╕\",boxdl:\"┐\",boxDR:\"╔\",boxDr:\"╓\",boxdR:\"╒\",boxdr:\"┌\",boxH:\"═\",boxh:\"─\",boxHD:\"╦\",boxHd:\"╤\",boxhD:\"╥\",boxhd:\"┬\",boxHU:\"╩\",boxHu:\"╧\",boxhU:\"╨\",boxhu:\"┴\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxUL:\"╝\",boxUl:\"╜\",boxuL:\"╛\",boxul:\"┘\",boxUR:\"╚\",boxUr:\"╙\",boxuR:\"╘\",boxur:\"└\",boxV:\"║\",boxv:\"│\",boxVH:\"╬\",boxVh:\"╫\",boxvH:\"╪\",boxvh:\"┼\",boxVL:\"╣\",boxVl:\"╢\",boxvL:\"╡\",boxvl:\"┤\",boxVR:\"╠\",boxVr:\"╟\",boxvR:\"╞\",boxvr:\"├\",bprime:\"‵\",Breve:\"˘\",breve:\"˘\",brvbar:\"¦\",Bscr:\"ℬ\",bscr:\"������\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsol:\"\\\\\",bsolb:\"⧅\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",Cap:\"⋒\",cap:\"∩\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",CenterDot:\"·\",centerdot:\"·\",Cfr:\"ℭ\",cfr:\"������\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",cir:\"○\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",Colon:\"∷\",colon:\":\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",Conint:\"∯\",conint:\"∮\",ContourIntegral:\"∮\",Copf:\"ℂ\",copf:\"������\",coprod:\"∐\",Coproduct:\"∐\",COPY:\"©\",copy:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",Cross:\"⨯\",cross:\"✗\",Cscr:\"������\",cscr:\"������\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",Cup:\"⋓\",cup:\"∪\",cupbrcap:\"⩈\",CupCap:\"≍\",cupcap:\"⩆\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",Dagger:\"‡\",dagger:\"†\",daleth:\"ℸ\",Darr:\"↡\",dArr:\"⇓\",darr:\"↓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",DD:\"ⅅ\",dd:\"ⅆ\",ddagger:\"‡\",ddarr:\"⇊\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"������\",dfr:\"������\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",Diamond:\"⋄\",diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"������\",dopf:\"������\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrow:\"↓\",Downarrow:\"⇓\",downarrow:\"↓\",DownArrowBar:\"⤓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVector:\"↽\",DownLeftVectorBar:\"⥖\",DownRightTeeVector:\"⥟\",DownRightVector:\"⇁\",DownRightVectorBar:\"⥗\",DownTee:\"⊤\",DownTeeArrow:\"↧\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"������\",dscr:\"������\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",ecir:\"≖\",Ecirc:\"Ê\",ecirc:\"ê\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",eDot:\"≑\",edot:\"ė\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"������\",efr:\"������\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp:\" \",emsp13:\" \",emsp14:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"������\",eopf:\"������\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",Escr:\"ℰ\",escr:\"ℯ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",ExponentialE:\"ⅇ\",exponentiale:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ffi\",fflig:\"ff\",ffllig:\"ffl\",Ffr:\"������\",ffr:\"������\",filig:\"fi\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"fl\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"������\",fopf:\"������\",ForAll:\"∀\",forall:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",Fscr:\"ℱ\",fscr:\"������\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",gE:\"≧\",ge:\"≥\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",ges:\"⩾\",gescc:\"⪩\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"������\",gfr:\"������\",Gg:\"⋙\",gg:\"≫\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gl:\"≷\",gla:\"⪥\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gnE:\"≩\",gne:\"⪈\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"������\",gopf:\"������\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"������\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",GT:\">\",Gt:\"≫\",gt:\">\",gtcc:\"⪧\",gtcir:\"⩺\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",hArr:\"⇔\",harr:\"↔\",harrcir:\"⥈\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",Hfr:\"ℌ\",hfr:\"������\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",Hopf:\"ℍ\",hopf:\"������\",horbar:\"―\",HorizontalLine:\"─\",Hscr:\"ℋ\",hscr:\"������\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",Ifr:\"ℑ\",ifr:\"������\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"IJ\",ijlig:\"ij\",Im:\"ℑ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",in:\"∈\",incare:\"℅\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",Int:\"∬\",int:\"∫\",intcal:\"⊺\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"\",InvisibleTimes:\"\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"������\",iopf:\"������\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",Iscr:\"ℐ\",iscr:\"������\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"������\",jfr:\"������\",jmath:\"ȷ\",Jopf:\"������\",jopf:\"������\",Jscr:\"������\",jscr:\"������\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"������\",kfr:\"������\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"������\",kopf:\"������\",Kscr:\"������\",kscr:\"������\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",Lang:\"⟪\",lang:\"⟨\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",Larr:\"↞\",lArr:\"⇐\",larr:\"←\",larrb:\"⇤\",larrbfs:\"⤟\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",lat:\"⪫\",lAtail:\"⤛\",latail:\"⤙\",late:\"⪭\",lates:\"⪭︀\",lBarr:\"⤎\",lbarr:\"⤌\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",lE:\"≦\",le:\"≤\",LeftAngleBracket:\"⟨\",LeftArrow:\"←\",Leftarrow:\"⇐\",leftarrow:\"←\",LeftArrowBar:\"⇤\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVector:\"⇃\",LeftDownVectorBar:\"⥙\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrow:\"↔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTee:\"⊣\",LeftTeeArrow:\"↤\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangle:\"⊲\",LeftTriangleBar:\"⧏\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVector:\"↿\",LeftUpVectorBar:\"⥘\",LeftVector:\"↼\",LeftVectorBar:\"⥒\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",les:\"⩽\",lescc:\"⪨\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"������\",lfr:\"������\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",Ll:\"⋘\",ll:\"≪\",llarr:\"⇇\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoust:\"⎰\",lmoustache:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lnE:\"≨\",lne:\"⪇\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftarrow:\"⟵\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longleftrightarrow:\"⟷\",longmapsto:\"⟼\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",longrightarrow:\"⟶\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"������\",lopf:\"������\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"\",lrtri:\"⊿\",lsaquo:\"‹\",Lscr:\"ℒ\",lscr:\"������\",Lsh:\"↰\",lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",LT:\"<\",Lt:\"≪\",lt:\"<\",ltcc:\"⪦\",ltcir:\"⩹\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"������\",mfr:\"������\",mho:\"℧\",micro:\"µ\",mid:\"∣\",midast:\"*\",midcir:\"⫰\",middot:\"·\",minus:\"−\",minusb:\"⊟\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"������\",mopf:\"������\",mp:\"∓\",Mscr:\"ℳ\",mscr:\"������\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ʼn\",napprox:\"≉\",natur:\"♮\",natural:\"♮\",naturals:\"ℕ\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",ne:\"≠\",nearhk:\"⤤\",neArr:\"⇗\",nearr:\"↗\",nearrow:\"↗\",nedot:\"≐̸\",NegativeMediumSpace:\"\",NegativeThickSpace:\"\",NegativeThinSpace:\"\",NegativeVeryThinSpace:\"\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"������\",nfr:\"������\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nhArr:\"⇎\",nharr:\"↮\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlArr:\"⇍\",nlarr:\"↚\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nLeftarrow:\"⇍\",nleftarrow:\"↚\",nLeftrightarrow:\"⇎\",nleftrightarrow:\"↮\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"\",NonBreakingSpace:\" \",Nopf:\"ℕ\",nopf:\"������\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangle:\"⋪\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangle:\"⋫\",NotRightTriangleBar:\"⧐̸\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",npar:\"∦\",nparallel:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",npre:\"⪯̸\",nprec:\"⊀\",npreceq:\"⪯̸\",nrArr:\"⇏\",nrarr:\"↛\",nrarrc:\"⤳̸\",nrarrw:\"↝̸\",nRightarrow:\"⇏\",nrightarrow:\"↛\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"������\",nscr:\"������\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nVDash:\"⊯\",nVdash:\"⊮\",nvDash:\"⊭\",nvdash:\"⊬\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwArr:\"⇖\",nwarr:\"↖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",ocir:\"⊚\",Ocirc:\"Ô\",ocirc:\"ô\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"������\",ofr:\"������\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"������\",oopf:\"������\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",Or:\"⩔\",or:\"∨\",orarr:\"↻\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"������\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",Otimes:\"⨷\",otimes:\"⊗\",otimesas:\"⨶\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",par:\"∥\",para:\"¶\",parallel:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"������\",pfr:\"������\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plus:\"+\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",Popf:\"ℙ\",popf:\"������\",pound:\"£\",Pr:\"⪻\",pr:\"≺\",prap:\"⪷\",prcue:\"≼\",prE:\"⪳\",pre:\"⪯\",prec:\"≺\",precapprox:\"⪷\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",precsim:\"≾\",Prime:\"″\",prime:\"′\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportion:\"∷\",Proportional:\"∝\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"������\",pscr:\"������\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"������\",qfr:\"������\",qint:\"⨌\",Qopf:\"ℚ\",qopf:\"������\",qprime:\"⁗\",Qscr:\"������\",qscr:\"������\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",QUOT:'\"',quot:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",Rang:\"⟫\",rang:\"⟩\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",Rarr:\"↠\",rArr:\"⇒\",rarr:\"→\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",rAtail:\"⤜\",ratail:\"⤚\",ratio:\"∶\",rationals:\"ℚ\",RBarr:\"⤐\",rBarr:\"⤏\",rbarr:\"⤍\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",Re:\"ℜ\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",rect:\"▭\",REG:\"®\",reg:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",Rfr:\"ℜ\",rfr:\"������\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrow:\"→\",Rightarrow:\"⇒\",rightarrow:\"→\",RightArrowBar:\"⇥\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVector:\"⇂\",RightDownVectorBar:\"⥕\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTee:\"⊢\",RightTeeArrow:\"↦\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangle:\"⊳\",RightTriangleBar:\"⧐\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVector:\"↾\",RightUpVectorBar:\"⥔\",RightVector:\"⇀\",RightVectorBar:\"⥓\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"\",rmoust:\"⎱\",rmoustache:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",Ropf:\"ℝ\",ropf:\"������\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",Rscr:\"ℛ\",rscr:\"������\",Rsh:\"↱\",rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",Sc:\"⪼\",sc:\"≻\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",sccue:\"≽\",scE:\"⪴\",sce:\"⪰\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdot:\"⋅\",sdotb:\"⊡\",sdote:\"⩦\",searhk:\"⤥\",seArr:\"⇘\",searr:\"↘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"������\",sfr:\"������\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",sol:\"/\",solb:\"⧄\",solbar:\"⌿\",Sopf:\"������\",sopf:\"������\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",squ:\"□\",Square:\"□\",square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squf:\"▪\",srarr:\"→\",Sscr:\"������\",sscr:\"������\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",Sub:\"⋐\",sub:\"⊂\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",Subset:\"⋐\",subset:\"⊂\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succ:\"≻\",succapprox:\"⪸\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",Sum:\"∑\",sum:\"∑\",sung:\"♪\",Sup:\"⋑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",Supset:\"⋑\",supset:\"⊃\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swArr:\"⇙\",swarr:\"↙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"������\",tfr:\"������\",there4:\"∴\",Therefore:\"∴\",therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\" \",thinsp:\" \",ThinSpace:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",Tilde:\"∼\",tilde:\"˜\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",times:\"×\",timesb:\"⊠\",timesbar:\"⨱\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",top:\"⊤\",topbot:\"⌶\",topcir:\"⫱\",Topf:\"������\",topf:\"������\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",TRADE:\"™\",trade:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"������\",tscr:\"������\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",Uarr:\"↟\",uArr:\"⇑\",uarr:\"↑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"������\",ufr:\"������\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"������\",uopf:\"������\",UpArrow:\"↑\",Uparrow:\"⇑\",uparrow:\"↑\",UpArrowBar:\"⤒\",UpArrowDownArrow:\"⇅\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",updownarrow:\"↕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",Upsi:\"ϒ\",upsi:\"υ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTee:\"⊥\",UpTeeArrow:\"↥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"������\",uscr:\"������\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",vArr:\"⇕\",varr:\"↕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",Vbar:\"⫫\",vBar:\"⫨\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",VDash:\"⊫\",Vdash:\"⊩\",vDash:\"⊨\",vdash:\"⊢\",Vdashl:\"⫦\",Vee:\"⋁\",vee:\"∨\",veebar:\"⊻\",veeeq:\"≚\",vellip:\"⋮\",Verbar:\"‖\",verbar:\"|\",Vert:\"‖\",vert:\"|\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"������\",vfr:\"������\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"������\",vopf:\"������\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"������\",vscr:\"������\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",Wedge:\"⋀\",wedge:\"∧\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"������\",wfr:\"������\",Wopf:\"������\",wopf:\"������\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"������\",wscr:\"������\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"������\",xfr:\"������\",xhArr:\"⟺\",xharr:\"⟷\",Xi:\"Ξ\",xi:\"ξ\",xlArr:\"⟸\",xlarr:\"⟵\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"������\",xopf:\"������\",xoplus:\"⨁\",xotime:\"⨂\",xrArr:\"⟹\",xrarr:\"⟶\",Xscr:\"������\",xscr:\"������\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"������\",yfr:\"������\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"������\",yopf:\"������\",Yscr:\"������\",yscr:\"������\",YUcy:\"Ю\",yucy:\"ю\",Yuml:\"Ÿ\",yuml:\"ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"\",Zeta:\"Ζ\",zeta:\"ζ\",Zfr:\"ℨ\",zfr:\"������\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",Zopf:\"ℤ\",zopf:\"������\",Zscr:\"������\",zscr:\"������\",zwj:\"\",zwnj:\"\"},r=Object.prototype.hasOwnProperty;function n(e){return o=e,(n=t)&&r.call(n,o)?t[e]:e;var n,o}var o=Object.prototype.hasOwnProperty;function s(e,t){return!!e&&o.call(e,t)}function i(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach(function(r){e[r]=t[r]})}}),e}var a=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;function u(e){return e.indexOf(\"\\\\\")<0?e:e.replace(a,\"$1\")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function c(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}var p=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function f(e,t){var r=0,o=n(t);return t!==o?o:35===t.charCodeAt(0)&&h.test(t)&&l(r=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?c(r):e}function g(e){return e.indexOf(\"&\")<0?e:e.replace(p,f)}var d=/[&<>\"]/,m=/[&<>\"]/g,b={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\"};function v(e){return b[e]}function k(e){return d.test(e)?e.replace(m,v):e}var A=Object.freeze({isString:function(e){return\"[object String]\"===function(e){return Object.prototype.toString.call(e)}(e)},has:s,assign:i,unescapeMd:u,isValidEntityCode:l,fromCodePoint:c,replaceEntities:g,escapeHtml:k}),y={};y.blockquote_open=function(){return\"<blockquote>\\n\"},y.blockquote_close=function(e,t){return\"</blockquote>\"+x(e,t)},y.code=function(e,t){return e[t].block?\"<pre><code>\"+k(e[t].content)+\"</code></pre>\"+x(e,t):\"<code>\"+k(e[t].content)+\"</code>\"},y.fence=function(e,t,r,n,o){var i,a,l=e[t],c=\"\",p=r.langPrefix;if(l.params){if(a=(i=l.params.split(/\\s+/g)).join(\" \"),s(o.rules.fence_custom,i[0]))return o.rules.fence_custom[i[0]](e,t,r,n,o);c=' class=\"'+p+k(g(u(a)))+'\"'}return\"<pre><code\"+c+\">\"+(r.highlight&&r.highlight.apply(r.highlight,[l.content].concat(i))||k(l.content))+\"</code></pre>\"+x(e,t)},y.fence_custom={},y.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},y.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},y.hr=function(e,t,r){return(r.xhtmlOut?\"<hr />\":\"<hr>\")+x(e,t)},y.bullet_list_open=function(){return\"<ul>\\n\"},y.bullet_list_close=function(e,t){return\"</ul>\"+x(e,t)},y.list_item_open=function(){return\"<li>\"},y.list_item_close=function(){return\"</li>\\n\"},y.ordered_list_open=function(e,t){var r=e[t];return\"<ol\"+(r.order>1?' start=\"'+r.order+'\"':\"\")+\">\\n\"},y.ordered_list_close=function(e,t){return\"</ol>\"+x(e,t)},y.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},y.paragraph_close=function(e,t){var r=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(r?x(e,t):\"\")},y.link_open=function(e,t,r){var n=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\",o=r.linkTarget?' target=\"'+r.linkTarget+'\"':\"\";return'<a href=\"'+k(e[t].href)+'\"'+n+o+\">\"},y.link_close=function(){return\"</a>\"},y.image=function(e,t,r){var n=' src=\"'+k(e[t].src)+'\"',o=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\";return\"<img\"+n+(' alt=\"'+(e[t].alt?k(g(u(e[t].alt))):\"\")+'\"')+o+(r.xhtmlOut?\" /\":\"\")+\">\"},y.table_open=function(){return\"<table>\\n\"},y.table_close=function(){return\"</table>\\n\"},y.thead_open=function(){return\"<thead>\\n\"},y.thead_close=function(){return\"</thead>\\n\"},y.tbody_open=function(){return\"<tbody>\\n\"},y.tbody_close=function(){return\"</tbody>\\n\"},y.tr_open=function(){return\"<tr>\"},y.tr_close=function(){return\"</tr>\\n\"},y.th_open=function(e,t){var r=e[t];return\"<th\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.th_close=function(){return\"</th>\"},y.td_open=function(e,t){var r=e[t];return\"<td\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.td_close=function(){return\"</td>\"},y.strong_open=function(){return\"<strong>\"},y.strong_close=function(){return\"</strong>\"},y.em_open=function(){return\"<em>\"},y.em_close=function(){return\"</em>\"},y.del_open=function(){return\"<del>\"},y.del_close=function(){return\"</del>\"},y.ins_open=function(){return\"<ins>\"},y.ins_close=function(){return\"</ins>\"},y.mark_open=function(){return\"<mark>\"},y.mark_close=function(){return\"</mark>\"},y.sub=function(e,t){return\"<sub>\"+k(e[t].content)+\"</sub>\"},y.sup=function(e,t){return\"<sup>\"+k(e[t].content)+\"</sup>\"},y.hardbreak=function(e,t,r){return r.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},y.softbreak=function(e,t,r){return r.breaks?r.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},y.text=function(e,t){return k(e[t].content)},y.htmlblock=function(e,t){return e[t].content},y.htmltag=function(e,t){return e[t].content},y.abbr_open=function(e,t){return'<abbr title=\"'+k(g(e[t].title))+'\">'},y.abbr_close=function(){return\"</abbr>\"},y.footnote_ref=function(e,t){var r=Number(e[t].id+1).toString(),n=\"fnref\"+r;return e[t].subId>0&&(n+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+r+'\" id=\"'+n+'\">['+r+\"]</a></sup>\"},y.footnote_block_open=function(e,t,r){return(r.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n')+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},y.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},y.footnote_open=function(e,t){return'<li id=\"fn'+Number(e[t].id+1).toString()+'\" class=\"footnote-item\">'},y.footnote_close=function(){return\"</li>\\n\"},y.footnote_anchor=function(e,t){var r=\"fnref\"+Number(e[t].id+1).toString();return e[t].subId>0&&(r+=\":\"+e[t].subId),' <a href=\"#'+r+'\" class=\"footnote-backref\">↩</a>'},y.dl_open=function(){return\"<dl>\\n\"},y.dt_open=function(){return\"<dt>\"},y.dd_open=function(){return\"<dd>\"},y.dl_close=function(){return\"</dl>\\n\"},y.dt_close=function(){return\"</dt>\\n\"},y.dd_close=function(){return\"</dd>\\n\"};var x=y.getBreak=function(e,t){return(t=function e(t,r){return++r>=t.length-2?r:\"paragraph_open\"===t[r].type&&t[r].tight&&\"inline\"===t[r+1].type&&0===t[r+1].content.length&&\"paragraph_close\"===t[r+2].type&&t[r+2].tight?e(t,r+2):r}(e,t))<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};function w(){this.rules=i({},y),this.getBreak=y.getBreak}function C(){this.__rules__=[],this.__cache__=null}function E(e,t,r,n,o){this.src=e,this.env=n,this.options=r,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}function D(e,t){var r,n,o,s=-1,i=e.posMax,a=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,r=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))r++;else if(93===o&&0===--r){n=!0;break}e.parser.skipToken(e)}return n?(s=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=r-1,e.pos=a,e.isInLabel=u,s}function _(e,t,r,n){var o,s,i,a,u,l;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),1))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,s),0===(l=e.slice(s+2,i).trim()).length?-1:(n.abbreviations||(n.abbreviations={}),void 0===n.abbreviations[\":\"+u]&&(n.abbreviations[\":\"+u]=l),i)}function B(e){var t=g(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function q(e,t){var r,n,o,s=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(r=e.src.charCodeAt(t)))return!1;if(62===r)return o=B(u(e.src.slice(s+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===r&&t+1<i?t+=2:t++}return!1}for(n=0;t<i&&32!==(r=e.src.charCodeAt(t))&&!(r<32||127===r);)if(92===r&&t+1<i)t+=2;else{if(40===r&&++n>1)break;if(41===r&&--n<0)break;t++}return s!==t&&(o=u(e.src.slice(s,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function F(e,t){var r,n=t,o=e.posMax,s=e.src.charCodeAt(t);if(34!==s&&39!==s&&40!==s)return!1;for(t++,40===s&&(s=41);t<o;){if((r=e.src.charCodeAt(t))===s)return e.pos=t+1,e.linkContent=u(e.src.slice(n+1,t)),!0;92===r&&t+1<o?t+=2:t++}return!1}function M(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}function S(e,t,r,n){var o,s,i,a,u,l,c,p,h;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),0))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!q(o,i))return-1;for(c=o.linkContent,l=i=o.pos,i+=1;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<a&&l!==i&&F(o,i)?(p=o.linkContent,i=o.pos):(p=\"\",i=l);i<a&&32===o.src.charCodeAt(i);)i++;return i<a&&10!==o.src.charCodeAt(i)?-1:(h=M(e.slice(1,s)),void 0===n.references[h]&&(n.references[h]={title:p,href:c}),i)}w.prototype.renderInline=function(e,t,r){for(var n=this.rules,o=e.length,s=0,i=\"\";o--;)i+=n[e[s].type](e,s++,t,r,this);return i},w.prototype.render=function(e,t,r){for(var n=this.rules,o=e.length,s=-1,i=\"\";++s<o;)\"inline\"===e[s].type?i+=this.renderInline(e[s].children,t,r):i+=n[e[s].type](e,s,t,r,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,r=-1;t--;)if(this.__rules__[++r].name===e)return r;return-1},C.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach(function(e){e.enabled&&e.alt.forEach(function(e){t.indexOf(e)<0&&t.push(e)})}),e.__cache__={},t.forEach(function(t){e.__cache__[t]=[],e.__rules__.forEach(function(r){r.enabled&&(t&&r.alt.indexOf(t)<0||e.__cache__[t].push(r.fn))})})},C.prototype.at=function(e,t,r){var n=this.__find__(e),o=r||{};if(-1===n)throw new Error(\"Parser rule not found: \"+e);this.__rules__[n].fn=t,this.__rules__[n].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,r){var n=r||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:n.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach(function(e){e.enabled=!1}),e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0},this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1},this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},E.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},E.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},E.prototype.cacheSet=function(e,t){for(var r=this.cache.length;r<=e;r++)this.cache.push(0);this.cache[e]=t},E.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var T=\" \\n()[]'\\\".,!?-\";function L(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var R=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,N=/\\((c|tm|r|p)\\)/gi,z={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};var P=/['\"]/,j=/['\"]/g,I=/[-\\s()\\[\\]]/,O=\"’\";function U(e,t){return!(t<0||t>=e.length)&&!I.test(e[t])}function H(e,t,r){return e.substr(0,t)+r+e.substr(t+1)}var V=[[\"block\",function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],[\"abbr\",function(e){var t,r,n,o,s=e.tokens;if(!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"paragraph_open\"===s[t-1].type&&\"inline\"===s[t].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=_(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"references\",function(e){var t,r,n,o,s=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"inline\"===s[t].type&&\"paragraph_open\"===s[t-1].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=S(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"inline\",function(e){var t,r,n,o=e.tokens;for(r=0,n=o.length;r<n;r++)\"inline\"===(t=o[r]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],[\"footnote_tail\",function(e){var t,r,n,o,s,i,a,u,l,c=0,p=!1,h={};if(e.env.footnotes&&(e.tokens=e.tokens.filter(function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],l=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,h[\":\"+l]=u,!1):(p&&u.push(e),!p)}),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:c++}),t=0,r=i.length;t<r;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:c++}),i[t].tokens?((a=[]).push({type:\"paragraph_open\",tight:!1,level:c++}),a.push({type:\"inline\",content:\"\",level:c,children:i[t].tokens}),a.push({type:\"paragraph_close\",tight:!1,level:--c})):i[t].label&&(a=h[\":\"+i[t].label]),e.tokens=e.tokens.concat(a),s=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,n=0;n<o;n++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:n,level:c});s&&e.tokens.push(s),e.tokens.push({type:\"footnote_close\",level:--c})}e.tokens.push({type:\"footnote_block_close\",level:--c})}}],[\"abbr2\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(h=\"(^|[\"+T.split(\"\").map(L).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map(function(e){return e.substr(1)}).sort(function(e,t){return t.length-e.length}).map(L).join(\"|\")+\")($|[\"+T.split(\"\").map(L).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(h,\"g\")),c=e.env.abbrRegExp,r=0,n=f.length;r<n;r++)if(\"inline\"===f[r].type)for(t=(o=f[r].children).length-1;t>=0;t--)if(\"text\"===(s=o[t]).type){for(u=0,i=s.content,c.lastIndex=0,l=s.level,a=[];p=c.exec(i);)c.lastIndex>u&&a.push({type:\"text\",content:i.slice(u,p.index+p[1].length),level:l}),a.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+p[2]],level:l++}),a.push({type:\"text\",content:p[2],level:l}),a.push({type:\"abbr_close\",level:--l}),u=c.lastIndex-p[3].length;a.length&&(u<i.length&&a.push({type:\"text\",content:i.slice(u),level:l}),f[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1)))}}],[\"replacements\",function(e){var t,r,n,o,s,i;if(e.options.typographer)for(s=e.tokens.length-1;s>=0;s--)if(\"inline\"===e.tokens[s].type)for(t=(o=e.tokens[s].children).length-1;t>=0;t--)\"text\"===(r=o[t]).type&&(n=r.content,n=(i=n).indexOf(\"(\")<0?i:i.replace(N,function(e,t){return z[t.toLowerCase()]}),R.test(n)&&(n=n.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),r.content=n)}],[\"smartquotes\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(e.options.typographer)for(b=[],d=e.tokens.length-1;d>=0;d--)if(\"inline\"===e.tokens[d].type)for(m=e.tokens[d].children,b.length=0,t=0;t<m.length;t++)if(\"text\"===(r=m[t]).type&&!P.test(r.text)){for(a=m[t].level,f=b.length-1;f>=0&&!(b[f].level<=a);f--);b.length=f+1,s=0,i=(n=r.content).length;e:for(;s<i&&(j.lastIndex=s,o=j.exec(n));)if(u=!U(n,o.index-1),s=o.index+1,g=\"'\"===o[0],(l=!U(n,s))||u){if(p=!l,h=!u)for(f=b.length-1;f>=0&&(c=b[f],!(b[f].level<a));f--)if(c.single===g&&b[f].level===a){c=b[f],g?(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[2]),r.content=H(r.content,o.index,e.options.quotes[3])):(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[0]),r.content=H(r.content,o.index,e.options.quotes[1])),b.length=f;continue e}p?b.push({token:t,pos:o.index,single:g,level:a}):h&&g&&(r.content=H(r.content,o.index,O))}else g&&(r.content=H(r.content,o.index,O))}}]];function G(){this.options={},this.ruler=new C;for(var e=0;e<V.length;e++)this.ruler.push(V[e][0],V[e][1])}function $(e,t,r,n,o){var s,i,a,u,l,c,p;for(this.src=e,this.parser=t,this.options=r,this.env=n,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",c=0,p=!1,a=u=c=0,l=(i=this.src).length;u<l;u++){if(s=i.charCodeAt(u),!p){if(32===s){c++;continue}p=!0}10!==s&&u!==l-1||(10!==s&&u++,this.bMarks.push(a),this.eMarks.push(u),this.tShift.push(c),p=!1,c=0,a=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function Z(e,t){var r,n,o;return(n=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])?-1:42!==(r=e.src.charCodeAt(n++))&&45!==r&&43!==r?-1:n<o&&32!==e.src.charCodeAt(n)?-1:n}function W(e,t){var r,n=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(n+1>=o)return-1;if((r=e.src.charCodeAt(n++))<48||r>57)return-1;for(;;){if(n>=o)return-1;if(!((r=e.src.charCodeAt(n++))>=48&&r<=57)){if(41===r||46===r)break;return-1}}return n<o&&32!==e.src.charCodeAt(n)?-1:n}G.prototype.process=function(e){var t,r,n;for(t=0,r=(n=this.ruler.getRules(\"\")).length;t<r;t++)n[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var r=this.src.length;e<r&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,r){if(e<=r)return e;for(;e>r;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,r,n){var o,s,i,a,u,l=e;if(e>=t)return\"\";if(l+1===t)return s=this.bMarks[l]+Math.min(this.tShift[l],r),i=n?this.eMarks[l]+1:this.eMarks[l],this.src.slice(s,i);for(a=new Array(t-e),o=0;l<t;l++,o++)(u=this.tShift[l])>r&&(u=r),u<0&&(u=0),s=this.bMarks[l]+u,i=l+1<t||n?this.eMarks[l]+1:this.eMarks[l],a[o]=this.src.slice(s,i);return a.join(\"\")};var J={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach(function(e){J[e]=!0});var Y=/^<([a-zA-Z]{1,15})[\\s\\/>]/,K=/^<\\/([a-zA-Z]{1,15})[\\s>]/;function Q(e,t){var r=e.bMarks[t]+e.blkIndent,n=e.eMarks[t];return e.src.substr(r,n-r)}function X(e,t){var r,n,o=e.bMarks[t]+e.tShift[t],s=e.eMarks[t];return o>=s?-1:126!==(n=e.src.charCodeAt(o++))&&58!==n?-1:o===(r=e.skipSpaces(o))?-1:r>=s?-1:r}var ee=[[\"code\",function(e,t,r){var n,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=n=t+1;n<r;)if(e.isEmpty(n))n++;else{if(!(e.tShift[n]-e.blkIndent>=4))break;o=++n}return e.line=n,e.tokens.push({type:\"code\",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],[\"fences\",function(e,t,r,n){var o,s,i,a,u,l=!1,c=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(c+3>p)return!1;if(126!==(o=e.src.charCodeAt(c))&&96!==o)return!1;if(u=c,(s=(c=e.skipChars(c,o))-u)<3)return!1;if((i=e.src.slice(c,p).trim()).indexOf(\"`\")>=0)return!1;if(n)return!0;for(a=t;!(++a>=r||(c=u=e.bMarks[a]+e.tShift[a])<(p=e.eMarks[a])&&e.tShift[a]<e.blkIndent);)if(e.src.charCodeAt(c)===o&&!(e.tShift[a]-e.blkIndent>=4||(c=e.skipChars(c,o))-u<s||(c=e.skipSpaces(c))<p)){l=!0;break}return s=e.tShift[t],e.line=a+(l?1:0),e.tokens.push({type:\"fence\",params:i,content:e.getLines(t+1,a,s,!0),lines:[t,e.line],level:e.level}),!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d=e.bMarks[t]+e.tShift[t],m=e.eMarks[t];if(d>m)return!1;if(62!==e.src.charCodeAt(d++))return!1;if(e.level>=e.options.maxNesting)return!1;if(n)return!0;for(32===e.src.charCodeAt(d)&&d++,u=e.blkIndent,e.blkIndent=0,a=[e.bMarks[t]],e.bMarks[t]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i=[e.tShift[t]],e.tShift[t]=d-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),o=t+1;o<r&&!((d=e.bMarks[o]+e.tShift[o])>=(m=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(d++)){if(s)break;for(g=!1,h=0,f=p.length;h<f;h++)if(p[h](e,o,r,!0)){g=!0;break}if(g)break;a.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(d)&&d++,a.push(e.bMarks[o]),e.bMarks[o]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i.push(e.tShift[o]),e.tShift[o]=d-e.bMarks[o];for(l=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:c=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=l,c[1]=e.line,h=0;h<i.length;h++)e.bMarks[h+t]=a[h],e.tShift[h+t]=i[h];return e.blkIndent=u,!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t];if((a+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(a++))&&45!==o&&95!==o)return!1;for(s=1;a<u;){if((i=e.src.charCodeAt(a++))!==o&&32!==i)return!1;i===o&&s++}return!(s<3||!n&&(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level}),0))},[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b,v,k,A,y,x,w,C,E=!0;if((p=W(e,t))>=0)d=!0;else{if(!((p=Z(e,t))>=0))return!1;d=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(p-1),n)return!0;for(b=e.tokens.length,d?(c=e.bMarks[t]+e.tShift[t],f=Number(e.src.substr(c,p-c-1)),e.tokens.push({type:\"ordered_list_open\",order:f,lines:k=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:k=[t,0],level:e.level++}),o=t,v=!1,y=e.parser.ruler.getRules(\"list\");!(!(o<r)||((h=(m=e.skipSpaces(p))>=e.eMarks[o]?1:m-p)>4&&(h=1),h<1&&(h=1),s=p-e.bMarks[o]+h,e.tokens.push({type:\"list_item_open\",lines:A=[t,0],level:e.level++}),a=e.blkIndent,u=e.tight,i=e.tShift[t],l=e.parentType,e.tShift[t]=m-e.bMarks[t],e.blkIndent=s,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,r,!0),e.tight&&!v||(E=!1),v=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=a,e.tShift[t]=i,e.tight=u,e.parentType=l,e.tokens.push({type:\"list_item_close\",level:--e.level}),o=t=e.line,A[1]=o,m=e.bMarks[t],o>=r)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(C=!1,x=0,w=y.length;x<w;x++)if(y[x](e,o,r,!0)){C=!0;break}if(C)break;if(d){if((p=W(e,o))<0)break}else if((p=Z(e,o))<0)break;if(g!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:d?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),k[1]=o,e.line=o,E&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,b),!0},[\"paragraph\",\"blockquote\"]],[\"footnote\",function(e,t,r,n){var o,s,i,a,u,l=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(l+4>c)return!1;if(91!==e.src.charCodeAt(l))return!1;if(94!==e.src.charCodeAt(l+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(a=l+2;a<c;a++){if(32===e.src.charCodeAt(a))return!1;if(93===e.src.charCodeAt(a))break}return!(a===l+2||a+1>=c||58!==e.src.charCodeAt(++a)||!n&&(a++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(l+2,a-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),o=e.bMarks[t],s=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(a)-a,e.bMarks[t]=a,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,r,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=s,e.bMarks[t]=o,e.tokens.push({type:\"footnote_reference_close\",level:--e.level}),0))},[\"paragraph\"]],[\"heading\",function(e,t,r,n){var o,s,i,a=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(a>=u)return!1;if(35!==(o=e.src.charCodeAt(a))||a>=u)return!1;for(s=1,o=e.src.charCodeAt(++a);35===o&&a<u&&s<=6;)s++,o=e.src.charCodeAt(++a);return!(s>6||a<u&&32!==o||!n&&(u=e.skipCharsBack(u,32,a),(i=e.skipCharsBack(u,35,a))>a&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:s,lines:[t,e.line],level:e.level}),a<u&&e.tokens.push({type:\"inline\",content:e.src.slice(a,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:s,level:e.level}),0))},[\"paragraph\",\"blockquote\"]],[\"lheading\",function(e,t,r){var n,o,s,i=t+1;return!(i>=r||e.tShift[i]<e.blkIndent||e.tShift[i]-e.blkIndent>3||(o=e.bMarks[i]+e.tShift[i])>=(s=e.eMarks[i])||45!==(n=e.src.charCodeAt(o))&&61!==n||(o=e.skipChars(o,n),(o=e.skipSpaces(o))<s||(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:\"heading_open\",hLevel:61===n?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===n?1:2,level:e.level}),0)))}],[\"htmlblock\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t],l=e.tShift[t];if(a+=l,!e.options.html)return!1;if(l>3||a+2>=u)return!1;if(60!==e.src.charCodeAt(a))return!1;if(33===(o=e.src.charCodeAt(a+1))||63===o){if(n)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(s=e.src.slice(a,u).match(K)))return!1}else if(!(s=e.src.slice(a,u).match(Y)))return!1;if(!0!==J[s[1].toLowerCase()])return!1;if(n)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},[\"paragraph\",\"blockquote\"]],[\"table\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g;if(t+2>r)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(s=Q(e,t+1),!/^[-:| ]+$/.test(s))return!1;if((l=s.split(\"|\"))<=2)return!1;for(p=[],a=0;a<l.length;a++){if(!(h=l[a].trim())){if(0===a||a===l.length-1)continue;return!1}if(!/^:?-+:?$/.test(h))return!1;58===h.charCodeAt(h.length-1)?p.push(58===h.charCodeAt(0)?\"center\":\"right\"):58===h.charCodeAt(0)?p.push(\"left\"):p.push(\"\")}if(-1===(s=Q(e,t).trim()).indexOf(\"|\"))return!1;if(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),p.length!==l.length)return!1;if(n)return!0;for(e.tokens.push({type:\"table_open\",lines:f=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"th_open\",align:p[a],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:l[a].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:g=[t+2,0],level:e.level++}),u=t+2;u<r&&!(e.tShift[u]<e.blkIndent)&&-1!==(s=Q(e,u).trim()).indexOf(\"|\");u++){for(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"td_open\",align:p[a],level:e.level++}),c=l[a].substring(124===l[a].charCodeAt(0)?1:0,124===l[a].charCodeAt(l[a].length-1)?l[a].length-1:l[a].length).trim(),e.tokens.push({type:\"inline\",content:c,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),f[1]=g[1]=u,e.line=u,!0},[\"paragraph\"]],[\"deflist\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(n)return!(e.ddIndent<0)&&X(e,t)>=0;if(c=t+1,e.isEmpty(c)&&++c>r)return!1;if(e.tShift[c]<e.blkIndent)return!1;if((o=X(e,c))<0)return!1;if(e.level>=e.options.maxNesting)return!1;l=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:u=[t,0],level:e.level++}),i=t,s=c;e:for(;;){for(b=!0,m=!1,e.tokens.push({type:\"dt_open\",lines:[i,i],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:a=[c,0],level:e.level++}),d=e.tight,h=e.ddIndent,p=e.blkIndent,g=e.tShift[s],f=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=o-e.bMarks[s],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,s,r,!0),e.tight&&!m||(b=!1),m=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=g,e.tight=d,e.parentType=f,e.blkIndent=p,e.ddIndent=h,e.tokens.push({type:\"dd_close\",level:--e.level}),a[1]=c=e.line,c>=r)break e;if(e.tShift[c]<e.blkIndent)break e;if((o=X(e,c))<0)break;s=c}if(c>=r)break;if(i=c,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((s=i+1)>=r)break;if(e.isEmpty(s)&&s++,s>=r)break;if(e.tShift[s]<e.blkIndent)break;if((o=X(e,s))<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),u[1]=c,e.line=c,b&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,l),!0},[\"paragraph\"]],[\"paragraph\",function(e,t){var r,n,o,s,i,a,u=t+1;if(u<(r=e.lineMax)&&!e.isEmpty(u))for(a=e.parser.ruler.getRules(\"paragraph\");u<r&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,s=0,i=a.length;s<i;s++)if(a[s](e,u,r,!0)){o=!0;break}if(o)break}return n=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,n.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:n,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,r){for(var n,o=this.ruler.getRules(\"\"),s=o.length,i=t,a=!1;i<r&&(e.line=i=e.skipEmptyLines(i),!(i>=r))&&!(e.tShift[i]<e.blkIndent);){for(n=0;n<s&&!o[n](e,i,r,!1);n++);if(e.tight=!a,e.isEmpty(e.line-1)&&(a=!0),(i=e.line)<r&&e.isEmpty(i)){if(a=!0,++i<r&&\"list\"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var re=/[\\n\\t]/g,ne=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,oe=/\\u00a0/g;function se(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,r,n){var o,s=0,i=0;if(!e)return[];(e=(e=e.replace(oe,\" \")).replace(ne,\"\\n\")).indexOf(\"\\t\")>=0&&(e=e.replace(re,function(t,r){var n;return 10===e.charCodeAt(r)?(s=r+1,i=0,t):(n=\" \".slice((r-s-i)%4),i=r-s+1,n)})),o=new $(e,this,t,r,n),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],ae=0;ae<256;ae++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function le(e,t){var r,n,o,s=t,i=!0,a=!0,u=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;s<u&&e.src.charCodeAt(s)===l;)s++;return s>=u&&(i=!1),(o=s-t)>=4?i=a=!1:(32!==(n=s<u?e.src.charCodeAt(s):-1)&&10!==n||(i=!1),32!==r&&10!==r||(a=!1),95===l&&(ue(r)&&(i=!1),ue(n)&&(a=!1))),{can_open:i,can_close:a,delims:o}}\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach(function(e){ie[e.charCodeAt(0)]=1});var ce=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var pe=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var he=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"],fe=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,ge=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;function de(e,t){return e=e.source,t=t||\"\",function r(n,o){return n?(o=o.source||o,e=e.replace(n,o),r):new RegExp(e,t)}}var me=de(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",/[^\"'=<>`\\x00-\\x20]+/)(\"single_quoted\",/'[^']*'/)(\"double_quoted\",/\"[^\"]*\"/)(),be=de(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)(\"attr_value\",me)(),ve=de(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",be)(),ke=de(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",ve)(\"close_tag\",/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/)(\"comment\",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)(\"processing\",/<[?].*?[?]>/)(\"declaration\",/<![A-Z]+\\s+[^>]*>/)(\"cdata\",/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/)();var Ae=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,ye=/^&([a-z][a-z0-9]{1,31});/i;var xe=[[\"text\",function(e,t){for(var r=e.pos;r<e.posMax&&!se(e.src.charCodeAt(r));)r++;return r!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,r)),e.pos=r,!0)}],[\"newline\",function(e,t){var r,n,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(r=e.pending.length-1,n=e.posMax,!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){for(var s=r-2;s>=0;s--)if(32!==e.pending.charCodeAt(s)){e.pending=e.pending.substring(0,s+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(o++;o<n&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],[\"escape\",function(e,t){var r,n=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(n))return!1;if(++n<o){if((r=e.src.charCodeAt(n))<256&&0!==ie[r])return t||(e.pending+=e.src[n]),e.pos+=2,!0;if(10===r){for(t||e.push({type:\"hardbreak\",level:e.level}),n++;n<o&&32===e.src.charCodeAt(n);)n++;return e.pos=n,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}],[\"backticks\",function(e,t){var r,n,o,s,i,a=e.pos;if(96!==e.src.charCodeAt(a))return!1;for(r=a,a++,n=e.posMax;a<n&&96===e.src.charCodeAt(a);)a++;for(o=e.src.slice(r,a),s=i=a;-1!==(s=e.src.indexOf(\"`\",i));){for(i=s+1;i<n&&96===e.src.charCodeAt(i);)i++;if(i-s===o.length)return t||e.push({type:\"code\",content:e.src.slice(a,s).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],[\"del\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===s)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&126===e.src.charCodeAt(n);)n++;if(n>u+3)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&126!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"ins\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===s)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&43===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&43!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"mark\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===s)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&61===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&61!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"emphasis\",function(e,t){var r,n,o,s,i,a,u,l=e.posMax,c=e.pos,p=e.src.charCodeAt(c);if(95!==p&&42!==p)return!1;if(t)return!1;if(r=(u=le(e,c)).delims,!u.can_open)return e.pos+=r,t||(e.pending+=e.src.slice(c,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=c+r,a=[r];e.pos<l;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(n=(u=le(e,e.pos)).delims,u.can_close){for(s=a.pop(),i=n;s!==i;){if(i<s){a.push(s-i);break}if(i-=s,0===a.length)break;e.pos+=s,s=a.pop()}if(0===a.length){r=s,o=!0;break}e.pos+=n;continue}u.can_open&&a.push(n),e.pos+=n}return o?(e.posMax=e.pos,e.pos=c+r,t||(2!==r&&3!==r||e.push({type:\"strong_open\",level:e.level++}),1!==r&&3!==r||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==r&&3!==r||e.push({type:\"em_close\",level:--e.level}),2!==r&&3!==r||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+r,e.posMax=l,!0):(e.pos=c,!1)}],[\"sub\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(126!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sub\",level:e.level,content:n.replace(ce,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"sup\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(94!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sup\",level:e.level,content:n.replace(pe,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"links\",function(e,t){var r,n,o,s,i,a,u,l,c=!1,p=e.pos,h=e.posMax,f=e.pos,g=e.src.charCodeAt(f);if(33===g&&(c=!0,g=e.src.charCodeAt(++f)),91!==g)return!1;if(e.level>=e.options.maxNesting)return!1;if(r=f+1,(n=D(e,f))<0)return!1;if((a=n+1)<h&&40===e.src.charCodeAt(a)){for(a++;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a>=h)return!1;for(f=a,q(e,a)?(s=e.linkContent,a=e.pos):s=\"\",f=a;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&f!==a&&F(e,a))for(i=e.linkContent,a=e.pos;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);else i=\"\";if(a>=h||41!==e.src.charCodeAt(a))return e.pos=p,!1;a++}else{if(e.linkLevel>0)return!1;for(;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&91===e.src.charCodeAt(a)&&(f=a+1,(a=D(e,a))>=0?o=e.src.slice(f,a++):a=f-1),o||(void 0===o&&(a=n+1),o=e.src.slice(r,n)),!(u=e.env.references[M(o)]))return e.pos=p,!1;s=u.href,i=u.title}return t||(e.pos=r,e.posMax=n,c?e.push({type:\"image\",src:s,title:i,alt:e.src.substr(r,n-r),level:e.level}):(e.push({type:\"link_open\",href:s,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=a,e.posMax=h,!0}],[\"footnote_inline\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;return!(a+2>=i||94!==e.src.charCodeAt(a)||91!==e.src.charCodeAt(a+1)||e.level>=e.options.maxNesting||(r=a+2,(n=D(e,a+1))<0||(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=r,e.posMax=n,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,s=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(s)},e.linkLevel--),e.pos=n+1,e.posMax=i,0)))}],[\"footnote_ref\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;if(a+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(a))return!1;if(94!==e.src.charCodeAt(a+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(n=a+2;n<i;n++){if(32===e.src.charCodeAt(n))return!1;if(10===e.src.charCodeAt(n))return!1;if(93===e.src.charCodeAt(n))break}return!(n===a+2||n>=i||(n++,r=e.src.slice(a+2,n-1),void 0===e.env.footnotes.refs[\":\"+r]||(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+r]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:r,count:0},e.env.footnotes.refs[\":\"+r]=o):o=e.env.footnotes.refs[\":\"+r],s=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:\"footnote_ref\",id:o,subId:s,level:e.level})),e.pos=n,e.posMax=i,0)))}],[\"autolink\",function(e,t){var r,n,o,s,i,a=e.pos;return!(60!==e.src.charCodeAt(a)||(r=e.src.slice(a)).indexOf(\">\")<0||((n=r.match(ge))?he.indexOf(n[1].toLowerCase())<0||(i=B(s=n[0].slice(1,-1)),!e.parser.validateLink(s)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=n[0].length,0)):!(o=r.match(fe))||(i=B(\"mailto:\"+(s=o[0].slice(1,-1))),!e.parser.validateLink(i)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=o[0].length,0))))}],[\"htmltag\",function(e,t){var r,n,o,s=e.pos;return!(!e.options.html||(o=e.posMax,60!==e.src.charCodeAt(s)||s+2>=o||33!==(r=e.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(e){var t=32|e;return t>=97&&t<=122}(r)||!(n=e.src.slice(s).match(ke))||(t||e.push({type:\"htmltag\",content:e.src.slice(s,s+n[0].length),level:e.level}),e.pos+=n[0].length,0)))}],[\"entity\",function(e,t){var r,o,s=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(s))return!1;if(s+1<i)if(35===e.src.charCodeAt(s+1)){if(o=e.src.slice(s).match(Ae))return t||(r=\"x\"===o[1][0].toLowerCase()?parseInt(o[1].slice(1),16):parseInt(o[1],10),e.pending+=l(r)?c(r):c(65533)),e.pos+=o[0].length,!0}else if(o=e.src.slice(s).match(ye)){var a=n(o[1]);if(o[1]!==a)return t||(e.pending+=a),e.pos+=o[0].length,!0}return t||(e.pending+=\"&\"),e.pos++,!0}]];function we(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Ce}function Ce(e){var t=e.trim().toLowerCase();return-1===(t=g(t)).indexOf(\":\")||-1===[\"vbscript\",\"javascript\",\"file\",\"data\"].indexOf(t.split(\":\")[0])}we.prototype.skipToken=function(e){var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.pos;if((r=e.cacheGet(s))>0)e.pos=r;else{for(t=0;t<o;t++)if(n[t](e,!0))return void e.cacheSet(s,e.pos);e.pos++,e.cacheSet(s,e.pos)}},we.prototype.tokenize=function(e){for(var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.posMax;e.pos<s;){for(r=0;r<o&&!(t=n[r](e,!1));r++);if(t){if(e.pos>=s)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},we.prototype.parse=function(e,t,r,n){var o=new E(e,this,t,r,n);this.tokenize(o)};var Ee={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}};function De(e,t,r){this.src=t,this.env=r,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function _e(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),t&&null!=t.linkify&&console.warn(\"linkify option is removed. Use linkify plugin instead:\\n\\nimport Remarkable from 'remarkable';\\nimport linkify from 'remarkable/linkify';\\nnew Remarkable().use(linkify)\\n\"),this.inline=new we,this.block=new te,this.core=new G,this.renderer=new w,this.ruler=new C,this.options={},this.configure(Ee[e]),this.set(t||{})}function Be(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}function qe(e,t){for(var r=e.length-1;r>=0;r--)!0===t(e[r])&&e.splice(r,1)}function Fe(e){throw new Error(\"Unhandled case for value: '\"+e+\"'\")}_e.prototype.set=function(e){i(this.options,e)},_e.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enable(e.components[r].rules,!0)})},_e.prototype.use=function(e,t){return e(this,t),this},_e.prototype.parse=function(e,t){var r=new De(this,e,t);return this.core.process(r),r.tokens},_e.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},_e.prototype.parseInline=function(e,t){var r=new De(this,e,t);return r.inlineMode=!0,this.core.process(r),r.tokens},_e.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Me=function(){function e(e){void 0===e&&(e={}),this.tagName=\"\",this.attrs={},this.innerHTML=\"\",this.whitespaceRegex=/\\s+/,this.tagName=e.tagName||\"\",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||\"\"}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||\"\"},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr(\"class\",e)},e.prototype.addClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);t=s.shift();)-1===Be(o,t)&&o.push(t);return this.getAttrs().class=o.join(\" \"),this},e.prototype.removeClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);o.length&&(t=s.shift());){var i=Be(o,t);-1!==i&&o.splice(i,1)}return this.getAttrs().class=o.join(\" \"),this},e.prototype.getClass=function(){return this.getAttrs().class||\"\"},e.prototype.hasClass=function(e){return-1!==(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||\"\"},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return[\"<\",e,t=t?\" \"+t:\"\",\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+'=\"'+e[r]+'\"');return t.join(\" \")},e}();var Se=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className=\"\",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||\"\"}return e.prototype.build=function(e){return new Me({tagName:\"a\",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},r=this.createCssClass(e);return r&&(t.class=r),this.newWindow&&(t.target=\"_blank\",t.rel=\"noopener noreferrer\"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var r=[t],n=e.getCssClassSuffixes(),o=0,s=n.length;o<s;o++)r.push(t+\"-\"+n[o]);return r.join(\" \")}return\"\"},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var r=t.length,n=t.location;return\"smart\"===n?function(e,t,r){var n,o;null==r?(r=\"…\",o=3,n=8):(o=r.length,n=r.length);var s=function(e){var t=\"\";return e.scheme&&e.host&&(t+=e.scheme+\"://\"),e.host&&(t+=e.host),e.path&&(t+=\"/\"+e.path),e.query&&(t+=\"?\"+e.query),e.fragment&&(t+=\"#\"+e.fragment),t},i=function(e,t){var n=t/2,o=Math.ceil(n),s=-1*Math.floor(n),i=\"\";return s<0&&(i=e.substr(s)),e.substr(0,o)+r+i};if(e.length<=t)return e;var a=t-o,u=function(e){var t={},r=e,n=r.match(/^([a-z]+):\\/\\//i);return n&&(t.scheme=n[1],r=r.substr(n[0].length)),(n=r.match(/^(.*?)(?=(\\?|#|\\/|$))/i))&&(t.host=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\/(.*?)(?=(\\?|#|$))/i))&&(t.path=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\?(.*?)(?=(#|$))/i))&&(t.query=n[1],r=r.substr(n[0].length)),(n=r.match(/^#(.*?)$/i))&&(t.fragment=n[1]),t}(e);if(u.query){var l=u.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);l&&(u.query=u.query.substr(0,l[1].length),e=s(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\\./,\"\"),e=s(u)),e.length<=t)return e;var c=\"\";if(u.host&&(c+=u.host),c.length>=a)return u.host.length==t?(u.host.substr(0,t-o)+r).substr(0,a+n):i(c,a).substr(0,a+n);var p=\"\";if(u.path&&(p+=\"/\"+u.path),u.query&&(p+=\"?\"+u.query),p){if((c+p).length>=a)return(c+p).length==t?(c+p).substr(0,t):(c+i(p,a-c.length)).substr(0,a+n);c+=p}if(u.fragment){var h=\"#\"+u.fragment;if((c+h).length>=a)return(c+h).length==t?(c+h).substr(0,t):(c+i(h,a-c.length)).substr(0,a+n);c+=h}if(u.scheme&&u.host){var f=u.scheme+\"://\";if((c+f).length<a)return(f+c).substr(0,t)}if(c.length<=t)return c;var g=\"\";return a>0&&(g=c.substr(-1*Math.floor(a/2))),(c.substr(0,Math.ceil(a/2))+r+g).substr(0,a+n)}(e,r):\"middle\"===n?function(e,t,r){if(e.length<=t)return e;var n,o;null==r?(r=\"…\",n=8,o=3):(n=r.length,o=r.length);var s=t-o,i=\"\";return s>0&&(i=e.substr(-1*Math.floor(s/2))),(e.substr(0,Math.ceil(s/2))+r+i).substr(0,s+n)}(e,r):function(e,t,r){return function(e,t,r){var n;return e.length>t&&(null==r?(r=\"…\",n=3):n=r.length,e=e.substring(0,t-n)+r),e}(e,t,r)}(e,r)},e}(),Te=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText=\"\",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),Le=function(e,t){return(Le=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function Re(e,t){function r(){this.constructor=e}Le(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var Ne=function(){return(Ne=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},ze=function(e){function t(t){var r=e.call(this,t)||this;return r.email=\"\",r.email=t.email,r}return Re(t,e),t.prototype.getType=function(){return\"email\"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return\"mailto:\"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(Te),Pe=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"\",r.hashtag=\"\",r.serviceName=t.serviceName,r.hashtag=t.hashtag,r}return Re(t,e),t.prototype.getType=function(){return\"hashtag\"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case\"twitter\":return\"https://twitter.com/hashtag/\"+t;case\"facebook\":return\"https://www.facebook.com/hashtag/\"+t;case\"instagram\":return\"https://instagram.com/explore/tags/\"+t;default:throw new Error(\"Unknown service name to point hashtag to: \"+e)}},t.prototype.getAnchorText=function(){return\"#\"+this.hashtag},t}(Te),je=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.mention=\"\",r.mention=t.mention,r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.getType=function(){return\"mention\"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case\"twitter\":return\"https://twitter.com/\"+this.mention;case\"instagram\":return\"https://instagram.com/\"+this.mention;case\"soundcloud\":return\"https://soundcloud.com/\"+this.mention;default:throw new Error(\"Unknown service name to point mention to: \"+this.serviceName)}},t.prototype.getAnchorText=function(){return\"@\"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),r=this.getServiceName();return r&&t.push(r),t},t}(Te),Ie=function(e){function t(t){var r=e.call(this,t)||this;return r.number=\"\",r.plusSign=!1,r.number=t.number,r.plusSign=t.plusSign,r}return Re(t,e),t.prototype.getType=function(){return\"phone\"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return\"tel:\"+(this.plusSign?\"+\":\"\")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(Te),Oe=function(e){function t(t){var r=e.call(this,t)||this;return r.url=\"\",r.urlMatchType=\"scheme\",r.protocolUrlMatch=!1,r.protocolRelativeMatch=!1,r.stripPrefix={scheme:!0,www:!0},r.stripTrailingSlash=!0,r.decodePercentEncoding=!0,r.schemePrefixRegex=/^(https?:\\/\\/)?/i,r.wwwPrefixRegex=/^(https?:\\/\\/)?(www\\.)?/i,r.protocolRelativeRegex=/^\\/\\//,r.protocolPrepended=!1,r.urlMatchType=t.urlMatchType,r.url=t.url,r.protocolUrlMatch=t.protocolUrlMatch,r.protocolRelativeMatch=t.protocolRelativeMatch,r.stripPrefix=t.stripPrefix,r.stripTrailingSlash=t.stripTrailingSlash,r.decodePercentEncoding=t.decodePercentEncoding,r}return Re(t,e),t.prototype.getType=function(){return\"url\"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&/g,\"&\")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,\"\")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,\"$1\")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,\"\")},t.prototype.removeTrailingSlash=function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,\""\").replace(/%26/gi,\"&\").replace(/%27/gi,\"'\").replace(/%3C/gi,\"<\").replace(/%3E/gi,\">\");try{return decodeURIComponent(t)}catch(e){return t}},t}(Te),Ue=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},He=/[A-Za-z]/,Ve=/[0-9]/,Ge=/\\s/,$e=/['\"]/,Ze=/[\\x00-\\x1F\\x7F]/,We=/A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source,Je=We+/\\u00a9\\u00ae\\u2000-\\u3300\\ud83c\\ud000-\\udfff\\ud83d\\ud000-\\udfff\\ud83e\\ud000-\\udfff/.source+/\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source,Ye=/0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source,Ke=Je+Ye,Qe=Je+Ye,Xe=\"(?:[\"+Ye+\"]{1,3}\\\\.){3}[\"+Ye+\"]{1,3}\",et=\"[\"+Qe+\"](?:[\"+Qe+\"\\\\-]{0,61}[\"+Qe+\"])?\",tt=function(e){return\"(?=(\"+et+\"))\\\\\"+e},rt=function(e){return\"(?:\"+tt(e)+\"(?:\\\\.\"+tt(e+1)+\"){0,126}|\"+Xe+\")\"},nt=new RegExp(\"[\"+Qe+\"]\"),ot=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,st=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=new RegExp(\"[\"+Qe+\"!#$%&'*+/=?^_`{|}~-]\"),t.strictTldRegex=new RegExp(\"^\"+ot.source+\"$\"),t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,r=this.localPartCharRegex,n=this.strictTldRegex,o=[],s=e.length,i=new it,a={m:\"a\",a:\"i\",i:\"l\",l:\"t\",t:\"o\",o:\":\"},u=0,l=0,c=i;u<s;){var p=e.charAt(u);switch(l){case 0:h(p);break;case 1:f(e.charAt(u-1),p);break;case 2:g(p);break;case 3:d(p);break;case 4:m(p);break;case 5:b(p);break;case 6:v(p);break;case 7:k(p);break;default:Fe(l)}u++}return x(),o;function h(e){\"m\"===e?A(1):r.test(e)&&A()}function f(e,t){\":\"===e?r.test(t)?(l=2,c=new it(Ne({},c,{hasMailtoPrefix:!0}))):y():a[e]===t||(r.test(t)?l=2:\".\"===t?l=3:\"@\"===t?l=4:y())}function g(e){\".\"===e?l=3:\"@\"===e?l=4:r.test(e)||y()}function d(e){\".\"===e?y():\"@\"===e?y():r.test(e)?l=2:y()}function m(e){nt.test(e)?l=5:y()}function b(e){\".\"===e?l=7:\"-\"===e?l=6:nt.test(e)||x()}function v(e){\"-\"===e||\".\"===e?x():nt.test(e)?l=5:x()}function k(e){\".\"===e||\"-\"===e?x():nt.test(e)?(l=5,c=new it(Ne({},c,{hasDomainDot:!0}))):x()}function A(e){void 0===e&&(e=2),l=e,c=new it({idx:u})}function y(){l=0,c=i}function x(){if(c.hasDomainDot){var r=e.slice(c.idx,u);/[-.]$/.test(r)&&(r=r.slice(0,-1));var s=c.hasMailtoPrefix?r.slice(\"mailto:\".length):r;(function(e){var t=(e.split(\".\").pop()||\"\").toLowerCase();return n.test(t)})(s)&&o.push(new ze({tagBuilder:t,matchedText:r,offset:c.idx,email:s}))}y()}},t}(Ue),it=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},at=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split(\"://\")[1]),t.split(\"/\")[0].indexOf(\"..\")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),r=t&&t[0].toLowerCase();return\"javascript:\"!==r&&\"vbscript:\"!==r},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf(\".\"))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(\":[^\\\\s]*?[\"+We+\"]\"),e.ipRegex=/[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,e}(),ut=function(e){function t(t){var r,n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=(r=new RegExp(\"[/?#](?:[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]?!:,.;✓]*[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]✓])?\"),new RegExp([\"(?:\",\"(\",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/.source,rt(2),\")\",\"|\",\"(\",\"(//)?\",/(?:www\\.)/.source,rt(6),\")\",\"|\",\"(\",\"(//)?\",rt(10)+\"\\\\.\",ot.source,\"(?![-\"+Ke+\"])\",\")\",\")\",\"(?::[0-9]+)?\",\"(?:\"+r.source+\")?\"].join(\"\"),\"gi\")),n.wordCharRegExp=new RegExp(\"[\"+Qe+\"]\"),n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.stripPrefix,o=this.stripTrailingSlash,s=this.decodePercentEncoding,i=this.tagBuilder,a=[],u=function(){var r=t[0],u=t[1],c=t[4],p=t[5],h=t[9],f=t.index,g=p||h,d=e.charAt(f-1);if(!at.isValid(r,u))return\"continue\";if(f>0&&\"@\"===d)return\"continue\";if(f>0&&g&&l.wordCharRegExp.test(d))return\"continue\";if(/\\?$/.test(r)&&(r=r.substr(0,r.length-1)),l.matchHasUnbalancedClosingParen(r))r=r.substr(0,r.length-1);else{var m=l.matchHasInvalidCharAfterTld(r,u);m>-1&&(r=r.substr(0,m))}var b=[\"http://\",\"https://\"].find(function(e){return!!u&&-1!==u.indexOf(e)});if(b){var v=r.indexOf(b);r=r.substr(v),u=u.substr(v),f+=v}var k=u?\"scheme\":c?\"www\":\"tld\",A=!!u;a.push(new Oe({tagBuilder:i,matchedText:r,offset:f,urlMatchType:k,url:r,protocolUrlMatch:A,protocolRelativeMatch:!!g,stripPrefix:n,stripTrailingSlash:o,decodePercentEncoding:s}))},l=this;null!==(t=r.exec(e));)u();return a},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,r=e.charAt(e.length-1);if(\")\"===r)t=\"(\";else{if(\"]\"!==r)return!1;t=\"[\"}for(var n=0,o=0,s=e.length-1;o<s;o++){var i=e.charAt(o);i===t?n++:i===r&&(n=Math.max(n-1,0))}return 0===n},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var r=0;t&&(r=e.indexOf(\":\"),e=e.slice(r));var n=new RegExp(\"^((.?//)?[-.\"+Qe+\"]*[-\"+Qe+\"]\\\\.[-\"+Qe+\"]+)\").exec(e);return null===n?-1:(r+=n[1].length,e=e.slice(n[1].length),/^[^-.A-Za-z0-9:\\/?#]/.test(e)?r:-1)},t}(Ue),lt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegex=new RegExp(\"#[_\"+Qe+\"]{1,139}(?![_\"+Qe+\"])\",\"g\"),r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.nonWordCharRegex,o=this.serviceName,s=this.tagBuilder,i=[];null!==(t=r.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||n.test(u)){var l=t[0],c=t[0].slice(1);i.push(new Pe({tagBuilder:s,matchedText:l,offset:a,serviceName:o,hashtag:c}))}}return i},t}(Ue),ct=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=/(?:(?:(?:(\\+)?\\d{1,3}[-\\040.]?)?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\\040.]?(?:\\d[-\\040.]?){6,12}\\d+))([,;]+[0-9]+#?)*/g,t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.tagBuilder,o=[];null!==(t=r.exec(e));){var s=t[0],i=s.replace(/[^0-9,;#]/g,\"\"),a=!(!t[1]&&!t[2]),u=0==t.index?\"\":e.substr(t.index-1,1),l=e.substr(t.index+s.length,1),c=!u.match(/\\d/)&&!l.match(/\\d/);this.testMatch(t[3])&&this.testMatch(s)&&c&&o.push(new Ie({tagBuilder:n,matchedText:s,offset:t.index,number:i,plusSign:a}))}return o},t.prototype.testMatch=function(e){return/\\D/.test(e)},t}(Ue),pt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegexes={twitter:new RegExp(\"@[_\"+Qe+\"]{1,50}(?![_\"+Qe+\"])\",\"g\"),instagram:new RegExp(\"@[_.\"+Qe+\"]{1,30}(?![_\"+Qe+\"])\",\"g\"),soundcloud:new RegExp(\"@[-_.\"+Qe+\"]{1,50}(?![-_\"+Qe+\"])\",\"g\")},r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){var t,r=this.serviceName,n=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,s=this.tagBuilder,i=[];if(!n)return i;for(;null!==(t=n.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||o.test(u)){var l=t[0].replace(/\\.+$/g,\"\"),c=l.slice(1);i.push(new je({tagBuilder:s,matchedText:l,offset:a,serviceName:r,mention:c}))}}return i},t}(Ue);function ht(e,t){for(var r=t.onOpenTag,n=t.onCloseTag,o=t.onText,s=t.onComment,i=t.onDoctype,a=new ft,u=0,l=e.length,c=0,p=0,h=a;u<l;){var f=e.charAt(u);switch(c){case 0:g(f);break;case 1:d(f);break;case 2:b(f);break;case 3:m(f);break;case 4:v(f);break;case 5:k(f);break;case 6:A(f);break;case 7:y(f);break;case 8:x(f);break;case 9:w(f);break;case 10:C(f);break;case 11:E(f);break;case 12:D(f);break;case 13:_();break;case 14:B(f);break;case 15:q(f);break;case 16:F(f);break;case 17:M(f);break;case 18:S(f);break;case 19:T(f);break;case 20:L(f);break;default:Fe(c)}u++}function g(e){\"<\"===e&&N()}function d(e){\"!\"===e?c=13:\"/\"===e?(c=2,h=new ft(Ne({},h,{isClosing:!0}))):\"<\"===e?N():He.test(e)?(c=3,h=new ft(Ne({},h,{isOpening:!0}))):(c=0,h=a)}function m(e){Ge.test(e)?(h=new ft(Ne({},h,{name:P()})),c=4):\"<\"===e?N():\"/\"===e?(h=new ft(Ne({},h,{name:P()})),c=12):\">\"===e?(h=new ft(Ne({},h,{name:P()})),z()):He.test(e)||Ve.test(e)||\":\"===e||R()}function b(e){\">\"===e?R():He.test(e)?c=3:R()}function v(e){Ge.test(e)||(\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():\"=\"===e||$e.test(e)||Ze.test(e)?R():c=5)}function k(e){Ge.test(e)?c=6:\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)&&R()}function A(e){Ge.test(e)||(\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)?R():c=5)}function y(e){Ge.test(e)||('\"'===e?c=8:\"'\"===e?c=9:/[>=`]/.test(e)?R():\"<\"===e?N():c=10)}function x(e){'\"'===e&&(c=11)}function w(e){\"'\"===e&&(c=11)}function C(e){Ge.test(e)?c=4:\">\"===e?z():\"<\"===e&&N()}function E(e){Ge.test(e)?c=4:\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():(c=4,u--)}function D(e){\">\"===e?(h=new ft(Ne({},h,{isClosing:!0})),z()):c=4}function _(t){\"--\"===e.substr(u,2)?(u+=2,h=new ft(Ne({},h,{type:\"comment\"})),c=14):\"DOCTYPE\"===e.substr(u,7).toUpperCase()?(u+=7,h=new ft(Ne({},h,{type:\"doctype\"})),c=20):R()}function B(e){\"-\"===e?c=15:\">\"===e?R():c=16}function q(e){\"-\"===e?c=18:\">\"===e?R():c=16}function F(e){\"-\"===e&&(c=17)}function M(e){c=\"-\"===e?18:16}function S(e){\">\"===e?z():\"!\"===e?c=19:\"-\"===e||(c=16)}function T(e){\"-\"===e?c=17:\">\"===e?z():c=16}function L(e){\">\"===e?z():\"<\"===e&&N()}function R(){c=0,h=a}function N(){c=1,h=new ft({idx:u})}function z(){var t=e.slice(p,h.idx);t&&o(t,p),\"comment\"===h.type?s(h.idx):\"doctype\"===h.type?i(h.idx):(h.isOpening&&r(h.name,h.idx),h.isClosing&&n(h.name,h.idx)),R(),p=u+1}function P(){var t=h.idx+(h.isClosing?2:1);return e.slice(t,u).toLowerCase()}p<u&&function(){var t=e.slice(p,u);o(t,p),p=u+1}()}var ft=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||\"tag\",this.name=e.name||\"\",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},gt=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:\"end\"},this.className=\"\",this.replaceFn=null,this.context=void 0,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email=\"boolean\"==typeof t.email?t.email:this.email,this.phone=\"boolean\"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=\"boolean\"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash=\"boolean\"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=\"boolean\"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding;var r=this.mention;if(!1!==r&&\"twitter\"!==r&&\"instagram\"!==r&&\"soundcloud\"!==r)throw new Error(\"invalid `mention` cfg - see docs\");var n=this.hashtag;if(!1!==n&&\"twitter\"!==n&&\"facebook\"!==n&&\"instagram\"!==n)throw new Error(\"invalid `hashtag` cfg - see docs\");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,r){return new e(r).link(t)},e.parse=function(t,r){return new e(r).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:\"boolean\"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:\"boolean\"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:\"boolean\"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{scheme:e,www:e}:{scheme:\"boolean\"!=typeof e.scheme||e.scheme,www:\"boolean\"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return\"number\"==typeof e?{length:e,location:\"end\"}:function(e,t){for(var r in t)t.hasOwnProperty(r)&&void 0===e[r]&&(e[r]=t[r]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:\"end\"})},e.prototype.parse=function(e){var t=this,r=[\"a\",\"style\",\"script\"],n=0,o=[];return ht(e,{onOpenTag:function(e){r.indexOf(e)>=0&&n++},onText:function(e,r){if(0===n){var s=function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var r,n=[],o=0;r=t.exec(e);)n.push(e.substring(o,r.index)),n.push(r[0]),o=r.index+r[0].length;return n.push(e.substring(o)),n}(e,/( | |<|<|>|>|"|"|')/gi),i=r;s.forEach(function(e,r){if(r%2==0){var n=t.parseText(e,i);o.push.apply(o,n)}i+=e.length})}},onCloseTag:function(e){r.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort(function(e,t){return e.getOffset()-t.getOffset()});for(var t=0;t<e.length-1;t++){var r=e[t],n=r.getOffset(),o=r.getMatchedText().length,s=n+o;if(t+1<e.length){if(e[t+1].getOffset()===n){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<s&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||qe(e,function(e){return\"hashtag\"===e.getType()}),this.email||qe(e,function(e){return\"email\"===e.getType()}),this.phone||qe(e,function(e){return\"phone\"===e.getType()}),this.mention||qe(e,function(e){return\"mention\"===e.getType()}),this.urls.schemeMatches||qe(e,function(e){return\"url\"===e.getType()&&\"scheme\"===e.getUrlMatchType()}),this.urls.wwwMatches||qe(e,function(e){return\"url\"===e.getType()&&\"www\"===e.getUrlMatchType()}),this.urls.tldMatches||qe(e,function(e){return\"url\"===e.getType()&&\"tld\"===e.getUrlMatchType()}),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var r=this.getMatchers(),n=[],o=0,s=r.length;o<s;o++){for(var i=r[o].parseMatches(e),a=0,u=i.length;a<u;a++)i[a].setOffset(t+i[a].getOffset());n.push.apply(n,i)}return n},e.prototype.link=function(e){if(!e)return\"\";for(var t=this.parse(e),r=[],n=0,o=0,s=t.length;o<s;o++){var i=t[o];r.push(e.substring(n,i.getOffset())),r.push(this.createMatchReturnVal(i)),n=i.getOffset()+i.getMatchedText().length}return r.push(e.substring(n)),r.join(\"\")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),\"string\"==typeof t?t:!1===t?e.getMatchedText():t instanceof Me?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new lt({tagBuilder:e,serviceName:this.hashtag}),new st({tagBuilder:e}),new ct({tagBuilder:e}),new pt({tagBuilder:e,serviceName:this.mention}),new ut({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new Se({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version=\"3.11.0\",e.AnchorTagBuilder=Se,e.HtmlTag=Me,e.matcher={Email:st,Hashtag:lt,Matcher:Ue,Mention:pt,Phone:ct,Url:ut},e.match={Email:ze,Hashtag:Pe,Match:Te,Mention:je,Phone:Ie,Url:Oe},e}(),dt=/www|@|\\:\\/\\//;function mt(e){return/^<\\/a\\s*>/i.test(e)}function bt(){var e=[],t=new gt({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function vt(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d=e.tokens,m=null;for(r=0,n=d.length;r<n;r++)if(\"inline\"===d[r].type)for(p=0,t=(o=d[r].children).length-1;t>=0;t--)if(\"link_close\"!==(s=o[t]).type){if(\"htmltag\"===s.type&&(g=s.content,/^<a[>\\s]/i.test(g)&&p>0&&p--,mt(s.content)&&p++),!(p>0)&&\"text\"===s.type&&dt.test(s.content)){if(m||(h=(m=bt()).links,f=m.autolinker),i=s.content,h.length=0,f.link(i),!h.length)continue;for(a=[],c=s.level,u=0;u<h.length;u++)e.inline.validateLink(h[u].url)&&((l=i.indexOf(h[u].text))&&a.push({type:\"text\",content:i.slice(0,l),level:c}),a.push({type:\"link_open\",href:h[u].url,title:\"\",level:c++}),a.push({type:\"text\",content:h[u].text,level:c}),a.push({type:\"link_close\",level:--c}),i=i.slice(l+h[u].text.length));i.length&&a.push({type:\"text\",content:i,level:c}),d[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1))}}else for(t--;o[t].level!==s.level&&\"link_open\"!==o[t].type;)t--}e.Remarkable=_e,e.linkify=function(e){e.core.ruler.push(\"linkify\",vt)},e.utils=A,Object.defineProperty(e,\"__esModule\",{value:!0})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/markdown/remarkable.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/markdown/images/new-markdown-button": {
"title": "$:/plugins/tiddlywiki/markdown/images/new-markdown-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-markdown-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <path d=\"M3.23876972,39.5396716 C3.23876972,35.9653274 6.13586353,33.0691646 9.7141757,33.0691646 L98.1283744,33.0691646 C101.706101,33.0691646 104.60378,35.9646626 104.60378,39.5396716 L104.60378,84.8296213 C104.60378,88.4039654 101.706687,91.3001282 98.1283744,91.3001282 L9.7141757,91.3001282 C6.13644944,91.3001282 3.23876972,88.4046302 3.23876972,84.8296213 L3.23876972,39.5396716 L3.23876972,39.5396716 Z M-2.15298617,39.5396716 L-2.15298617,84.8296213 C-2.15298617,91.3833243 3.15957363,96.6918841 9.7141757,96.6918841 L98.1283744,96.6918841 C104.684083,96.6918841 109.995536,91.382138 109.995536,84.8296213 L109.995536,39.5396716 C109.995536,32.9859686 104.682977,27.6774087 98.1283744,27.6774087 L9.7141757,27.6774087 C3.15846686,27.6774087 -2.15298617,32.9871549 -2.15298617,39.5396716 Z M14.0222815,80.5166164 L14.0222815,43.8526764 L24.8057933,43.8526764 L35.589305,57.3320661 L46.3728168,43.8526764 L57.1563286,43.8526764 L57.1563286,80.5166164 L46.3728168,80.5166164 L46.3728168,59.4887685 L35.589305,72.9681582 L24.8057933,59.4887685 L24.8057933,80.5166164 L14.0222815,80.5166164 Z M81.4192301,80.5166164 L65.2439624,62.723822 L76.0274742,62.723822 L76.0274742,43.8526764 L86.810986,43.8526764 L86.810986,62.723822 L97.5944978,62.723822 L81.4192301,80.5166164 Z\"transform=\"translate(53.921275, 62.184646) rotate(-60.000000) translate(-53.921275, -62.184646) \"></path>\n </g>\n</svg>"
},
"$:/plugins/tiddlywiki/markdown/new-markdown-button": {
"title": "$:/plugins/tiddlywiki/markdown/new-markdown-button",
"tags": "$:/tags/PageControls",
"caption": "{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}} {{$:/language/Buttons/NewMarkdown/Caption}}",
"description": "{{$:/language/Buttons/NewMarkdown/Hint}}",
"list-after": "$:/core/ui/Buttons/new-tiddler",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=\"text/x-markdown\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewMarkdown/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/plugins/tiddlywiki/markdown/readme": {
"title": "$:/plugins/tiddlywiki/markdown/readme",
"text": "This is a TiddlyWiki plugin for parsing Markdown text, using the [[Remarkable|https://github.com/jonschlinkert/remarkable]] library.\n\nIt is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/markdown]]\n"
},
"$:/plugins/tiddlywiki/markdown/usage": {
"title": "$:/plugins/tiddlywiki/markdown/usage",
"text": "! Plugin Configuration\n\n|!Config |!Default |!Description |\n| <code>[[breaks|$:/config/markdown/breaks]]</code>| ``false``|Remarkable library config: Convert '\\n' in paragraphs into ``<br>`` |\n| <code>[[linkify|$:/config/markdown/linkify]]</code>| ``false``|Remarkable library config: Autoconvert URL-like text to links |\n| <code>[[linkNewWindow|$:/config/markdown/linkNewWindow]]</code>| ``true``|For external links, should clicking on them open a new window/tab automatically? |\n| <code>[[quotes|$:/config/markdown/quotes]]</code>| ``“”‘’``|Remarkable library config: Double + single quotes replacement pairs, when ``typographer`` enabled |\n| <code>[[renderWikiText|$:/config/markdown/renderWikiText]]</code>| ``true``|After Markdown is parsed, should any text elements be handed off to the ~WikiText parser for further processing? |\n| <code>[[renderWikiTextPragma|$:/config/markdown/renderWikiTextPragma]]</code>| ``\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock``|When handing off to the ~WikiText parser, what pragma rules should it follow? |\n| <code>[[typographer|$:/config/markdown/typographer]]</code>| ``false``|Remarkable library config: Enable some language-neutral replacement + quotes beautification |\n\n! Creating ~WikiLinks\n\nCreate wiki links with the usual Markdown link syntax targeting `#` and the target tiddler title:\n\n```\n[link text](#TiddlerTitle)\n```\n\nIf the target tiddler has a space in its name, that name must be URL-escaped to be detected as a URL:\n\n```\n[link text](#Test%20Tiddler)\n```\n\n! Images\n\nMarkdown image syntax can be used to reference images by tiddler title or an external URI. For example:\n\n```\n![alt text](/path/to/img.jpg \"Title\")\n\n![alt text](Motovun Jack.jpg \"Title\")\n```\n"
},
"$:/plugins/tiddlywiki/markdown/wrapper.js": {
"title": "$:/plugins/tiddlywiki/markdown/wrapper.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/markdown/wrapper.js\ntype: application/javascript\nmodule-type: parser\n\nWraps up the remarkable parser for use as a Parser in TiddlyWiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar r = require(\"$:/plugins/tiddlywiki/markdown/remarkable.js\");\n\nvar Remarkable = r.Remarkable,\n\tlinkify = r.linkify,\n\tutils = r.utils;\n\n///// Set up configuration options /////\nfunction parseAsBoolean(tiddlerName) {\n\treturn $tw.wiki.getTiddlerText(tiddlerName).toLowerCase() === \"true\";\n}\nvar pluginOpts = {\n\tlinkNewWindow: parseAsBoolean(\"$:/config/markdown/linkNewWindow\"),\n\trenderWikiText: parseAsBoolean(\"$:/config/markdown/renderWikiText\"),\n\trenderWikiTextPragma: $tw.wiki.getTiddlerText(\"$:/config/markdown/renderWikiTextPragma\").trim()\n};\nvar remarkableOpts = {\n\tbreaks: parseAsBoolean(\"$:/config/markdown/breaks\"),\n\tquotes: $tw.wiki.getTiddlerText(\"$:/config/markdown/quotes\"),\n\ttypographer: parseAsBoolean(\"$:/config/markdown/typographer\")\n};\n\nvar md = new Remarkable(remarkableOpts);\n\nif (parseAsBoolean(\"$:/config/markdown/linkify\")) {\n\tmd = md.use(linkify);\n}\n\nfunction findTagWithType(nodes, startPoint, type, level) {\n\tfor (var i = startPoint; i < nodes.length; i++) {\n\t\tif (nodes[i].type === type && nodes[i].level === level) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Remarkable creates nodes that look like:\n * [\n * { type: 'paragraph_open'},\n * { type: 'inline', content: 'Hello World', children:[{type: 'text', content: 'Hello World'}]},\n * { type: 'paragraph_close'}\n * ]\n *\n * But TiddlyWiki wants the Parser (https://tiddlywiki.com/dev/static/Parser.html) to emit nodes like:\n *\n * [\n * { type: 'element', tag: 'p', children: [{type: 'text', text: 'Hello World'}]}\n * ]\n */\nfunction convertNodes(remarkableTree, isStartOfInline) {\n\tlet out = [];\n\n\tfunction wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) {\n\t\tvar j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel);\n\t\tif (j === false) {\n\t\t\tconsole.error(\"Failed to find a \" + closingType + \" node after position \" + currentIndex);\n\t\t\tconsole.log(nodes);\n\t\t\treturn currentIndex + 1;\n\t\t}\n\t\tlet children = convertNodes(nodes.slice(currentIndex + 1, j));\n\n\t\tout.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: elementTag,\n\t\t\tchildren: children\n\t\t});\n\t\treturn j;\n\t}\n\n\tfor (var i = 0; i < remarkableTree.length; i++) {\n\t\tvar currentNode = remarkableTree[i];\n\t\tif (currentNode.type === \"paragraph_open\") {\n\t\t\ti = wrappedElement(\"p\", i, currentNode.level, \"paragraph_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"heading_open\") {\n\t\t\ti = wrappedElement(\"h\" + currentNode.hLevel, i, currentNode.level, \"heading_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"bullet_list_open\") {\n\t\t\ti = wrappedElement(\"ul\", i, currentNode.level, \"bullet_list_close\", remarkableTree);\n\t\t} else if (currentNode.type == 'ordered_list_open') {\n\t\t\ti = wrappedElement('ol', i, currentNode.level,'ordered_list_close', remarkableTree);\n\t\t} else if (currentNode.type === \"list_item_open\") {\n\t\t\ti = wrappedElement(\"li\", i, currentNode.level, \"list_item_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"link_open\") {\n\t\t\tvar j = findTagWithType(remarkableTree, i + 1, \"link_close\", currentNode.level);\n\n\t\t\tif (currentNode.href[0] !== \"#\") {\n\t\t\t\t// External link\n\t\t\t\tvar attributes = {\n\t\t\t\t\thref: { type: \"string\", value: currentNode.href }\n\t\t\t\t};\n\t\t\t\tif (pluginOpts.linkNewWindow) {\n\t\t\t\t\tattributes.target = { type: \"string\", value: \"_blank\" };\n\t\t\t\t}\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: \"a\",\n\t\t\t\t\tattributes: attributes,\n\t\t\t\t\tchildren: convertNodes(remarkableTree.slice(i + 1, j))\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Internal link\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"link\",\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tto: { type: \"string\", value: decodeURI(currentNode.href.substr(1)) }\n\t\t\t\t\t},\n\t\t\t\t\tchildren: convertNodes(remarkableTree.slice(i + 1, j))\n\t\t\t\t});\n\t\t\t}\n\t\t\ti = j;\n\t\t} else if (currentNode.type.substr(currentNode.type.length - 5) === \"_open\") {\n\t\t\tvar tagName = currentNode.type.substr(0, currentNode.type.length - 5);\n\t\t\ti = wrappedElement(tagName, i, currentNode.level, tagName + \"_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"code\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: currentNode.block ? \"pre\" : \"code\",\n\t\t\t\tchildren: [{ type: \"text\", text: currentNode.content }]\n\t\t\t});\n\t\t} else if (currentNode.type === \"fence\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"codeblock\",\n\t\t\t\tattributes: {\n\t\t\t\t\tlanguage: { type: \"string\", value: currentNode.params },\n\t\t\t\t\tcode: { type: \"string\", value: currentNode.content }\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentNode.type === \"image\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttooltip: { type: \"string\", value: currentNode.alt },\n\t\t\t\t\tsource: { type: \"string\", value: currentNode.src }\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentNode.type === \"softbreak\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: \"br\",\n\t\t\t});\n\t\t} else if (currentNode.type == 'hr') {\n\t\t\tout.push({\n\t\t\t\ttype: 'element',\n\t\t\t\ttag: 'hr',\n\t\t\t});\n\t\t} else if (currentNode.type === \"inline\") {\n\t\t\tout = out.concat(convertNodes(currentNode.children, true));\n\t\t} else if (currentNode.type === \"text\") {\n\t\t\tif (!pluginOpts.renderWikiText) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: currentNode.content\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// The Markdown compiler thinks this is just text.\n\t\t\t\t// Hand off to the WikiText parser to see if there's more to render\n\n\t\t\t\t// If we're inside a block element (div, p, td, h1), and this is the first child in the tree,\n\t\t\t\t// handle as a block-level parse. Otherwise not.\n\t\t\t\tvar parseAsInline = !(isStartOfInline && i === 0);\n\t\t\t\tvar textToParse = currentNode.content;\n\t\t\t\tif (pluginOpts.renderWikiTextPragma !== \"\") {\n\t\t\t\t\ttextToParse = pluginOpts.renderWikiTextPragma + \"\\n\" + textToParse;\n\t\t\t\t}\n\t\t\t\tvar wikiParser = $tw.wiki.parseText(\"text/vnd.tiddlywiki\", textToParse, {\n\t\t\t\t\tparseAsInline: parseAsInline\n\t\t\t\t});\n\t\t\t\tvar rs = wikiParser.tree;\n\n\t\t\t\t// If we parsed as a block, but the root element the WikiText parser gave is a paragraph,\n\t\t\t\t// we should discard the paragraph, since the way Remarkable nests its nodes, this \"inline\"\n\t\t\t\t// node is always inside something else that's a block-level element\n\t\t\t\tif (!parseAsInline\n\t\t\t\t\t&& rs.length === 1\n\t\t\t\t\t&& rs[0].type === \"element\"\n\t\t\t\t\t&& rs[0].tag === \"p\"\n\t\t\t\t) {\n\t\t\t\t\trs = rs[0].children;\n\t\t\t\t}\n\n\t\t\t\t// If the original text element started with a space, add it back in\n\t\t\t\tif (rs.length > 0\n\t\t\t\t\t&& rs[0].type === \"text\"\n\t\t\t\t\t&& currentNode.content[0] === \" \"\n\t\t\t\t) {\n\t\t\t\t\trs[0].text = \" \" + rs[0].text;\n\t\t\t\t}\n\t\t\t\tout = out.concat(rs);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(\"Unknown node type: \" + currentNode.type, currentNode);\n\t\t\tout.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: currentNode.content\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n\nvar MarkdownParser = function(type, text, options) {\n\tvar tree = md.parse(text, {});\n\t//console.debug(tree);\n\ttree = convertNodes(tree);\n\t//console.debug(tree);\n\n\tthis.tree = tree;\n};\n\nexports[\"text/x-markdown\"] = MarkdownParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
}
}
}
WEEK1:03 Single number evaluation metric
Essentialism - Chapter 19
Coffee Can Investing - 01
Chapter - 18 - Deep Learning with Python
Intro to Statistics W206: The Interpretation of Probability
Kivy Python - Hello World
C1W105: Putting it all together
WEEK2:03 Logistic Regression Cost Function
Mindset - 05 - Mindset and Leadership
$:/core/ui/AdvancedSearch/Filter
$:/themes/tiddlywiki/vanilla/themetweaks
$:/core/ui/ControlPanel/Basics
$:/core/ui/ControlPanel/Plugins/Add/Plugins
$:/core/ui/ControlPanel/Palette
$:/core/ui/ControlPanel/Settings/CodeMirror
$:/core/ui/ControlPanel/Plugins/Installed/Plugins
$:/core/ui/ControlPanel/LoadedModules
$:/core/ui/ControlPanel/Appearance
$:/core/ui/DefaultSearchResultList
$:/core/ui/ControlPanel/Appearance
$:/core/ui/ControlPanel/Saving/General
$:/core/ui/MoreSideBar/All
$:/core/ui/ControlPanel/Toolbars/ViewToolbar
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
},
"$:/info/url/full": {
"title": "$:/info/url/full",
"text": "https://sumitkant.github.io/neuralnotework.html"
},
"$:/info/url/host": {
"title": "$:/info/url/host",
"text": "sumitkant.github.io"
},
"$:/info/url/hostname": {
"title": "$:/info/url/hostname",
"text": "sumitkant.github.io"
},
"$:/info/url/protocol": {
"title": "$:/info/url/protocol",
"text": "https:"
},
"$:/info/url/port": {
"title": "$:/info/url/port",
"text": ""
},
"$:/info/url/pathname": {
"title": "$:/info/url/pathname",
"text": "/neuralnotework.html"
},
"$:/info/url/search": {
"title": "$:/info/url/search",
"text": ""
},
"$:/info/url/origin": {
"title": "$:/info/url/origin",
"text": "https://sumitkant.github.io"
},
"$:/info/browser/screen/width": {
"title": "$:/info/browser/screen/width",
"text": "1920"
},
"$:/info/browser/screen/height": {
"title": "$:/info/browser/screen/height",
"text": "1080"
},
"$:/info/browser/language": {
"title": "$:/info/browser/language",
"text": "en-US"
}
}
}
$:/themes/tiddlywiki/vanilla
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n background-color: transparent;\n}\n\n\"\"\">>\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n left: -50px;\n top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n right: -80px;\n bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n vertical-align: middle;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n \tcursor: pointer;\n\tcolor: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: text-bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n height: 1.2em;\n width: 1.2em;\n margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tbackground-color: <<colour tiddler-editor-background>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: 20%;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n width: auto;\n margin-bottom: 0px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n display: block;\n width: 100%;\n text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n flex: 1 0;\n background: <<colour tiddler-editor-background>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n flex: 3 1;\n border-left: 0.5em solid <<colour muted-foreground>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n font-size: 0.8em;\n margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n padding: 2px 7px;\n font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n \tlist-style-type: none;\n \tpadding-left: 0;\n \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n \tpadding-left: 1em; \n}\n\n.tc-tree button { \n \tcolor: #acacac;\n}\n\n.tc-tree svg {\n \tfill: #acacac;\n}\n\n.tc-tree span svg {\n \twidth: 1em;\n \theight: 1em;\n \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n \tcolor: lightgray;\n}\n\nselect {\n color: <<colour select-tag-foreground>>;\n background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
"text": "350px"
},
"$:/themes/tiddlywiki/vanilla/options/stickytitles": {
"title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
"text": "no"
},
"$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
"title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
"text": "fixed-fluid"
},
"$:/themes/tiddlywiki/vanilla/options/codewrapping": {
"title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
"text": "pre-wrap"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\""
},
"$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
"text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
"text": "fixed"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
"text": "auto"
},
"$:/themes/tiddlywiki/vanilla/sticky": {
"title": "$:/themes/tiddlywiki/vanilla/sticky",
"text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
}
}
}
\define custom-background-datauri()
<$set name="background" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>
<$list filter="[<background>is[image]]">
`background: url(`
<$list filter="[<background>!has[_canonical_uri]]">
`"`<$macrocall $name="datauri" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`"`
</$list>
<$list filter="[<background>has[_canonical_uri]]">
`"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field="_canonical_uri"/>`"`
</$list>
`) center center;`
`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;
-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;
-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;
-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;
background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`
</$list>
</$set>
\end
\define if-fluid-fixed(text,hiddenSidebarText)
<$reveal state="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" type="match" text="fluid-fixed">
$text$
<$reveal state="$:/state/sidebar" type="nomatch" text="yes" default="yes">
$hiddenSidebarText$
</$reveal>
</$reveal>
\end
\define if-editor-height-fixed(then,else)
<$reveal state="$:/config/TextEditor/EditorHeight/Mode" type="match" text="fixed">
$then$
</$reveal>
<$reveal state="$:/config/TextEditor/EditorHeight/Mode" type="match" text="auto">
$else$
</$reveal>
\end
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock
/*
** Start with the normalize CSS reset, and then belay some of its effects
*/
{{$:/themes/tiddlywiki/vanilla/reset}}
*, input[type="search"] {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
html button {
line-height: 1.2;
color: <<colour button-foreground>>;
background: <<colour button-background>>;
border-color: <<colour button-border>>;
}
/*
** Basic element styles
*/
html {
font-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};
text-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
html:-webkit-full-screen {
background-color: <<colour page-background>>;
}
body.tc-body {
font-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};
line-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};
word-wrap: break-word;
<<custom-background-datauri>>
color: <<colour foreground>>;
background-color: <<colour page-background>>;
fill: <<colour foreground>>;
}
<<if-background-attachment """
body.tc-body {
background-color: transparent;
}
""">>
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
font-weight: 300;
}
pre {
display: block;
padding: 14px;
margin-top: 1em;
margin-bottom: 1em;
word-break: normal;
word-wrap: break-word;
white-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};
background-color: <<colour pre-background>>;
border: 1px solid <<colour pre-border>>;
padding: 0 3px 2px;
border-radius: 3px;
font-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};
}
code {
color: <<colour code-foreground>>;
background-color: <<colour code-background>>;
border: 1px solid <<colour code-border>>;
white-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};
padding: 0 3px 2px;
border-radius: 3px;
font-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};
}
blockquote {
border-left: 5px solid <<colour blockquote-bar>>;
margin-left: 25px;
padding-left: 10px;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote > div {
margin-top: 1em;
margin-bottom: 1em;
}
blockquote.tc-big-quote {
font-family: Georgia, serif;
position: relative;
background: <<colour pre-background>>;
border-left: none;
margin-left: 50px;
margin-right: 50px;
padding: 10px;
border-radius: 8px;
}
blockquote.tc-big-quote cite:before {
content: "\2014 \2009";
}
blockquote.tc-big-quote:before {
font-family: Georgia, serif;
color: <<colour blockquote-bar>>;
content: open-quote;
font-size: 8em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
position: absolute;
left: -50px;
top: 42px;
}
blockquote.tc-big-quote:after {
font-family: Georgia, serif;
color: <<colour blockquote-bar>>;
content: close-quote;
font-size: 8em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
position: absolute;
right: -80px;
bottom: -20px;
}
dl dt {
font-weight: bold;
margin-top: 6px;
}
button, textarea, input, select {
outline-color: <<colour primary>>;
}
textarea,
input[type=text],
input[type=search],
input[type=""],
input:not([type]) {
color: <<colour foreground>>;
background: <<colour background>>;
}
input[type="checkbox"] {
vertical-align: middle;
}
.tc-muted {
color: <<colour muted-foreground>>;
}
svg.tc-image-button {
padding: 0px 1px 1px 0px;
}
.tc-icon-wrapper > svg {
width: 1em;
height: 1em;
}
kbd {
display: inline-block;
padding: 3px 5px;
font-size: 0.8em;
line-height: 1.2;
color: <<colour foreground>>;
vertical-align: middle;
background-color: <<colour background>>;
border: solid 1px <<colour muted-foreground>>;
border-bottom-color: <<colour muted-foreground>>;
border-radius: 3px;
box-shadow: inset 0 -1px 0 <<colour muted-foreground>>;
}
/*
Markdown likes putting code elements inside pre elements
*/
pre > code {
padding: 0;
border: none;
background-color: inherit;
color: inherit;
}
table {
border: 1px solid <<colour table-border>>;
width: auto;
max-width: 100%;
caption-side: bottom;
margin-top: 1em;
margin-bottom: 1em;
/* next 2 elements needed, since normalize 8.0.1 */
border-collapse: collapse;
border-spacing: 0;
}
table th, table td {
padding: 0 7px 0 7px;
border-top: 1px solid <<colour table-border>>;
border-left: 1px solid <<colour table-border>>;
}
table thead tr td, table th {
background-color: <<colour table-header-background>>;
font-weight: bold;
}
table tfoot tr td {
background-color: <<colour table-footer-background>>;
}
.tc-csv-table {
white-space: nowrap;
}
.tc-tiddler-frame img,
.tc-tiddler-frame svg,
.tc-tiddler-frame canvas,
.tc-tiddler-frame embed,
.tc-tiddler-frame iframe {
max-width: 100%;
}
.tc-tiddler-body > embed,
.tc-tiddler-body > iframe {
width: 100%;
height: 600px;
}
/*
** Links
*/
button.tc-tiddlylink,
a.tc-tiddlylink {
text-decoration: none;
font-weight: 500;
color: <<colour tiddler-link-foreground>>;
-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */
}
.tc-sidebar-lists a.tc-tiddlylink {
color: <<colour sidebar-tiddler-link-foreground>>;
}
.tc-sidebar-lists a.tc-tiddlylink:hover {
color: <<colour sidebar-tiddler-link-foreground-hover>>;
}
button.tc-tiddlylink:hover,
a.tc-tiddlylink:hover {
text-decoration: underline;
}
a.tc-tiddlylink-resolves {
}
a.tc-tiddlylink-shadow {
font-weight: bold;
}
a.tc-tiddlylink-shadow.tc-tiddlylink-resolves {
font-weight: normal;
}
a.tc-tiddlylink-missing {
font-style: italic;
}
a.tc-tiddlylink-external {
text-decoration: underline;
color: <<colour external-link-foreground>>;
background-color: <<colour external-link-background>>;
}
a.tc-tiddlylink-external:visited {
color: <<colour external-link-foreground-visited>>;
background-color: <<colour external-link-background-visited>>;
}
a.tc-tiddlylink-external:hover {
color: <<colour external-link-foreground-hover>>;
background-color: <<colour external-link-background-hover>>;
}
/*
** Drag and drop styles
*/
.tc-tiddler-dragger {
position: relative;
z-index: -10000;
}
.tc-tiddler-dragger-inner {
position: absolute;
top: -1000px;
left: -1000px;
display: inline-block;
padding: 8px 20px;
font-size: 16.9px;
font-weight: bold;
line-height: 20px;
color: <<colour dragger-foreground>>;
text-shadow: 0 1px 0 rgba(0, 0, 0, 1);
white-space: nowrap;
vertical-align: baseline;
background-color: <<colour dragger-background>>;
border-radius: 20px;
}
.tc-tiddler-dragger-cover {
position: absolute;
background-color: <<colour page-background>>;
}
.tc-dropzone {
position: relative;
}
.tc-dropzone.tc-dragover:before {
z-index: 10000;
display: block;
position: fixed;
top: 0;
left: 0;
right: 0;
background: <<colour dropzone-background>>;
text-align: center;
content: "<<lingo DropMessage>>";
}
.tc-droppable > .tc-droppable-placeholder {
display: none;
}
.tc-droppable.tc-dragover > .tc-droppable-placeholder {
display: block;
border: 2px dashed <<colour dropzone-background>>;
}
.tc-draggable {
cursor: move;
}
.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,
.tc-links-draggable-list .tc-droppable-placeholder {
line-height: 2em;
height: 2em;
}
.tc-sidebar-tab-open-item {
position: relative;
}
.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {
font-size: 0.7em;
fill: <<colour muted-foreground>>;
}
/*
** Plugin reload warning
*/
.tc-plugin-reload-warning {
z-index: 1000;
display: block;
position: fixed;
top: 0;
left: 0;
right: 0;
background: <<colour alert-background>>;
text-align: center;
}
/*
** Buttons
*/
button svg, button img, label svg, label img {
vertical-align: middle;
}
.tc-btn-invisible {
padding: 0;
margin: 0;
background: none;
border: none;
cursor: pointer;
color: <<colour foreground>>;
}
.tc-btn-boxed {
font-size: 0.6em;
padding: 0.2em;
margin: 1px;
background: none;
border: 1px solid <<colour tiddler-controls-foreground>>;
border-radius: 0.25em;
}
html body.tc-body .tc-btn-boxed svg {
font-size: 1.6666em;
}
.tc-btn-boxed:hover {
background: <<colour muted-foreground>>;
color: <<colour background>>;
}
html body.tc-body .tc-btn-boxed:hover svg {
fill: <<colour background>>;
}
.tc-btn-rounded {
font-size: 0.5em;
line-height: 2;
padding: 0em 0.3em 0.2em 0.4em;
margin: 1px;
border: 1px solid <<colour muted-foreground>>;
background: <<colour muted-foreground>>;
color: <<colour background>>;
border-radius: 2em;
}
html body.tc-body .tc-btn-rounded svg {
font-size: 1.6666em;
fill: <<colour background>>;
}
.tc-btn-rounded:hover {
border: 1px solid <<colour muted-foreground>>;
background: <<colour background>>;
color: <<colour muted-foreground>>;
}
html body.tc-body .tc-btn-rounded:hover svg {
fill: <<colour muted-foreground>>;
}
.tc-btn-icon svg {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
}
.tc-btn-text {
padding: 0;
margin: 0;
}
/* used for documentation "fake" buttons */
.tc-btn-standard {
line-height: 1.8;
color: #667;
background-color: #e0e0e0;
border: 1px solid #888;
padding: 2px 1px 2px 1px;
margin: 1px 4px 1px 4px;
}
.tc-btn-big-green {
display: inline-block;
padding: 8px;
margin: 4px 8px 4px 8px;
background: <<colour download-background>>;
color: <<colour download-foreground>>;
fill: <<colour download-foreground>>;
border: none;
border-radius: 2px;
font-size: 1.2em;
line-height: 1.4em;
text-decoration: none;
}
.tc-btn-big-green svg,
.tc-btn-big-green img {
height: 2em;
width: 2em;
vertical-align: middle;
fill: <<colour download-foreground>>;
}
.tc-primary-btn {
background: <<colour primary>>;
}
.tc-sidebar-lists input {
color: <<colour foreground>>;
}
.tc-sidebar-lists button {
color: <<colour sidebar-button-foreground>>;
fill: <<colour sidebar-button-foreground>>;
}
.tc-sidebar-lists button.tc-btn-mini {
color: <<colour sidebar-muted-foreground>>;
}
.tc-sidebar-lists button.tc-btn-mini:hover {
color: <<colour sidebar-muted-foreground-hover>>;
}
button svg.tc-image-button, button .tc-image-button img {
height: 1em;
width: 1em;
}
.tc-unfold-banner {
position: absolute;
padding: 0;
margin: 0;
background: none;
border: none;
width: 100%;
width: calc(100% + 2px);
margin-left: -43px;
text-align: center;
border-top: 2px solid <<colour tiddler-info-background>>;
margin-top: 4px;
}
.tc-unfold-banner:hover {
background: <<colour tiddler-info-background>>;
border-top: 2px solid <<colour tiddler-info-border>>;
}
.tc-unfold-banner svg, .tc-fold-banner svg {
height: 0.75em;
fill: <<colour tiddler-controls-foreground>>;
}
.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {
fill: <<colour tiddler-controls-foreground-hover>>;
}
.tc-fold-banner {
position: absolute;
padding: 0;
margin: 0;
background: none;
border: none;
width: 23px;
text-align: center;
margin-left: -35px;
top: 6px;
bottom: 6px;
}
.tc-fold-banner:hover {
background: <<colour tiddler-info-background>>;
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-unfold-banner {
position: static;
width: calc(100% + 59px);
}
.tc-fold-banner {
width: 16px;
margin-left: -16px;
font-size: 0.75em;
}
}
/*
** Tags and missing tiddlers
*/
.tc-tag-list-item {
position: relative;
display: inline-block;
margin-right: 7px;
}
.tc-tags-wrapper {
margin: 4px 0 14px 0;
}
.tc-missing-tiddler-label {
font-style: italic;
font-weight: normal;
display: inline-block;
font-size: 11.844px;
line-height: 14px;
white-space: nowrap;
vertical-align: baseline;
}
button.tc-tag-label, span.tc-tag-label {
display: inline-block;
padding: 0.16em 0.7em;
font-size: 0.9em;
font-weight: 400;
line-height: 1.2em;
color: <<colour tag-foreground>>;
white-space: nowrap;
vertical-align: baseline;
background-color: <<colour tag-background>>;
border-radius: 1em;
}
.tc-sidebar-scrollable .tc-tag-label {
text-shadow: none;
}
.tc-untagged-separator {
width: 10em;
left: 0;
margin-left: 0;
border: 0;
height: 1px;
background: <<colour tab-divider>>;
}
button.tc-untagged-label {
background-color: <<colour untagged-background>>;
}
.tc-tag-label svg, .tc-tag-label img {
height: 1em;
width: 1em;
margin-right: 3px;
margin-bottom: 1px;
vertical-align: text-bottom;
}
.tc-edit-tags button.tc-remove-tag-button svg {
font-size: 0.7em;
vertical-align: middle;
}
.tc-tag-manager-table .tc-tag-label {
white-space: normal;
}
.tc-tag-manager-tag {
width: 100%;
}
button.tc-btn-invisible.tc-remove-tag-button {
outline: none;
}
/*
** Page layout
*/
.tc-topbar {
position: fixed;
z-index: 1200;
}
.tc-topbar-left {
left: 29px;
top: 5px;
}
.tc-topbar-right {
top: 5px;
right: 29px;
}
.tc-topbar button {
padding: 8px;
}
.tc-topbar svg {
fill: <<colour muted-foreground>>;
}
.tc-topbar button:hover svg {
fill: <<colour foreground>>;
}
.tc-sidebar-header {
color: <<colour sidebar-foreground>>;
fill: <<colour sidebar-foreground>>;
}
.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {
font-weight: 300;
}
.tc-sidebar-header .tc-sidebar-lists p {
margin-top: 3px;
margin-bottom: 3px;
}
.tc-sidebar-header .tc-missing-tiddler-label {
color: <<colour sidebar-foreground>>;
}
.tc-advanced-search input {
width: 60%;
}
.tc-search a svg {
width: 1.2em;
height: 1.2em;
vertical-align: middle;
}
.tc-page-controls {
margin-top: 14px;
font-size: 1.5em;
}
.tc-page-controls .tc-drop-down {
font-size: 1rem;
}
.tc-page-controls button {
margin-right: 0.5em;
}
.tc-page-controls a.tc-tiddlylink:hover {
text-decoration: none;
}
.tc-page-controls img {
width: 1em;
}
.tc-page-controls svg {
fill: <<colour sidebar-controls-foreground>>;
}
.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {
fill: <<colour sidebar-controls-foreground-hover>>;
}
.tc-menu-list-item {
white-space: nowrap;
}
.tc-menu-list-count {
font-weight: bold;
}
.tc-menu-list-subitem {
padding-left: 7px;
}
.tc-story-river {
position: relative;
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-sidebar-header {
padding: 14px;
min-height: 32px;
margin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
}
.tc-story-river {
position: relative;
padding: 0;
}
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-message-box {
margin: 21px -21px 21px -21px;
}
.tc-sidebar-scrollable {
position: fixed;
top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
left: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};
bottom: 0;
right: 0;
overflow-y: auto;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
margin: 0 0 0 -42px;
padding: 71px 0 28px 42px;
}
html[dir="rtl"] .tc-sidebar-scrollable {
left: auto;
right: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};
}
.tc-story-river {
position: relative;
left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};
top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
width: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};
padding: 42px 42px 42px 42px;
}
<<if-no-sidebar "
.tc-story-river {
width: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});
}
">>
}
@media print {
body.tc-body {
background-color: transparent;
}
.tc-sidebar-header, .tc-topbar {
display: none;
}
.tc-story-river {
margin: 0;
padding: 0;
}
.tc-story-river .tc-tiddler-frame {
margin: 0;
border: none;
padding: 0;
}
}
/*
** Tiddler styles
*/
.tc-tiddler-frame {
position: relative;
margin-bottom: 28px;
background-color: <<colour tiddler-background>>;
border: 1px solid <<colour tiddler-border>>;
}
{{$:/themes/tiddlywiki/vanilla/sticky}}
.tc-tiddler-info {
padding: 14px 42px 14px 42px;
background-color: <<colour tiddler-info-background>>;
border-top: 1px solid <<colour tiddler-info-border>>;
border-bottom: 1px solid <<colour tiddler-info-border>>;
}
.tc-tiddler-info p {
margin-top: 3px;
margin-bottom: 3px;
}
.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour tiddler-info-tab-background>>;
border-bottom: 1px solid <<colour tiddler-info-tab-background>>;
}
.tc-view-field-table {
width: 100%;
}
.tc-view-field-name {
width: 1%; /* Makes this column be as narrow as possible */
text-align: right;
font-style: italic;
font-weight: 200;
}
.tc-view-field-value {
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-tiddler-frame {
padding: 14px 14px 14px 14px;
}
.tc-tiddler-info {
margin: 0 -14px 0 -14px;
}
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-tiddler-frame {
padding: 28px 42px 42px 42px;
width: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};
border-radius: 20px;
}
<<if-no-sidebar "
.tc-tiddler-frame {
width: 100%;
}
">>
.tc-tiddler-info {
margin: 0 -42px 0 -42px;
}
}
.tc-site-title,
.tc-titlebar {
font-weight: 300;
font-size: 2.35em;
line-height: 1.2em;
color: <<colour tiddler-title-foreground>>;
margin: 0;
}
.tc-site-title {
color: <<colour site-title-foreground>>;
}
.tc-tiddler-title-icon {
vertical-align: middle;
margin-right: .1em;
}
.tc-system-title-prefix {
color: <<colour muted-foreground>>;
}
.tc-titlebar h2 {
font-size: 1em;
display: inline;
}
.tc-titlebar img {
height: 1em;
}
.tc-subtitle {
font-size: 0.9em;
color: <<colour tiddler-subtitle-foreground>>;
font-weight: 300;
}
.tc-subtitle .tc-tiddlylink {
margin-right: .3em;
}
.tc-tiddler-missing .tc-title {
font-style: italic;
font-weight: normal;
}
.tc-tiddler-frame .tc-tiddler-controls {
float: right;
}
.tc-tiddler-controls .tc-drop-down {
font-size: 0.6em;
}
.tc-tiddler-controls .tc-drop-down .tc-drop-down {
font-size: 1em;
}
.tc-tiddler-controls > span > button,
.tc-tiddler-controls > span > span > button,
.tc-tiddler-controls > span > span > span > button {
vertical-align: baseline;
margin-left:5px;
}
.tc-tiddler-controls button svg, .tc-tiddler-controls button img,
.tc-search button svg, .tc-search a svg {
fill: <<colour tiddler-controls-foreground>>;
}
.tc-tiddler-controls button svg, .tc-tiddler-controls button img {
height: 0.75em;
}
.tc-search button svg, .tc-search a svg {
height: 1.2em;
width: 1.2em;
margin: 0 0.25em;
}
.tc-tiddler-controls button.tc-selected svg,
.tc-page-controls button.tc-selected svg {
fill: <<colour tiddler-controls-foreground-selected>>;
}
.tc-tiddler-controls button.tc-btn-invisible:hover svg,
.tc-search button:hover svg, .tc-search a:hover svg {
fill: <<colour tiddler-controls-foreground-hover>>;
}
@media print {
.tc-tiddler-controls {
display: none;
}
}
.tc-tiddler-help { /* Help prompts within tiddler template */
color: <<colour muted-foreground>>;
margin-top: 14px;
}
.tc-tiddler-help a.tc-tiddlylink {
color: <<colour very-muted-foreground>>;
}
.tc-tiddler-frame .tc-edit-texteditor {
width: 100%;
margin: 4px 0 4px 0;
}
.tc-tiddler-frame input.tc-edit-texteditor,
.tc-tiddler-frame textarea.tc-edit-texteditor,
.tc-tiddler-frame iframe.tc-edit-texteditor {
padding: 3px 3px 3px 3px;
border: 1px solid <<colour tiddler-editor-border>>;
background-color: <<colour tiddler-editor-background>>;
line-height: 1.3em;
-webkit-appearance: none;
font-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};
}
.tc-tiddler-frame .tc-binary-warning {
width: 100%;
height: 5em;
text-align: center;
padding: 3em 3em 6em 3em;
background: <<colour alert-background>>;
border: 1px solid <<colour alert-border>>;
}
canvas.tc-edit-bitmapeditor {
border: 6px solid <<colour tiddler-editor-border-image>>;
cursor: crosshair;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
margin-top: 6px;
margin-bottom: 6px;
}
.tc-edit-bitmapeditor-width {
display: block;
}
.tc-edit-bitmapeditor-height {
display: block;
}
.tc-tiddler-body {
clear: both;
}
.tc-tiddler-frame .tc-tiddler-body {
font-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};
line-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};
}
.tc-titlebar, .tc-tiddler-edit-title {
overflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */
}
html body.tc-body.tc-single-tiddler-window {
margin: 1em;
background: <<colour tiddler-background>>;
}
.tc-single-tiddler-window img,
.tc-single-tiddler-window svg,
.tc-single-tiddler-window canvas,
.tc-single-tiddler-window embed,
.tc-single-tiddler-window iframe {
max-width: 100%;
}
/*
** Editor
*/
.tc-editor-toolbar {
margin-top: 8px;
}
.tc-editor-toolbar button {
vertical-align: middle;
background-color: <<colour tiddler-controls-foreground>>;
color: <<colour tiddler-controls-foreground-selected>>;
fill: <<colour tiddler-controls-foreground-selected>>;
border-radius: 4px;
padding: 3px;
margin: 2px 0 2px 4px;
}
.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {
margin-left: 1px;
width: 1em;
border-radius: 8px;
}
.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {
margin-left: 11px;
}
.tc-editor-toolbar button.tc-selected {
background-color: <<colour primary>>;
}
.tc-editor-toolbar button svg {
width: 1.6em;
height: 1.2em;
}
.tc-editor-toolbar button:hover {
background-color: <<colour tiddler-controls-foreground-selected>>;
fill: <<colour background>>;
color: <<colour background>>;
}
.tc-editor-toolbar .tc-text-editor-toolbar-more {
white-space: normal;
}
.tc-editor-toolbar .tc-text-editor-toolbar-more button {
display: inline-block;
padding: 3px;
width: auto;
}
.tc-editor-toolbar .tc-search-results {
padding: 0;
}
/*
** Adjustments for fluid-fixed mode
*/
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
<<if-fluid-fixed text:"""
.tc-story-river {
padding-right: 0;
position: relative;
width: auto;
left: 0;
margin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};
margin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};
}
.tc-tiddler-frame {
width: 100%;
}
.tc-sidebar-scrollable {
left: auto;
bottom: 0;
right: 0;
width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};
}
body.tc-body .tc-storyview-zoomin-tiddler {
width: 100%;
width: calc(100% - 42px);
}
""" hiddenSidebarText:"""
.tc-story-river {
padding-right: 3em;
margin-right: 0;
}
body.tc-body .tc-storyview-zoomin-tiddler {
width: 100%;
width: calc(100% - 84px);
}
""">>
}
/*
** Toolbar buttons
*/
.tc-page-controls svg.tc-image-new-button {
fill: <<colour toolbar-new-button>>;
}
.tc-page-controls svg.tc-image-options-button {
fill: <<colour toolbar-options-button>>;
}
.tc-page-controls svg.tc-image-save-button {
fill: <<colour toolbar-save-button>>;
}
.tc-tiddler-controls button svg.tc-image-info-button {
fill: <<colour toolbar-info-button>>;
}
.tc-tiddler-controls button svg.tc-image-edit-button {
fill: <<colour toolbar-edit-button>>;
}
.tc-tiddler-controls button svg.tc-image-close-button {
fill: <<colour toolbar-close-button>>;
}
.tc-tiddler-controls button svg.tc-image-delete-button {
fill: <<colour toolbar-delete-button>>;
}
.tc-tiddler-controls button svg.tc-image-cancel-button {
fill: <<colour toolbar-cancel-button>>;
}
.tc-tiddler-controls button svg.tc-image-done-button {
fill: <<colour toolbar-done-button>>;
}
/*
** Tiddler edit mode
*/
.tc-tiddler-edit-frame em.tc-edit {
color: <<colour muted-foreground>>;
font-style: normal;
}
.tc-edit-type-dropdown a.tc-tiddlylink-missing {
font-style: normal;
}
.tc-type-selector .tc-edit-typeeditor {
width: 20%;
}
.tc-edit-tags {
border: 1px solid <<colour tiddler-editor-border>>;
padding: 4px 8px 4px 8px;
}
.tc-edit-add-tag {
display: inline-block;
}
.tc-edit-add-tag .tc-add-tag-name input {
width: 50%;
}
.tc-edit-add-tag .tc-keyboard {
display:inline;
}
.tc-edit-tags .tc-tag-label {
display: inline-block;
}
.tc-edit-tags-list {
margin: 14px 0 14px 0;
}
.tc-remove-tag-button {
padding-left: 4px;
}
.tc-tiddler-preview {
overflow: auto;
}
.tc-tiddler-preview-preview {
float: right;
width: 49%;
border: 1px solid <<colour tiddler-editor-border>>;
margin: 4px 0 3px 3px;
padding: 3px 3px 3px 3px;
}
<<if-editor-height-fixed then:"""
.tc-tiddler-preview-preview {
overflow-y: scroll;
height: {{$:/config/TextEditor/EditorHeight/Height}};
}
""">>
.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {
width: 49%;
}
.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {
max-width: 49%;
}
.tc-edit-fields {
width: 100%;
}
.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {
border: none;
padding: 4px;
}
.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {
background-color: <<colour tiddler-editor-fields-odd>>;
}
.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {
background-color: <<colour tiddler-editor-fields-even>>;
}
.tc-edit-field-name {
text-align: right;
}
.tc-edit-field-value input {
width: 100%;
}
.tc-edit-field-remove {
}
.tc-edit-field-remove svg {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
vertical-align: middle;
}
.tc-edit-field-add-name {
display: inline-block;
width: 15%;
}
.tc-edit-field-add-value {
display: inline-block;
width: 40%;
}
.tc-edit-field-add-button {
display: inline-block;
width: 10%;
}
/*
** Storyview Classes
*/
.tc-viewswitcher .tc-image-button {
margin-right: .3em;
}
.tc-storyview-zoomin-tiddler {
position: absolute;
display: block;
width: 100%;
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-storyview-zoomin-tiddler {
width: calc(100% - 84px);
}
}
/*
** Dropdowns
*/
.tc-btn-dropdown {
text-align: left;
}
.tc-btn-dropdown svg, .tc-btn-dropdown img {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
}
.tc-drop-down-wrapper {
position: relative;
}
.tc-drop-down {
min-width: 380px;
border: 1px solid <<colour dropdown-border>>;
background-color: <<colour dropdown-background>>;
padding: 7px 0 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
text-shadow: none;
line-height: 1.4;
}
.tc-drop-down .tc-drop-down {
margin-left: 14px;
}
.tc-drop-down button svg, .tc-drop-down a svg {
fill: <<colour foreground>>;
}
.tc-drop-down button.tc-btn-invisible:hover svg {
fill: <<colour foreground>>;
}
.tc-drop-down .tc-drop-down-info {
padding-left: 14px;
}
.tc-drop-down p {
padding: 0 14px 0 14px;
}
.tc-drop-down svg {
width: 1em;
height: 1em;
}
.tc-drop-down img {
width: 1em;
}
.tc-drop-down a, .tc-drop-down button {
display: block;
padding: 0 14px 0 14px;
width: 100%;
text-align: left;
color: <<colour foreground>>;
line-height: 1.4;
}
.tc-drop-down .tc-tab-set .tc-tab-buttons button {
display: inline-block;
width: auto;
margin-bottom: 0px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.tc-drop-down .tc-prompt {
padding: 0 14px;
}
.tc-drop-down .tc-chooser {
border: none;
}
.tc-drop-down .tc-chooser .tc-swatches-horiz {
font-size: 0.4em;
padding-left: 1.2em;
}
.tc-drop-down .tc-file-input-wrapper {
width: 100%;
}
.tc-drop-down .tc-file-input-wrapper button {
color: <<colour foreground>>;
}
.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
text-decoration: none;
}
.tc-drop-down .tc-tab-buttons button {
background-color: <<colour dropdown-tab-background>>;
}
.tc-drop-down .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour dropdown-tab-background-selected>>;
border-bottom: 1px solid <<colour dropdown-tab-background-selected>>;
}
.tc-drop-down-bullet {
display: inline-block;
width: 0.5em;
}
.tc-drop-down .tc-tab-contents a {
padding: 0 0.5em 0 0.5em;
}
.tc-block-dropdown-wrapper {
position: relative;
}
.tc-block-dropdown {
position: absolute;
min-width: 220px;
border: 1px solid <<colour dropdown-border>>;
background-color: <<colour dropdown-background>>;
padding: 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
z-index: 1000;
text-shadow: none;
}
.tc-block-dropdown.tc-search-drop-down {
margin-left: -12px;
}
.tc-block-dropdown a {
display: block;
padding: 4px 14px 4px 14px;
}
.tc-block-dropdown.tc-search-drop-down a {
display: block;
padding: 0px 10px 0px 10px;
}
.tc-drop-down .tc-dropdown-item-plain,
.tc-block-dropdown .tc-dropdown-item-plain {
padding: 4px 14px 4px 7px;
}
.tc-drop-down .tc-dropdown-item,
.tc-block-dropdown .tc-dropdown-item {
padding: 4px 14px 4px 7px;
color: <<colour muted-foreground>>;
}
.tc-block-dropdown a:hover {
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
text-decoration: none;
}
.tc-search-results {
padding: 0 7px 0 7px;
}
.tc-image-chooser, .tc-colour-chooser {
white-space: normal;
}
.tc-image-chooser a,
.tc-colour-chooser a {
display: inline-block;
vertical-align: top;
text-align: center;
position: relative;
}
.tc-image-chooser a {
border: 1px solid <<colour muted-foreground>>;
padding: 2px;
margin: 2px;
width: 4em;
height: 4em;
}
.tc-colour-chooser a {
padding: 3px;
width: 2em;
height: 2em;
vertical-align: middle;
}
.tc-image-chooser a:hover,
.tc-colour-chooser a:hover {
background: <<colour primary>>;
padding: 0px;
border: 3px solid <<colour primary>>;
}
.tc-image-chooser a svg,
.tc-image-chooser a img {
display: inline-block;
width: auto;
height: auto;
max-width: 3.5em;
max-height: 3.5em;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
/*
** Modals
*/
.tc-modal-wrapper {
position: fixed;
overflow: auto;
overflow-y: scroll;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 900;
}
.tc-modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1000;
background-color: <<colour modal-backdrop>>;
}
.tc-modal {
z-index: 1100;
background-color: <<colour modal-background>>;
border: 1px solid <<colour modal-border>>;
}
@media (max-width: 55em) {
.tc-modal {
position: fixed;
top: 1em;
left: 1em;
right: 1em;
}
.tc-modal-body {
overflow-y: auto;
max-height: 400px;
max-height: 60vh;
}
}
@media (min-width: 55em) {
.tc-modal {
position: fixed;
top: 2em;
left: 25%;
width: 50%;
}
.tc-modal-body {
overflow-y: auto;
max-height: 400px;
max-height: 60vh;
}
}
.tc-modal-header {
padding: 9px 15px;
border-bottom: 1px solid <<colour modal-header-border>>;
}
.tc-modal-header h3 {
margin: 0;
line-height: 30px;
}
.tc-modal-header img, .tc-modal-header svg {
width: 1em;
height: 1em;
}
.tc-modal-body {
padding: 15px;
}
.tc-modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right;
background-color: <<colour modal-footer-background>>;
border-top: 1px solid <<colour modal-footer-border>>;
}
/*
** Notifications
*/
.tc-notification {
position: fixed;
top: 14px;
right: 42px;
z-index: 1300;
max-width: 280px;
padding: 0 14px 0 14px;
background-color: <<colour notification-background>>;
border: 1px solid <<colour notification-border>>;
}
/*
** Tabs
*/
.tc-tab-set.tc-vertical {
display: -webkit-flex;
display: flex;
}
.tc-tab-buttons {
font-size: 0.85em;
padding-top: 1em;
margin-bottom: -2px;
}
.tc-tab-buttons.tc-vertical {
z-index: 100;
display: block;
padding-top: 14px;
vertical-align: top;
text-align: right;
margin-bottom: inherit;
margin-right: -1px;
max-width: 33%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
}
.tc-tab-buttons button.tc-tab-selected {
color: <<colour tab-foreground-selected>>;
background-color: <<colour tab-background-selected>>;
border-left: 1px solid <<colour tab-border-selected>>;
border-top: 1px solid <<colour tab-border-selected>>;
border-right: 1px solid <<colour tab-border-selected>>;
}
.tc-tab-buttons button {
color: <<colour tab-foreground>>;
padding: 3px 5px 3px 5px;
margin-right: 0.3em;
font-weight: 300;
border: none;
background: inherit;
background-color: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-top: 1px solid <<colour tab-border>>;
border-right: 1px solid <<colour tab-border>>;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.tc-tab-buttons.tc-vertical button {
display: block;
width: 100%;
margin-top: 3px;
margin-right: 0;
text-align: right;
background-color: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
border-right: none;
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.tc-tab-buttons.tc-vertical button.tc-tab-selected {
background-color: <<colour tab-background-selected>>;
border-right: 1px solid <<colour tab-background-selected>>;
}
.tc-tab-divider {
border-top: 1px solid <<colour tab-divider>>;
}
.tc-tab-divider.tc-vertical {
display: none;
}
.tc-tab-content {
margin-top: 14px;
}
.tc-tab-content.tc-vertical {
display: inline-block;
vertical-align: top;
padding-top: 0;
padding-left: 14px;
border-left: 1px solid <<colour tab-border>>;
-webkit-flex: 1 0 70%;
flex: 1 0 70%;
overflow: auto;
}
.tc-sidebar-lists .tc-tab-buttons {
margin-bottom: -1px;
}
.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour sidebar-tab-background-selected>>;
color: <<colour sidebar-tab-foreground-selected>>;
border-left: 1px solid <<colour sidebar-tab-border-selected>>;
border-top: 1px solid <<colour sidebar-tab-border-selected>>;
border-right: 1px solid <<colour sidebar-tab-border-selected>>;
}
.tc-sidebar-lists .tc-tab-buttons button {
background-color: <<colour sidebar-tab-background>>;
color: <<colour sidebar-tab-foreground>>;
border-left: 1px solid <<colour sidebar-tab-border>>;
border-top: 1px solid <<colour sidebar-tab-border>>;
border-right: 1px solid <<colour sidebar-tab-border>>;
}
.tc-sidebar-lists .tc-tab-divider {
border-top: 1px solid <<colour sidebar-tab-divider>>;
}
.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {
display: block;
width: 100%;
background-color: <<colour sidebar-tab-background>>;
border-top: none;
border-left: none;
border-bottom: none;
border-right: 1px solid #ccc;
margin-bottom: inherit;
}
.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {
background-color: <<colour sidebar-tab-background-selected>>;
border: none;
}
/*
** Manager
*/
.tc-manager-wrapper {
}
.tc-manager-controls {
}
.tc-manager-control {
margin: 0.5em 0;
}
.tc-manager-list {
width: 100%;
border-top: 1px solid <<colour muted-foreground>>;
border-left: 1px solid <<colour muted-foreground>>;
border-right: 1px solid <<colour muted-foreground>>;
}
.tc-manager-list-item {
}
.tc-manager-list-item-heading {
display: block;
width: 100%;
text-align: left;
border-bottom: 1px solid <<colour muted-foreground>>;
padding: 3px;
}
.tc-manager-list-item-heading-selected {
font-weight: bold;
color: <<colour background>>;
fill: <<colour background>>;
background-color: <<colour foreground>>;
}
.tc-manager-list-item-heading:hover {
background: <<colour primary>>;
color: <<colour background>>;
}
.tc-manager-list-item-content {
display: flex;
}
.tc-manager-list-item-content-sidebar {
flex: 1 0;
background: <<colour tiddler-editor-background>>;
border-right: 0.5em solid <<colour muted-foreground>>;
border-bottom: 0.5em solid <<colour muted-foreground>>;
white-space: nowrap;
}
.tc-manager-list-item-content-item-heading {
display: block;
width: 100%;
text-align: left;
background: <<colour muted-foreground>>;
text-transform: uppercase;
font-size: 0.6em;
font-weight: bold;
padding: 0.5em 0 0.5em 0;
}
.tc-manager-list-item-content-item-body {
padding: 0 0.5em 0 0.5em;
}
.tc-manager-list-item-content-item-body > pre {
margin: 0.5em 0 0.5em 0;
border: none;
background: inherit;
}
.tc-manager-list-item-content-tiddler {
flex: 3 1;
border-left: 0.5em solid <<colour muted-foreground>>;
border-right: 0.5em solid <<colour muted-foreground>>;
border-bottom: 0.5em solid <<colour muted-foreground>>;
}
.tc-manager-list-item-content-item-body > table {
border: none;
padding: 0;
margin: 0;
}
.tc-manager-list-item-content-item-body > table td {
border: none;
}
.tc-manager-icon-editor > button {
width: 100%;
}
.tc-manager-icon-editor > button > svg,
.tc-manager-icon-editor > button > button {
width: 100%;
height: auto;
}
/*
** Alerts
*/
.tc-alerts {
position: fixed;
top: 28px;
left: 0;
right: 0;
max-width: 50%;
z-index: 20000;
}
.tc-alert {
position: relative;
margin: 14px;
padding: 7px;
border: 1px solid <<colour alert-border>>;
background-color: <<colour alert-background>>;
}
.tc-alert-toolbar {
position: absolute;
top: 7px;
right: 7px;
line-height: 0;
}
.tc-alert-toolbar svg {
fill: <<colour alert-muted-foreground>>;
}
.tc-alert-subtitle {
color: <<colour alert-muted-foreground>>;
font-weight: bold;
font-size: 0.8em;
margin-bottom: 0.5em;
}
.tc-alert-body > p {
margin: 0;
}
.tc-alert-highlight {
color: <<colour alert-highlight>>;
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-static-alert {
position: relative;
}
.tc-static-alert-inner {
position: absolute;
z-index: 100;
}
}
.tc-static-alert-inner {
padding: 0 2px 2px 42px;
color: <<colour static-alert-foreground>>;
}
/*
** Floating drafts list
*/
.tc-drafts-list {
z-index: 2000;
position: fixed;
font-size: 0.8em;
left: 0;
bottom: 0;
}
.tc-drafts-list a {
margin: 0 0.5em;
padding: 4px 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border: 1px solid <<colour background>>;
border-bottom-none;
background: <<colour dirty-indicator>>;
color: <<colour background>>;
fill: <<colour background>>;
}
.tc-drafts-list a:hover {
text-decoration: none;
background: <<colour foreground>>;
color: <<colour background>>;
fill: <<colour background>>;
}
.tc-drafts-list a svg {
width: 1em;
height: 1em;
vertical-align: text-bottom;
}
/*
** Control panel
*/
.tc-control-panel td {
padding: 4px;
}
.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {
width: 100%;
}
.tc-plugin-info {
display: flex;
border: 1px solid <<colour muted-foreground>>;
fill: <<colour muted-foreground>>;
background-color: <<colour background>>;
margin: 0.5em 0 0.5em 0;
padding: 4px;
align-items: center;
}
.tc-plugin-info-sub-plugins .tc-plugin-info {
margin: 0.5em;
background: <<colour background>>;
}
.tc-plugin-info-sub-plugin-indicator {
margin: -16px 1em 0 2em;
}
.tc-plugin-info-sub-plugin-indicator button {
color: <<colour background>>;
background: <<colour foreground>>;
border-radius: 8px;
padding: 2px 7px;
font-size: 0.75em;
}
.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {
margin-left: 1em;
margin-right: 1em;
}
.tc-plugin-info-disabled {
background: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
background: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
}
.tc-plugin-info-disabled:hover {
background: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
background: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
}
a.tc-tiddlylink.tc-plugin-info:hover {
text-decoration: none;
background-color: <<colour primary>>;
color: <<colour background>>;
fill: <<colour foreground>>;
}
a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg {
fill: <<colour foreground>>;
}
.tc-plugin-info-chunk {
margin: 2px;
}
.tc-plugin-info-chunk.tc-plugin-info-toggle {
flex-grow: 0;
flex-shrink: 0;
line-height: 1;
}
.tc-plugin-info-chunk.tc-plugin-info-icon {
flex-grow: 0;
flex-shrink: 0;
line-height: 1;
}
.tc-plugin-info-chunk.tc-plugin-info-description {
flex-grow: 1;
}
.tc-plugin-info-chunk.tc-plugin-info-buttons {
font-size: 0.8em;
line-height: 1.2;
flex-grow: 0;
flex-shrink: 0;
text-align: right;
}
.tc-plugin-info-chunk.tc-plugin-info-description h1 {
font-size: 1em;
line-height: 1.2;
margin: 2px 0 2px 0;
}
.tc-plugin-info-chunk.tc-plugin-info-description h2 {
font-size: 0.8em;
line-height: 1.2;
margin: 2px 0 2px 0;
}
.tc-plugin-info-chunk.tc-plugin-info-description div {
font-size: 0.7em;
line-height: 1.2;
margin: 2px 0 2px 0;
}
.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {
width: 1em;
height: 1em;
}
.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {
width: 2em;
height: 2em;
}
.tc-plugin-info-dropdown {
border: 1px solid <<colour muted-foreground>>;
background: <<colour background>>;
margin-top: -8px;
}
.tc-plugin-info-dropdown-message {
background: <<colour message-background>>;
padding: 0.5em 1em 0.5em 1em;
font-weight: bold;
font-size: 0.8em;
}
.tc-plugin-info-dropdown-body {
padding: 1em 1em 0 1em;
background: <<colour background>>;
}
.tc-plugin-info-sub-plugins {
padding: 0.5em;
margin: 0 1em 1em 1em;
background: <<colour notification-background>>;
}
.tc-install-plugin {
font-weight: bold;
background: green;
color: white;
fill: white;
border-radius: 4px;
padding: 3px;
}
.tc-install-plugin.tc-reinstall-downgrade {
background: red;
}
.tc-install-plugin.tc-reinstall {
background: blue;
}
.tc-install-plugin.tc-reinstall-upgrade {
background: orange;
}
.tc-check-list {
line-height: 2em;
}
.tc-check-list .tc-image-button {
height: 1.5em;
}
/*
** Message boxes
*/
.tc-message-box {
border: 1px solid <<colour message-border>>;
background: <<colour message-background>>;
padding: 0px 21px 0px 21px;
font-size: 12px;
line-height: 18px;
color: <<colour message-foreground>>;
}
.tc-message-box svg {
width: 1em;
height: 1em;
vertical-align: text-bottom;
}
/*
** Pictures
*/
.tc-bordered-image {
border: 1px solid <<colour muted-foreground>>;
padding: 5px;
margin: 5px;
}
/*
** Floats
*/
.tc-float-right {
float: right;
}
/*
** Chooser
*/
.tc-chooser {
border-right: 1px solid <<colour table-header-background>>;
border-left: 1px solid <<colour table-header-background>>;
}
.tc-chooser-item {
border-bottom: 1px solid <<colour table-header-background>>;
border-top: 1px solid <<colour table-header-background>>;
padding: 2px 4px 2px 14px;
}
.tc-drop-down .tc-chooser-item {
padding: 2px;
}
.tc-chosen,
.tc-chooser-item:hover {
background-color: <<colour table-header-background>>;
border-color: <<colour table-footer-background>>;
}
.tc-chosen .tc-tiddlylink {
cursor:default;
}
.tc-chooser-item .tc-tiddlylink {
display: block;
text-decoration: none;
background-color: transparent;
}
.tc-chooser-item:hover .tc-tiddlylink:hover {
text-decoration: none;
}
.tc-drop-down .tc-chosen .tc-tiddlylink,
.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {
color: <<colour foreground>>;
}
.tc-chosen > .tc-tiddlylink:before {
margin-left: -10px;
position: relative;
content: "» ";
}
.tc-chooser-item svg,
.tc-chooser-item img{
width: 1em;
height: 1em;
vertical-align: middle;
}
.tc-language-chooser .tc-image-button img {
width: 2em;
vertical-align: -0.15em;
}
/*
** Palette swatches
*/
.tc-swatches-horiz {
}
.tc-swatches-horiz .tc-swatch {
display: inline-block;
}
.tc-swatch {
width: 2em;
height: 2em;
margin: 0.4em;
border: 1px solid #888;
}
input.tc-palette-manager-colour-input {
width: 100%;
padding: 0;
}
/*
** Table of contents
*/
.tc-sidebar-lists .tc-table-of-contents {
white-space: nowrap;
}
.tc-table-of-contents button {
color: <<colour sidebar-foreground>>;
}
.tc-table-of-contents svg {
width: 0.7em;
height: 0.7em;
vertical-align: middle;
fill: <<colour sidebar-foreground>>;
}
.tc-table-of-contents ol {
list-style-type: none;
padding-left: 0;
}
.tc-table-of-contents ol ol {
padding-left: 1em;
}
.tc-table-of-contents li {
font-size: 1.0em;
font-weight: bold;
}
.tc-table-of-contents li a {
font-weight: bold;
}
.tc-table-of-contents li li {
font-size: 0.95em;
font-weight: normal;
line-height: 1.4;
}
.tc-table-of-contents li li a {
font-weight: normal;
}
.tc-table-of-contents li li li {
font-size: 0.95em;
font-weight: 200;
line-height: 1.5;
}
.tc-table-of-contents li li li li {
font-size: 0.95em;
font-weight: 200;
}
.tc-tabbed-table-of-contents {
display: -webkit-flex;
display: flex;
}
.tc-tabbed-table-of-contents .tc-table-of-contents {
z-index: 100;
display: inline-block;
padding-left: 1em;
max-width: 50%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
background: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-top: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
display: block;
padding: 0.12em 1em 0.12em 0.25em;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {
border-top: 1px solid <<colour tab-background>>;
border-left: 1px solid <<colour tab-background>>;
border-bottom: 1px solid <<colour tab-background>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {
text-decoration: none;
border-top: 1px solid <<colour tab-border>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
background: <<colour tab-border>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
border-top: 1px solid <<colour tab-border>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
background: <<colour background>>;
margin-right: -1px;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {
text-decoration: none;
}
.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {
display: inline-block;
vertical-align: top;
padding-left: 1.5em;
padding-right: 1.5em;
border: 1px solid <<colour tab-border>>;
-webkit-flex: 1 0 50%;
flex: 1 0 50%;
}
/*
** Dirty indicator
*/
body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {
fill: <<colour dirty-indicator>>;
color: <<colour dirty-indicator>>;
}
/*
** File inputs
*/
.tc-file-input-wrapper {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}
.tc-file-input-wrapper input[type=file] {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
font-size: 999px;
max-width: 100%;
max-height: 100%;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: pointer;
display: inline-block;
}
/*
** Thumbnail macros
*/
.tc-thumbnail-wrapper {
position: relative;
display: inline-block;
margin: 6px;
vertical-align: top;
}
.tc-thumbnail-right-wrapper {
float:right;
margin: 0.5em 0 0.5em 0.5em;
}
.tc-thumbnail-image {
text-align: center;
overflow: hidden;
border-radius: 3px;
}
.tc-thumbnail-image svg,
.tc-thumbnail-image img {
filter: alpha(opacity=1);
opacity: 1;
min-width: 100%;
min-height: 100%;
max-width: 100%;
}
.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,
.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {
filter: alpha(opacity=0.8);
opacity: 0.8;
}
.tc-thumbnail-background {
position: absolute;
border-radius: 3px;
}
.tc-thumbnail-icon svg,
.tc-thumbnail-icon img {
width: 3em;
height: 3em;
<<filter "drop-shadow(2px 2px 4px rgba(0,0,0,0.3))">>
}
.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,
.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {
fill: #fff;
<<filter "drop-shadow(3px 3px 4px rgba(0,0,0,0.6))">>
}
.tc-thumbnail-icon {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: -webkit-flex;
-webkit-align-items: center;
-webkit-justify-content: center;
display: flex;
align-items: center;
justify-content: center;
}
.tc-thumbnail-caption {
position: absolute;
background-color: #777;
color: #fff;
text-align: center;
bottom: 0;
width: 100%;
filter: alpha(opacity=0.9);
opacity: 0.9;
line-height: 1.4;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
}
.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {
filter: alpha(opacity=1);
opacity: 1;
}
/*
** Diffs
*/
.tc-diff-equal {
background-color: <<colour diff-equal-background>>;
color: <<colour diff-equal-foreground>>;
}
.tc-diff-insert {
background-color: <<colour diff-insert-background>>;
color: <<colour diff-insert-foreground>>;
}
.tc-diff-delete {
background-color: <<colour diff-delete-background>>;
color: <<colour diff-delete-foreground>>;
}
.tc-diff-invisible {
background-color: <<colour diff-invisible-background>>;
color: <<colour diff-invisible-foreground>>;
}
.tc-diff-tiddlers th {
text-align: right;
background: <<colour background>>;
font-weight: normal;
font-style: italic;
}
.tc-diff-tiddlers pre {
margin: 0;
padding: 0;
border: none;
background: none;
}
/*
** Errors
*/
.tc-error {
background: #f00;
color: #fff;
}
/*
** Tree macro
*/
.tc-tree div {
padding-left: 14px;
}
.tc-tree ol {
list-style-type: none;
padding-left: 0;
margin-top: 0;
}
.tc-tree ol ol {
padding-left: 1em;
}
.tc-tree button {
color: #acacac;
}
.tc-tree svg {
fill: #acacac;
}
.tc-tree span svg {
width: 1em;
height: 1em;
vertical-align: baseline;
}
.tc-tree li span {
color: lightgray;
}
select {
color: <<colour select-tag-foreground>>;
background: <<colour select-tag-background>>;
}
/*
** Utility classes for SVG icons
*/
.tc-fill-background {
fill: <<colour background>>;
}
"SF Mono", Monaco,Consolas,"Liberation Mono",Menlo,Courier,monospace
"SF Mono",Monaco,"BentonSans"
'SF Pro Display',-apple-system, BlinkMacSystemFont, "BentonSans","Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"
! Test Cricket and Investing
<<<
those who achieve long term success in India are often those who are unflashy, [[Introvert]]ed, determined and intelligently tenacious.. in [[Cricket]] that is [[Rahul Dravid]]... [[Coffee Can Investing]] is picking Rahul Dravids of the world
<<< [[Saurabh Mukherjea]] in [[Unusual Billionaires]]
!! Key to successful [[Investing]]
It is the difference between Test Cricked and T20
* Leave the risky [[stock]]s alone
* identify the ones which can grow [[Earnings]] and [[Cash Flow]]s steadiliy
* Bet big on them
Successful investing at heart is more about human behavior than technical skills
,,[[Diamonds in the Dust]] | [[12 October 2022]],,
* Financial success is a [[Soft Skills]] where how you behave is more important than what you know. This soft skill is called [[Psychology]] of [[Money]]
* Two Stories
** Janitor saved every penny and died with a fortune of $8M
** Foscone ([[Harvard]] MBA died bankrupt
* Two topics impact everyone - Health and Money
* [[Finance]] has been typically taught as math based or [[Physics]] based governed by formulas and principles which is not true - Decades of research in math and Physics have made us better at exploring universe but not better investors because finance is guided by peoples behaviors
[[Book: Psychology of Money - Morgan Housel]] | [[04 January 2022]]
* Variables in their original, raw format are not suitable to train machine learning algorithms
* This chapter will cover the following recipes:
** ''Identifying numerical and [[Categorical Features]]'' - `df.dtypes`
** ''Quantifying missing data'' - `df.isnull().sum()`
** ''Determining [[Cardinality]] in categorical variables'' - `df.nunique()`
** ''Pinpointing rare categories in categorical variables'' - Categories that appear in a tiny proportion of the observations are rare. Typically, we consider a label to be rare when it ''appears in less than 5% or 1% of the population''. - `data['class'].value_counts() / len(data)`
** [[Identifying a linear relationship]]
** ''Identifying a [[Normal Distribution]]''
*** [[QQ plots]]
*** `sns.distplot(data['x'], bins=30)`
** ''Distinguishing variable [[Distribution]]''
** ''Highlighting [[Outlier]]s''
** ''Comparing feature magnitude''
,,[[Feature Engineering CookBook]] | [[27 August 2022]],,
! Against Epiphanies
* There’s a popular story about [[Netflix]] that says the idea came to Reed after he’d rung up a $40 late fee on Apollo 13 at [[Blockbuster]]. He thought, What if there were no late fees? And BOOM! The idea for Netflix was born. That story!
* but the idea for Netflix had nothing to do with late fees—in fact, at the beginning, we even charged them. More importantly, the idea for Netflix didn’t appear in a moment of divine inspiration—it didn’t come to us in a flash, perfect and useful and obviously right. ''Epiphanies are rare. And when they appear in origin stories, they’re often oversimplified or just plain false''. We like these tales because they align with a romantic idea about inspiration and genius
* Origin stories often hinge on epiphanies. The stories told to skeptical investors, wary board members, inquisitive reporters, and—eventually—the public usually highlight a specific moment: the moment it all became clear. Brian Chesky and Joe Gebbia can’t afford their San Francisco rent, then realize that they can blow up an air mattress and charge people to sleep on it—that’s Airbnb. Travis Kalanick spends $800 on a private driver on New Year’s Eve and thinks there has to be a cheaper way—that’s Uber.
* ''The truth is that for every good idea, there are a thousand bad ones. And sometimes it can be hard to tell the difference''
* One of my goals in telling this story is to puncture some of the myths that attach themselves to narratives like ours. But it’s equally important to me to show how and why some of the things we did at the beginning—often unwittingly—worked
* Truths like: Distrust epiphanies.
* ''The best [[Idea]]s rarely come on a mountaintop in a flash of lightning. They don’t even come to you on the side of a mountain, when you’re stuck in traffic behind a sand truck''. They make themselves apparent more slowly, gradually, over weeks and months. And in fact, when you finally have one, you might not realize it for a long time.
,,[[Marc Randolph: That will never work]] | [[17 July 2022]],,
Three questions that employees can ask to know whether they feel motivated and aligned
* How much do I value my work?
* Is the work compatible with who I am?
* Do I Feel sufficiently in control?
[[Leveraging Neuroscience in the Workplace]]
* Average Indian household holds 85% of its wealth in real estate and other physical goods, 11% in Gold and residual 5% in financial assets. In advanced economies, holds substantially more in financial assets, more likely to finance home mortgage and retirement funds than Indian counterparts
* According to [[RBI]], Indians have allocated 95% of wealth in assets which cannot generate real rate of return ([[Inflation]] beating returns)
! The Four Most Damaging Myths in Indian Investing
!!! Myth 1 - Gold will help me protect my wealth
* In a recent decade, gold has been more volatile than equities ([[Standard Deviation]]) hence,on a volatility adjusted basis there is no compelling reason to own gold
* [[Correlation]] between gold and equities is not negative - over long periods of time, the correlation is marginally positive
!!! Myth 2 - Real Estate will help me grow my wealth
* Major cities, owning real estate has 3-4% appreciation YoY - at best coping with [[Inflation]]
* Indian real estate market is overvalued when comparing the [[Rental Yeild]] to that of other countries
* Exacerbated by lack of transparency in true value of the estate
!!! Myth 3 - Debt Mutual Finds offers decent return with Low Volatility
* companies with good ratings have low [[Yield to Maturity]] and thus unattractive for funds
!!! Myth 4 - GDP growth drives the stock market, so if I an time the economic cycle, I can time the stock market
*[[Ashwath Damodaran]] says stock market are predictors of [[GDP]] growth instead of other way around. 30% correlation between stock market return in US and GDP growth in 4 quarters hence
* Across the world, low or no correlation between stock markets and GDP growth
! Reality
* Over the last 20 years equities have generated 13% [[CAGR]] measured by [[NIFTY]] Index
* Equities suffer problems like lack of sound and trusted advice
* In India, reliance on conventional financial theory - doesn't generate returns
** [[Capital Asset pricing Model (CAPM)]] does not work in [[India]]. It states that high risk generates higher returns, not true for India.
*** Least volatile (low beta) companies in [[Nifty 50]] have generated highest returns compared to higher beta companies
*** The assumptions are delusional - 1) Assumes all investors have free access to all information at no cost 2) There are no taxes or transaction costs
** [[Efficient Market Hypothesis (EMH)]] - stocks prices efficiently discount all the available information in the market
,,[[Diamonds in the Dust]] | [[12 October 2022]],,
CTO Data Science
[[Conference: Data Science and AI Summit]]
!!
* Being [[Liberal]] meant being committed to moving forward in a fast and fair way, while being [[Conservative]] meant being stuck in old and unfair ways—at least that’s how it seemed to me and to most of the people around me
* [[dollar-cost averaging]]—investing essentially the same dollar amount in the market every month, no matter how few or many
* shares it could buy—was the strategy most people followed
* I’ve always been an independent thinker inclined to take risks in search of rewards—not just in the markets, but in most everything. I also feared boredom and mediocrity much more than I feared failure
[[Ray Dalio: Principles]]
* People growing up in different times, economies, places, environments and experiences have learnt different lessons and see finance differently
* No amount of open-mindedness or studying can genuinely recreate the power of uncertainty. Experiencing vs reading (Not equal)
<<<
Some lessons have to be experienced before they can be understood
<<< Michael Batnick
* Investment decisions are highly anchored to those experiences that investors had seen in their own generations (especially in early adulthood) instead of being guided by financial goals and available options
<<<
''Individual [[Investor]]'s willingness to bear risk depends on the personal history and not intelligence or education or sophistication. It is a matter of sheer dumb luck of when and where you were born
''
<<< [[The Economist]]
* Average [[American]] spends more on lottery tickets than on personal health and safety emergencies. For a normal person, this might seem crazy but for them they are paying for their dreams to rid of the life living paycheck to paycheck
* First official currency was created around 600BC but the concepts of saving and [[Investing]] are fairly new or infant idea. Concept of retirement did not exist till 1940s and 401k did not exist till 1978
[[Book: Psychology of Money - Morgan Housel]] | [[04 January 2022]]
!! Guidelines
* Use the ''SHE formula'' - Keep it Succint, Honest and Engaging
* Use the job description to prepare. Pick a couple of pointers and weave it into your story
* Add personality elements in your story
!! What are they looking for
* How well you do with an un-structured question?
* Looking for evidence that qualifies you for this job
!! Pointers
* Part of Global Commercial Data science team
* Worked on Projects like FRP Response model (COVID Initiative) and SME Footprint models - both required high agility
* Developed interest in data science with my internship with a startup - have not looked back since then
* Also interested in Psychology
* Drummer , 8 Years
* Future of ML/AI/DL - was a graphic designer - intrigued by the patterns DL can generate - a scientist now also can create an art
!! Answer
Hi, I am Sumit. I am a part of GCS Data Science team lead by Urvi, George and been in the same team under Ramya for 3 years. I have primarily worked on projects like SME Footprint, 1st gen FRP Response Model & developed first set of Auto-retrain models for the team & also contributed in helping leaders prepare for OCC exam, during my tenure.
Prior to joining Amex, I worked at Indus Towers, world's second largest telecom tower company which has now merged with Bharti Infratel to become a listed company. I joined Indus, out of campus as a Management trainee and contributed to the analytics across the Energy Business Unit. I did my MBA in Marketing from IIM Lucknow and B.Tech in Mechanical Engineering from IIT Mandi. Apart from work I like to play drums, read non-fiction books
!! Answer 2
I am Sumit. I am part of Commercial Marketing Decision science team here at Amex. I was recently promoted to manager. I lead a data science team of 4 to build [[Regression]] models to be used for marketing campaigns for SMEs in US. I have been in the same team for 3.5 years now - where I have build [[Machine Learning]] pipelines to be used for standardizing data science, built first gen self-retraining models for the team.
Prior to working with Amex, I joined Indus Towers (world's second largest telecom tower company - new merged with Bharti infratel) as management trainee, where I analyzed energy consumption patterns and consolidating information at tower sites in the form of an awareness program - know your cosumption
Apart from work, I like to read non-fiction books and play drums. I recently started my own youtube channel
[[08 July 2021]] | [[Preparing for the next role]]
* [[Accounting]] is all about ''record keeping''
!! Balance Sheet
* [[Balance Sheet]] is a scorecard that separate ''What we Have'' ([[Assets]]) and ''Who Owns It ([[Liabilities]])''. The purpose is to connect things to people
* In a Balance Sheet, LHS = RHS, always.
* It is always a snapshot in time
* [[Asset]]s = [[Liabilities]] + [[Owner's Equity]] ([[Shareholder Equity]])
* Raw materials used in building a product is [[Inventory]]
* Balance sheet doesn't record [[Sales]], [[Profit]], [[Cost of Goods Sold (COGS)]], [[Expenses]] etc - for that we have [[Income Statement]] or [[P&L Statement]]
* Balance sheet uses accounting period which is typically annually
* The Balance sheet at the end of accounting period is called ''Ending Balance Sheet'' while that at the start of the period is called ''Starting Balance Sheet''
** Previous period's ending Balance sheet becomes the next period's starting balance sheet
<table>
<thead align='center'>
<tr>
<td colspan=2>Assets (Things & Stuff)</td>
<td colspan=2>Liabilities (People We Owe) + (Owners)</td>
</tr>
</thead>
<tbody>
<tr>
<td>Cash</td>
<td></td>
<td>[[Notes Payable]] (loan from the bank)</td>
<td></td>
</tr>
<tr>
<td>[[Inventory]]</td>
<td></td>
<td>[[Original Investment]] (Shareholder's Equity, Equity, Owner's Equity) </td>
<td></td>
</tr>
<tr>
<td>''Total''</td>
<td></td>
<td>''Total''</td>
<td></td>
</tr>
</tbody>
</table>
* [[Expenses]] are cost of doing business, and they reduce [[Earnings]] or [[Profit]]
,,Tags: [[The Accounting Game by Judith & Mullis]] | [[09 October 2022]],,
* Where trader takes trades based only on price movements
* [[Price Action]] traders don't concern themselves with ''Why'' something happens
* price action traders strongly believe that true info comes from price itself
* ''No need for lagging indicators and other fancy stuff''
* Various Types
** [[Candlestick]] patterns
** [[Moving Averages]]
** [[Floor Pivots]]
** [[Structural Pivots]]
,,[[MarketsWithMadan]] | [[Trading]],,
!! Common Mistakes
* New Manager's eagerness to ''show off his/her technical skills'' can undermine their credibility as a manager and leader - Try not to jump in to solve problems which can raise questions about your manegerial competence
* ''Supervising each individual'' is not leading the team - focusing 1x1 relationships can neglect fundamental aspect of effective leadership : ''harnessing the collective power of the group to improve individual performance and commitment''
* ''Not seeing themselves as change agents'' - Most managers see themselves as targets of org change initiatives. They are also responsible for recommending changes that will enhance group's performance
* ''Not asking for help'': New managers will make mistakes as their personalities are reshaped and stretched to learn the new role. Not asking for help because, a manager is supposed to have all the answers or due to fear of punishment is bad and only worsens the situation. You superior is not a threat but an ally in your development. They are more willing to help than you would think
!! Summary
* new Manager fail to realize that this is not about individual contribution
* DRs won't perform because you have authority over them at the same time you will be constrained by their work
* New Managers are responsible for maintaining their own growth
!! New Manager Misconceptions
''BEGINNING MANAGERS OFTEN FAIL IN THEIR NEW ROLE'', at least initially, because they come to it with misconceptions or myths about what it means to be a boss. These myths, because they are simplistic and incomplete, lead new managers to neglect key leadership responsibilities
<img src='https://lh3.googleusercontent.com/n5GJxyTVTvTaBqYffTyTcWE1Ewf_RSbGxc49MGQxnEtz2M7LgWDztx8P8OnSatouKLNuABlmbnLEhbfCPXmwQFOlqY6a5g0oSmEmAh5gMpl25cQ4JP_HHfq1bUQH5LMUrlQFerVVwQddDC76Mwl95oHmdlKEsFzxwMqQf81u6AxgP5Ul7YP1gmfjLrrJD-9Dc-Y1yZLSoYynC4CTv-ZrBXR3aZ4VffnXJN35Vau5HFr7MvTWRdgWzRT6LnNA3XhhCQiM2o415yxkx_-FkG2feZjj8pq6e47oQ56vBq3tlADSC4gyKCVIINHNmcRqWM9WDi00F8PyvFcsWcSjNVvwZt9GMfSOarJ406VmVM81wQsQpgz0VwzHipljXlkgcCHBkT2v10LUFEYYuC7v4ptL_UY6thhfHADWWrbsvJAZEQ1Wlo1GYrnVG2sp62KDBuGwBc7YDkYQddhT1hJsB_JsZvi-vy7sqqGaG7iIHzGlCWRtkck_S2UVabCwpn0zFtbdjStptPIh3cOMqyvr53y5xm8qoSr2T4o9MHzc9lJ7g5PVkp0cJUSPzIHVgOzoaOxYjkmbaDXpbIAZ8SK3qmxyS1JWkFutrR7l-JCx9BGF6R0KfukLxknU_QQRipSKDAUz1580bsXfbSMEeNmoBECk9j4r0bBRwlTYzkIY9OTB0C9MLFPVW9pmkllprq48S2i2TrCOOyTrbmyRnADOZ7pDgMryQA=w713-h571-no?authuser=0' width=500>
,,[[HBR: 10 Must reads for New Manager]] | [[Linda A. Hill]] | [[12 September 2021]],,
* ''The best customer service is no customer service''
,,[[The Amazon Way: Amazon's 14 Leadership Principles]] | [[25 September 2022]],,
! The New Rules
* [[The Open Ended Question]] - asking these questions repeatedly with variations till the other party gives up
* We are the only animals that haggles - nut no matter how we dress up our negotiations we are always an animal, always acting and reacting first and foremast from our deeply held but mostly invisible and inchoate fears, needs, perceptions and desires.
* Kidnappers are just businessman trying to get the best price
!! Old School Negotiation
* In law enforcement - approach was to talk until figured out how to take them out with a gun. Brute Force.
* 1970 - 5 hijackings every 3 days
* Landmark decision by Fed Court, Downs v. US - 1975 - //a reasonable attempt must be made prior to tactical intervention// $$\rightarrow $$ NYPD became first police force to put together a dedicated team of specialists to handle crisis negotiations
!! Head vs Heart
* [[Harvard Negotiation Project]] - launched in 1979 - to improve theory and practice of negotiations. Cofounders Published [[Getting to Yes]]
* Core Assumption - the animalistic, unreliable, and irrational beast - could be overcome through a more rational, joint problem solving mindset. System
** Separate the person - the emotion- from the problem
** Focus not on ''what'' they are asking for by ''why'' they are asking for it
** work-cooperatively to generate win-win options
** Establish mutually agreed-upon standards for evaluating those possible solutions
* [[Daniel Kahneman]] & [[Amos Tversky]] - people suffer from [[Cognitive Bias]]es - over 150 of them
** [[Loss Aversion]]
** [[Framing Effect]]
** [[Prospect Theory]]
!! [[FBI]] gets emotional
* [[Getting to Yes]] failed to work with emotionally charged negotiations & crises situations. FBI made [[Emotional Intelligence]] central to effective [[Negotiation]]
* [[Listening]] to bring people to calm and logical place
* The first step to mastering [[Negotiation]] is to get over your aversion to negotiating. You don't need to like it; you just need to understand how it works. In this world, you get what you ask for; you just have to ask correctly
* A successful hostage negotiator has to get everything he asks for, without giving anything back of substance, and to do so in a way that leaves the adversaries feeling as if they have a great relationship. His work is ''emotional intelligence on steriods.''
!! The Book
* [[Active Listening]] $$\rightarrow$$ Tools of Haggling $$\rightarrow$$ achive negotiation greatness (the [[Black Swan]])
* Learn to get to ''NO'', because ''NO'' starts the negotiation
* Learn an email technique that ensure you'll never be ignored again
* Negotiation one sheet - a concise primer of nearly all tactics and strategies to think through and customize for whatever kind of deal you're looking to close
,,Tags: [[Never Split the Difference]] | [[13 June 2021]],,
Little can be done about the workload but we can teach our brains to manage them effectively. [[Neuroplasticity]] can help change brain for the better
,,[[Leveraging Neuroscience in the Workplace]],,
* Marc Randolph connected to [[Freud]] ''was in fact my father’s great-uncle, making him my great-grand-uncle''.
* Also, connected to [[Edward Bernays]] - the father of modern public relations, the person who really figured out how to apply new discoveries in [[Psychology]] and [[Psychoanalysis]] to [[Marketing]]
** He is the reason we celebrate [[Thomas Edison]] (and not Joseph Swan) as the inventor of the lightbulb
* [[Marc Randolph]] was working on partly owned idea, but always wondered what it would be like to build a company from the ground up, completely solo—if it would be more fulfilling if the problems I solved were my problems
* ''I kept a little notebook of ideas in my backpack and carried it with me everywhere I went: driving, mountain biking, you name it. It fit into the pocket of hiking shorts really nicely''
,,[[Marc Randolph: That will never work]] | [[17 July 2022]],,
* I gradually learned that prices reflect people’s expectations, so they go up when actual results are better than expected and they go down when they are worse than expected. And most people tend to be biased by their recent experiences.
* I graduated college with a nearly perfect grade point average, which got me into [[Harvard Business School]]. The summer before I started at [[HBS]], I got a job as a clerk on the floor of the [[New York Stock Exchange]]
* ''You better make sense of what happened to other people in other times and other places because if you don’t you won’t know if these things can happen to you and, if they do, you won’t know how to deal with them.”''
* ''When everybody thinks the same thing, it is almost certainly reflected in the price, and betting on it is probably going to be a mistake''. I also learned that for every action (such as easy money and credit) there is a consequence (in this case, higher inflation) roughly proportionate to that action, which causes an approximately equal and opposite reaction (tightening of money and credit) and market reversals.
* In [[Trading]] you have to be defensive and aggressive at the same time. If you are not aggressive, you are not going to make money, and if you are not defensive, you are not going to keep money
* we made halfhearted attempts to sell [[Commodities]] from the U.S. to other countries. We called it ''Bridgewater because we were “bridging the waters”'' and it had a good ring to it.
* Pursuing a mission with friends to help clients beat the markets was much more fun than having a real job
* While [[Stock]]s could stay too high or too low because “greater fools” kept buying or selling them, livestock ended up on the meat counter where it would be priced based on what consumers were willing to pay
* by knowing how many cattle, chickens, and hogs were being fed, how much grain they ate, and how fast they gained weight, I could project both when and how much meat would come to market and when and how much corn and soymeal would be consumed
* I found it much more practical to measure demand as the amount spent (instead of as the quantity bought) and to look at who the buyers and sellers were and why they bought and sold.
* This different approach was one of the key reasons I caught [[Economic]] and [[Market]] moves others missed
* ''The most painful lesson that was repeatedly hammered home is that you can never be sure of anything'': There are always risks out there that can hurt you badly, even in the seemingly safest bets, so it’s always best to assume you’re missing something
* ''meaningful work and meaningful relationships were and still are my primary goals'' and everything I did was for them. Making money was an incidental consequence of that.
* Devon (Ray's firstborn) was named after one of the oldest breeds of cattle known to man, among the first breeds imported into the U.S. and renowned for its high fertility.
[[Ray Dalio: Principles]]
* Luck and Risk are siblings
* Bill Gates, Paul Allen were class mates but so was Kent Evans
* [[Bill Gates]] had access to the most advanced computer of his generation is his school in 8th grade
** Luck - Bill gates experienced a 1 in a million luck of going to that school and getting access to that advanced computer
** Kent evans on the other hand died at the age of 17 during mountain climbing - also 1 in a million chance
* For every Bill Gates there is a Kent Evans
* ''Luck and risk are guided by reality not controlled by individual effort'' - you can't believe in one without equally respecting the other. The outcomes of one person in a community of 8 Billion people cannot be attributed 100% to individual effort
* When judging others attributing success to luck makes you look jealous and mean
* If there are 1 Billion investors in the market, there could possibly be 10 investors who made $1B out of pure luck. That is acceptable, but you would back down if you were to name them
* The reverse is also true. The difference between a bad decision and risk also cannot be measured. They merely ended up on the other side of luck.
* Someone else's failure cannot be completely attributed to bad decisions. We do it anyways because people like simple stories
* ''The line between bold and reckless can be thin. When don;t give luck and risk their proper billing, it is often invisible''
* [[Benjamin Graham]]'s success can be mostly attributed to his GEIKO stock which broke every diversification principle that he laid out in his texts
* Risk and luck are dopplegangers
** Be careful whom you praise and admire
** Be careful whom you look down upon
** Be careful that 100% of outcomes can be attributed to effort and decisions
* Not all success is due to hard work and not all poverty is due to laziness
* Focus on broad patterns than specific individuals
<<<
Success is a lousy teacher, it seduces smart people into thinking that they can't lose
<<< [[Bill Gates]]
* Reverse is also true. Failure is also a lousy teacher - it seduces smart people to think that their decisions were terrible when only sometimes they reflect the unforgiving realities of risk
,,[[Book: Psychology of Money - Morgan Housel]] | [[04 January 2022]],,
!! The [[Income Statement]]
* Income statement is like a movie that connects the snapshots of two [[Balance Sheet]]s in time
* It consists of two categories
** [[Cost of Goods Sold (COGS)]]
** [[Expenses]] for all non-production costs of running the business
* [[Gross Profit]] = Sales - COGS
* [[Net Profit]] or [[Earnings]] = [[Gross Profit]] - [[Expenses]]
* [[Notes Payable]] or Loans do not show up in income statement because the business did not earn it
,,[[The Accounting Game by Judith & Mullis]] | [[09 October 2022]],,
!! Guidelines
* Pick something that does not disqualify from your job. Chose something that's not related to it
* To be successful - Should be humble and reflect self awareness
* Describe a fix-it strategy
!! What are they looking for?
* Willingness to share
* Self awareness
!! Pointers
!!! Not being able to say no to help
''Problem''
* There had been a few weeks on the job where I would log in and just help the first person who pings me on skype/slack
* My day would go on helping people and I would play catchup with my projects on weekends
* Read this book called - [[Essentialism]]
* It mentions
** the success trap - the things that make you successful initially actually pulls you down in the long run
** The person asking for help does not really care where does he/she gets help from
''Fix It Strategy''
* I now bascially follow a plan
** 11 - 1pm i don't repsond to slacks or pings unless extremely urgent
** While i am helping, i am selective about whether this is the most important thing that i would be doing and does it help me with my goals
** Batching up - [[Adam Grant on when to help others]] and [[Give and Take]] - helps derive pleasure from the helping exercise and also not take too much time off of your calendar
* I also read [[Ray Dalio: Principles]]
** The thing that I learnt is that it is important to separate out the worker of your own machine or designer of your own machine
* Vinay Dhingra also mentioned in the Aspire Opening Session that focus not on doing task as that will make you a better task doer
!! Answer
I often find it difficult to say to no to people asking for help. Initially it was to network and the validation that I received that I could contribute. I have spent entire days responding to each and every query that I received on slack/skype throughout the day, and I immediately jumped to problem solving mode often playing catch-up with my own priorities on weekends.
One of the things that I found reading ''Essentialism'' is that often people asking for help don't really care where they are getting help from as long as they get it. I now instead select whether this helps links back to my goals or not and ask whether this is a good use of my time or not.
Another thing that I read in ''Give & Take'' that Batching up queries helps you derive equivalent amount of satisfaction of helping and also limits the exposure of time to a scheduled window. So I now try to respond to queries when I have multiple of them, by that time so of them are resolved already.
[[08 July 2021]] | [[Preparing for the next role]]
!! [[Price Action]] Trading
* Price action analysis is a time tested strategy, used for decades - closed to pit trading
* There are no indicators, hence no 'Analysis Paralysis'
* Less confusion and simplifies trading
* Can be [[backtest]]ed using simple OHLC data and candlestick charts
* Can be applied across instrument classes - Stocks, F&O
* ''It has been proven that clutter free charts reduces cognitive stress for traders''
[[MarketsWithMadan]]
!! Summary
* You don't get to cherry pick your team. You need guidance to navigate transition and improve performance
* Three step model to help
*# Assess people you got and dynamics at play
*# Reshape team members direction and purpose to the business problems
*# Accelerate development by scoring early wins
!! 1. Sizing up People 1x1
Explain that you will use 1x1 to assess whole team and individual team members
!!! Prepare
* Review available personnel history, performance data, and appraisals
* Identify skillsets in team members
* Observe dynamics between people
!!! Create an interview template
* Ask people same questions and see how do their insights vary - What are the strengths and weaknesses of our existing strategy? What are our biggest challenges and opportunities in the short term? In the medium term? What resources could we leverage more eff ectively? How could we improve the way the team works together? If you were in my position, what would your priorities be?
!!! Look for Verbal and Non-Verbal Clues
* Do the volunteer information or do you have to extract it?
* Do they take responsibility for problems or do they point fingers
!!! Summarize and share what you learnt
* Discuss your findings with the team - If your feedback highlights differences in opinion or raise uncomfortable issues - can also observe team under modest stress
* Watching how people respond can reflect team dynamics
!! 2. Reshape Team Members
!!! Composition
* Wait for normal turnover to create space
* Groom high potentials to take on new responsibilities
!!! Alignment
* Easier than other forms of reshaping. Ensuring clear sense of purpose and direction
* Answer these 4 quesions
** What will we accomplish? - mission, goals, and key metrics.
** Why should we do it? - vision statement and incentives - compensation might not be enough, people need meaningful and interesting work with potential for advancement
** How will we do it? - defining the team’s strategy in relation to the organization’s, as well as sorting out the plans and activities needed for execution.
** Who will do what?
!!! Operating Model
* understand when it requires to create subteams
* Frequency of Connects
** Strategic - Infrequent, but time consuming
** Operational - shorter and frequent
** Learning - scheduled on as-needed basis, often after crises or in response to emerging issues - can also focus on team building
!!! Integration
* establishing ground rules and processes to feed and sustain desired behaviors and serving as a role model for your team members
* if Inheriting team with negative group dynamics - remedial work required - changing the destructive patterns of behavior and fostering a sense of shared purpose
!! 3. Accelerating the Team’s Development
* Energizing team by scoring early wins - increases people’s confidence in their capabilities and reinforces the value of their new rules and processes.
* Set challenging goals, on achieving them would create a virtuous cycle of wins and build up confidence
,,[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]] | [[Michael D. Watkins]],,
! Please, Mr. Postman
* [[Reed Hastings]] had incurred a huge late fees on video store, he loved reading latest tech magazines, DVD by rental idea by Marc was on his mind
** Prior to 1997, DVDs were only available in Japan. And even if you found one, there was no way to play it—no DVD players were for sale in the States
** By Mid 1997 only 125 titles to chose from on DVDs, There were tens of thousands of movies on VHS.
** Prior to DVDs, VHS was the way to go, but they were bulky. Video stores were making the money by buying one and renting multiple times. DVDs and VHS were to be tagged as collectibles by Supreme Court.
** DVD provided Cheaper inventory, cheaper shipping—it was looking like movies by mail could work, if (and this was a big if) DVD became a popular format. With other huge categories—books, music, pet food—slowly being taken online, the movie rental category (which brought in $8 billion a year!) was a tempting target. Betting on DVDs was a risk, but it might also be our way to finally crack that category
!! ''Testing the Idea : DVD by Rental''
''Reed mailed him self a copy of a CD to his address through local mail''. As luck might have it, the local mail gives the envelope to drivers, if they had been for some other place, the CD would have broken, then [[Netflix]] idea wouldn't be brought to life
!! Paying for the Idea
* When you start a company, what you’re really doing is getting other people to latch on to an idea. You have to convince your future employees, investors, business partners, and board members that your idea is worth spending money, reputation, and time on. Nowadays, you do that by validating your product ahead of time. You build a website or a prototype, you create the product, you measure traffic or early sales—all so that when you go to potential investors, palm outstretched, you have numbers to prove that what you’re trying to do isn’t just a good idea, but already exists and works.
Marc's son tested an idea of ''Shampoo by mail'' by building a website using [[Squarespace]], set up a credit account on [[Stripe]], bought some banner ads using [[AdSense]], and set up some cloud-based analytics on [[Optimizely]] to measure the results. All within a single weekend which could be six months in 1997
Earlier you could raise money via Powerpoint
* This is called valuation. You come up with a number: What your idea is worth. In common parlance, it’s typically a good thing when someone says, Hey, there’s a million-dollar idea! But in Silicon Valley, that’s not very much.
* To wit: Netflix is currently worth around $150 billion. Back in 1997, though, Reed and I decided that the intellectual property—the idea for DVD by mail, plus the fact that he and I were the ones working on it—was worth ''$3 million
''
* But by not putting any money in at the outset, I’d effectively changed my ownership percentage. To
* but I’d much rather own 30 percent of a company that has money to pursue its goals than 50 percent of a company with no cash on hand
* Eric Meyer, a muppetlike Frenchman with a frenetic manner who would eventually become our chief technology officer. Eric had worked with Reed earlier in his career but now held a senior position at KPMG
* By the mid-nineties, things had changed. Jeff Bezos’s success at Amazon had shown us that it wasn’t just more powerful hardware or more innovative software that would lead to future progress—it was the internet itself. You could leverage it to sell things. It was the future.
* The internet was not predictable. Its innovations were not centralized on a corporate campus. It was a whole new world
,,[[Marc Randolph: That will never work]] | [[17 July 2022]],,
[[Grit]] it turns out refers to [[Perseverance]] and [[Consistency]] and it makes a small impact. People with Grit should also have a [[Growth Mindset]]
* Believe your goals are acheivable
* Take regular breaks and assess whether to change course or continue
[[Leveraging Neuroscience in the Workplace]]
* Markets go up and down. In this seemingly random movement there is a definite structure which helps us to trade those moves
* To understand the structure clearly we need to understand the building blocks
!! Rally and Decline
* ''Rally'' - A series of bars making ''higher highs and higher lows''
**(can happen with existing uptrend or downtrend)
* ''Decline'' - A series of bars making ''lower highs and lower lows''
**(can happen with existing uptrend or downtrend)
[[MarketsWithMadan]]
* I could succeed would be to:
*# Seek out the smartest people who disagreed with me so I could try to understand their reasoning.
*# Know when not to have an opinion.
*# Develop, test, and systemize timeless and universal principles.
*# Balance risks in ways that keep the big upside while reducing the downside.
* becoming tight enough to raise short-term interest rates above long-term rates (which was called [[inverting the yield curve]])
* I learned a great fear of being wrong that shifted my mind-set from thinking “I’m right” to asking myself ''“How do I know I’m right?” And I saw clearly that the best way to answer this question is by finding other independent thinkers who are on the same mission as me and who see things differently from me''. By engaging them in thoughtful disagreement, I’d be able to understand their reasoning and have them stress-test mine. That way, we can all raise our probability of being right. I just want to be right—I don’t care if the right answer comes from me
* Idea meritocracy that encourages thoughtful disagreements and explores and weighs people’s opinions in proportion to their merits.
* People’s greatest weaknesses are the flip sides of their greatest strengths. Most are too much one way and not enough another.
* I saw that to do exceptionally well you have to push your limits and that, if you push your limits, you will crash and it will hurt a lot. You will think you have failed—but that won’t be true unless you give up. Believe it or not, your pain will fade and you will have many other opportunities ahead of you, though you might not see them at the time. The most important thing you can do is to gather the lessons these failures provide and gain humility and radical open-mindedness in order to increase your chances of success. Then you press on.
* ''There is almost always a good path that you just haven’t discovered yet, so look for it until you find it rather than settle for the choice that is then apparent to you''.
[[Ray Dalio: Principles]]
* [[John Bogle]] founder of [[Vanguard]]
* Dangers of not having enough
** Rajat Gupta - McKinsey CEO had a fortune of $100M. But he still wanted more - to be in the billionaires club. He was on the [[Goldman Sachs]]'s board where he learnt that [[Warren Buffet]] was pouring $5B to save it. Gupta called a hedge fund manager to buy 175000 shares of Goldman stocks and made $17M in profits due to insider trading - he went to jail
** Bernie Madoff - has a legit business of executing trades at crazy speeds. But he wanted more so he invented a ponzi scheme
* ''Question to ask - Why someone worth $100M would be desperate for more money they risk everything in pursuit of even more?''
<<<
To make they did not have and didn't need, they risked everything they had and did need
<<< [[Warren Buffet]]
# The hardest financial skill is to get the goalpost to stop moving else it can get dangerous
#* modern [[Capitalism]] is good at generating wealth and envy
#* ''Happiness = Results - Expectations''
# The ceiling of social comparison is so high, that virtually no one will ever hit it
#* The only way to win in Las Vegas Casino is to exit as soon as you enter
# Don't confuse enough with too little - the inability to deny a potential dollar will eventually catchup to you
$ there are many things never worth risking no matter the potential gain - reputation, freedom and indepedence, family and friends, being loved by those who you want them to love you, happiness. And the best shot at keeping these things is knowing when to stop taking risk that might harm them.
,,[[Book: Psychology of Money - Morgan Housel]] | [[05 January 2022]],,
* [[Earnings]] from past accounting periods are called [[Retained Earnings]]
* Goods and Services on credit from other business shows up in [[Accounts Payable]]. It is meant for short-term credit, typically 30 days.
** Compared with [[Notes Payable]] which is meant for long term credit meaning loans.
** Unlike Notes Payable, AP also does not have interest
,,[[The Accounting Game by Judith & Mullis]] | [[09 October 2022]],,
<<<
You must not fool yourself - and you are the easiest person to fool
<<< [[Richard Fynman]]
* As per [[Neuroscientist]]s, When our core beliefs are challenged as a result of [[Totalitarian Ego]], it triggers our primitive brain [[Amygdala]] and activates hot fight-flight response
* To unlock joy of being wrong you need to detach. Two kinds of Detachment
** Detaching past from present - [[Ray Dalio]] says, ''if you don't look back at yourself and you think, //Wow, how stupid i was a year ago//, then you must not have learnt much in last year''
** Detach opinions from identity - Identity cannot change but opinions can
* [[The Yoda Effect]] -
** [[John Pierre]] on [[Good Judgement]] forecasting tournaments, predicted [[Donald Trump]]'s win in [[Presidential Elections]], where [[Nate Silver]] only predicted 6%, [[Brexit]] forecasts hovered around 50% while others were thinking it wouldn't get passed
*
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
!! Guidelines
* Don't come off as arrogant; Be humble
* Be relevant and specific
* show case both soft and technical skills
!! Pointers
* Learning
* Detail Oriented
''First Strength''
* ''Learning''
* In my undergrad, I once asked a guy to teach me photoshop. I was fascinated by how well he used that tool to create various posters - but he would always have some excuse
* Then i was first introduced to a MOOC - [[Lynda.com]] now [[LinkedIn Learning]] - I used to spend hours everyday during my summer breaks to learn from those lynda videos
* I have since then used MOOCs be it [[Coursera]] to learn [[Python]], [[Lynda.com]] for Adobe suite, [[Udacity]] for [[Machine Learning]]
* So, for I have been helped by these MOOCs in advancing my career. I am now at AMEX because of these MOOCs
* They have made my job easier
* I am easy to grab business side of things - spare cognitive capital since these skills were second nature
* I have heard Jayatu mentioning about [[Deep Learning]] courses. He also mentions - don't tell me you have built a model, tell me what have you learnt
* Sole objective in taking up a project
''Second Strength''
* ''Focus on Automation''
* So far tried to reduce the iteration time - to do lot of experiments
** Created standardized pipeline for python
** Case reviews - automated data collection for customers by hitting various tables and prepare a standard excel, so the focus now on is interpreting information
!! Answer
I have an intrinsic motivation to learn new things. I was once asked someone's help to teach me Photoshop, but kept delaying and declining, that's when I first learnt about MOOCs/Online Courses. Since then most of the things in life like Python, AI/ML, Drumming I have learnt are from MOOCs and YouTube. When I cannot find something in MOOCs, I turn to books.
I was able to join and perform at AMEX because of what I learnt myself. It has so far been easier to understand the business side of things since I had already learnt the technical aspects.
[[Preparing for the next role]] | [[08 July 2021]]
Promoted based on technical competence - expected to learn management skills - but the star has faltered. ''Delegation, Strategic thinking and communicating'' the rescue
* People fail that their jobs are no longer about personal achievement but instead about enabling others to achieve, that sometimes driving the bus means taking a backseat. Natural response of rookie managers to challenges - just do it. Why?
** Fear of losing stature
** Fear of abdicating control
** Fear of overburdening staff - lack of opportunity can block their advancement - allow the DRs to make presentations, answer questions and make them engaged
* Cardinal Rule of Management - Your staff members do not need to necessarily like you, but they do need to trust you.
:<img src='https://lh3.googleusercontent.com/H5ODL2lTrMgSelKmCHZNSov_hwNRZ7nTOQS-Uuu6RpnV3mVI4FEAH3FfE286FMOTZ7BCLEAQf5tfjPSb84OfpjE7S7_OqEXacg9gYLbwbcnw7uO-i4Zzyxhu2eNVZz0minKaCJI-2KcuiY1CoZ9fY0MUfrfNjqerpACaP2_Z2psjIujjg_j7RGcT4pU8RRfbOT5Xz-mzFTs5FN6zjf4_hcjjmBUjP6MQL0YsBS8skemQkPv9Ihp5ds3vpzAhZ1UhE-UrqvypxUqx58-GlGnv9TJQ4Olz5U3bxxDiTITNvgz8WZsMqLnPgsx9mIhIX6My4osFCJd9SpJcs0WtOqJVbyYPKI6l8576ldO1TRkmpyDAOClzA6HFoGTSuhK97ckHJQBjPIE2d-7p8qGn5_213fB9zRj4XQUVLswpf2Kn21BXmgNLxrq_PxeIDJXrgGaq4uEaHpyHarw6utkiY9M9_PWM4ZTBKzvuqTgHSSyCZeEYIZ3cFK_6aSw32lVDv4cEW80TyMzy2KKB1kn5TxfFNCSQ59e5JKPNUkSfVtfuMGDLz_kVMXz3s6pEaxAG9hwSe94eJ0vrQbHytvNprd1DLedN4heyxk_sQmyps2Jf6Hkvcz4c3UfXCKXNsk4Z5agZuXXq57e-scoIP4OCAj9ClPQf9HfHAI4898B9-nVbp1v-MGkFxosix4HusSEQaj3e1_zyLqc9atDH0uMJRqIS8CvlFQ=w1629-h840-no?authuser=0' width=1000>
,,[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]] | [[Carol A. Walker]],,
Deliberate practice does not always lead to success. You also have to
* Care about what you are doing
* Avoid repeating mistakes as you would end up practicing mistakes
,,[[Leveraging Neuroscience in the Workplace]],,
* ''Lessons to be learnt from 5 ice ages'' that the earth witnessed - it beings when the summers are not too hot enough to melt the previous winters snow. It is slowly that the snow accumulates overtime that the temperature decreased and overtime becomes ice age - caused by the cycles of moon and earth that happen over 10s of thousands of years
** ''You don't need tremendous force to create tremendous results. Little growth serves fuel for future growth''
* Warren Buffet had time
** Started early and at 30 had a net worth of $1M
** 22% CAGR of portfolio
** 84B dollars of worth came in 60th year
* Linear thinking is much more intuitive than exponential thinking
* Same lessons can be applied for disk storage - early computers had KBs of storage which now have TBs of hard drives that was unfathomable at those times
* ''The only book you need, titled - Shut up and wait'' with only one page of chart of economic growth
,,[[Book: Psychology of Money - Morgan Housel]] | [[05 January 2022]],,
* Crypto - Not as a gamble but as an investment
''Why do we need exchanges?''
* Exchange works as an escrow to verify the buyers and sellers and this does not require exchange having a bank account
* Can buy [[Ether (ETH)]] with [[Bitcoin (BTC)]] which is the beauty of the ecosystem instead of first converting it to INR or USD which could result in fees
''Why [[Bitcoin (BTC)]] price is different for all exchanges?''
* Local vs Global exchange difference due to supply of [[Cryptocurrency]]. In India buyers are higher but sellers are low, so price difference of about 3-5%. This issue is pravalent in all countries. This inefficiency in the market was visible in stock markets as well in the early days
''Extend investment class''
* ''Portfolio diversification'' - online wealth - in future online wealth will also be considered as part of net-worth apart from gold, real-estate and stocks which is an offline portfolio.
* ''Only crypto investors'' - believe this is going to be the next big thing -
** 50-60% have Time Tested tokens like BTC and ETH in their portfolio.
** 20-30% mid time coins running for 1 to 2 years - active coins
** 10-20% new coins (high risk) projects announced - can give 100x to 1000x if a founder was good
* The most important one was our need to do three things:
*# Put our honest thoughts out on the table,
*# Have thoughtful disagreements in which people are willing to shift their opinions as they learn, and
*# Have agreed-upon ways of deciding (e.g., voting, having clear authorities) if disagreements remain so that we can move beyond them without resentments.
* ''Most important wasn’t knowing the future—it was knowing how to react appropriately to the information available at each point in time''
* rather than blindly following the computer’s recommendations, I would have the computer work in parallel with my own analysis and then compare the two. When the computer’s decision was different from mine, I would examine why.
* Truth be known, forecasts aren’t worth very much, and most people who make them don’t make money in the markets. . . . This is because nothing is certain. Rather, study the relationships between economic statistics and market movements - so, rather than forecasting changes in the economic environment and shifting positions in anticipation of them, we pick up these changes as they’re occurring and move our money around to keep in those markets which perform best in that environment.
* Risk-neutral benchmark position and deviating from it with measured bets was the genesis of the style of investment management we would later call [[Alpha overlay]] - With alpha overlay, we were offering a way of making bets independent of underlying market performance
* ''Maturity is the ability to reject good alternatives in order to pursue even better ones''
* Leaders must be judged within the context of the circumstances they encounter. Judging people before really seeing things through their eyes stands in the way of understanding their circumstances—and that isn’t smart
* ''meaningful relationship is one that’s open and honest in a way that lets people be straight with each other''. never valued more traditional, antiseptic relationships where people put on a façade of politeness and don’t say what they really think
* [[Black Monday]],” October 19, 1987, then the largest single-day percentage decline in the history of the stock market
* prompted Bob and me to replace our technical trend-following filter with better value measures and risk controls.
* All great investors and investment approaches have bad patches; losing faith in them at such times is as common a mistake as getting too enamored of them when they do well. Because most ''people are more emotional than logical, they tend to overreact to short-term results''
* I didn’t value experience as much as character, creativity, and common sense, which I suppose was related to my having started Bridgewater two years out of school myself, and my belief that having an ability to figure things out is more important than having specific knowledge of how to do something
* putting responsibility in the hands of inexperienced people doesn’t always work out so well
* Our proposed solutions drew on the portfolio-engineering ideas that would later become core to Bridgewater’s unique way of managing money
* 15-20 good, uncorrelated return streams, I could dramatically reduce my risks without reducing my expected returns - knowing how to combine return streams is even more effective than being able to choose good ones (though of course you have to do both). But individual assets within an asset class are generally about 60 percent correlated with each other, which means they go up or down together more than half the time
* Anytime there was any kind of bad outcome (a trade wasn’t executed, we paid significantly higher transaction costs than expected, etc.) - it was recorded in the error log. The error log (which we now call the issue log) was our first management tool. I learned subsequently how important tools are in helping to reinforce desired behaviors, which led us to create a number of tools I will describe later.
* There are two parts of each person’s brain: the upper-level logical part and the lower-level emotional part. I call these the “two yous.” They fight for control of each person
[[Ray Dalio: Principles]]
<<<
For automated marking of small pivots check [ext[this app|https://nifty50screener.herokuapp.com/]] and code in [[Small Pivot Marking - Code]]. For both large and small pivots use [[Small Large Pivot Marking - Code]]
<<<
!! Small Pivots
* Price movements seem random but they tend to repeat certain price patterns that can be exploited
* Structural pivots are points where a ''Rally turns into decline'' or a ''decline turns into a rally'' - meeting point of rally and decline
* In a rally, when we get 2 lower closes and lower lows, it becomes a decline and we get a ''small pivot high (SPH)''
* In a decline, when we get 2 higher highs and higher closes, it becomes a rally and we get ''Small Pivot Low (SPL)''
!!! Marking Rules
* ''Small Pivot High''
** to define a SPH, we need to tow lower lows and lower closes compared to the anchor bar
** SPH is the highest point between 2 SPLs
** SPH alternates with SPL
* ''Small Pivot Low''
** to define a SPL, we need two higher highs and higher closes compared to the anchor bar
** SPL is the lowest point between 2 SPHs
** SPL and SPH alternate with each other, SPL cannot follow another SPL
!!! Common Rules
* Bar 1 & Bar 2 for marking small pivots does not have to be consecutive bars ''UNIT WE GET TO MARK THESMALL PIVOT (HIGH OR LOW)''
* Anchor bar or a reference bar is taken as a starting point to compare high/lows
** Only Bar 2 of prev marked pivot can be anchor bar to mark the next pivot
* Recently marked small pivot is temporary. It becomes permanent after marking the subsequent small pivot
* Comment - Only Bar 2 of prev pivot can be anchor bar to mark next pivot but if there is too much of space in between pivots then choose another Anchor bar and set of next 2 higher high/higher close or lower low/lower closes to define in between SPH / SPLs
<img src ='https://lh3.googleusercontent.com/FxiIALYrSdsttlr5c1vrWQ-MJkGO5jvX7ZVjgSGfSDYiFR5PDDsz1-fc5S40BcYlHH684CJUk2boRBGSfq96xsna6Du9_Rfnbf7bLI4lyEbA6cKaYzaP1F07-Y8lFSaL6sltqQ5ICrVpvwxlixbKgDca9qxQ0TP7hGd3BSwI6Z9ra20o97j9rwyv3rBPBHlN3U3gSzSUc8hJNf_bafrF3ElmWpUzrfVqvsmWDeofUOA1KrL3EQOWiom0QkPrinbjKkPmG0XNRMnsOpMtSsiShn4IMPutv8KcbxW-DjSE2fpG3t-2qQqGx3RyfHnEm0WHr3Ux1Ofbi4bGFoZu-RENGvJaIVnoDSQVMWiEz7bodWqvQ5T9HjlhM_JyMl4o1VY8bHieQazmunB0FIclj2_CmlzBBO6IMc-IqxHFQ5F2XmqqPbB1isES1mcBEN17ip9sj5ANgmOPkmS3lSU_fdxQGrAYHSYhaVjVo1B-29zzDJuYQGpghla2o1tDc73P5tYNQtDbHyxs8UtY9_czsdMYhIO2sEyHiAe2V72wTdNLXSsarGJS-Y9zQp_pqYsam-N7kzeubrR91ME_DfmMat6oxbEvpmEayHZTRbDc3rLR_Vny0U30ZySzIzOS9b3H4ftRcxIj9ldvC-HcO3YcPINVK9OnW0g1YNc8aoJ9NKTEJjz2uQ3z41syAxTus2T8MLs=w1009-h775-no?authuser=0' style = 'margin: 0 auto' width = '700px'>
!!! Small Trends
The trend formed by small pivots are called small trends
* ''Up-Trend''
** higher SPH and higher SPL - small up trend
** if we are in a small uptrend and the spl is broken - small trend turns down
* ''Downtrend''
** lower SPH and lower SPL - small downtrend
** If we are in small downtrend and SPH is broken - small trend turns down
[[MarketsWithMadan]]
* Two Types of [[Inventory]]
** [[Finished Goods]]
** [[Raw Material]]
* Cost of production (Labor Cost) gets tied up in inventory and the cost cannot be expensed once the inventory is sold. For this reason companies want to sell their inventory quickly to account for expense
* [[Bad Debt]] - is a cost of doing business, it reduces [[Account Receivables]] which is an asset but also reduces [[Earnings]]
* [[Interest]] on Bank loan is also an expense hence it also reduces [[Earnings]]. The principal payback is not recorded on Income Statement. It reduces the [[Liabilities]]
* [[Prepaid Expense]], like an [[Insurance]] Policy is an Asset, since you pay for it to be used for the future.
!! Methods of Accounting
* [[Accrual Method]] - More accurate because it records for all activities, when the business earns, uses it, owes it
** better for investors as it shows more profit in balance sheet because of accounts receivables
** Need to use when the business carries inventory. If the inventory is a gray area, CA may ask whether the inventory is going to be used for profit making
* [[Cash Method]] - Only accounts for the cash
** Good for paying taxes - shows lower profits
** can only be used where there are no inventories. For example, service industries like doctors, lawyers, accountants, consultants, cleaning services etc
*** ''Why?'' - because once the business realizes that it is making profit, it can buy large inventories to reduce the profit and take it as COGS so it wouldn't have to pay taxes
* Govt. allows switching from [[Cash Method]] to [[Accrual Method]] but not in the reverse
* Can maintain books with both accrual and cash methods of accounting - [[Creative Accounting]]
,,[[The Accounting Game by Judith & Mullis]] | [[09 October 2022]],,
!!Answer
A lot of things will change.
First one being that, ''It is not about personal achievement but enabling others to achieve.'' It will not be my technical prowess that got me here, but my ability to guide and motivate the team to achieve their goals
Secondly, despite being B35, I don't have power/authority over my team but an interdependency. My power will come from my ability to establish credibility with my peers, colleagues and superiors
!! Pointers
* It is not about me anymore
** From $$X \rightarrow Y $$, this has become $$ M \rightarrow X \rightarrow Y $$, I don't directly affect the outcome
** My performance is tied to the performance of my team
<img src='https://www.wrike.com/blog/content/uploads/2017/05/Rand-Fishkin-Chart-How-to-Successfully-Move-Individual-Contributors-to-Management-Roles-820x452.gif?av=fd77e4954c96c82e1fa2531a0dd74dfe'>
[[Preparing for the next role]]
<img src='https://lh3.googleusercontent.com/UGGphng1aTY4kLdcVdZ9DkApmkmBrlNpzFAZf8CBM8FDLj2LLXkQoBYpTdZYSbfFrNBdD6l45-ZadpoGgy-yUhvvEKOEo9DosLnzdrvR8pX9k_avDHNoXQf4hi5ldPWEFkjo5CCVvYpX6Tr6fm94jzSZ3wI6aw4ACFmbjh_lBXrsp8NQhx__CTAKjYwERimTXp-hEW9B-wlINui8eELGJChfH9-Uoa9hP2Z1hU0Qt3xjeg8JYJssGjD3kAnUOnjRjb7f9VPTURpGrEuarBG95-V0XrhbKCNd5laTeQAlisrz3oTh2iOzOpma3DgfD0l6eRkv_opHDIZ-GdR7_pi1igyF6TC0uWtIB4PL9FeKWkMsBWyFqM8USUddSn-FtvdQ4F2R_ZR9rbDRuVtaK7lJQLFeT5kH1lBuWXdPwwZj0Fh4DaVjBamECqKtsrGhJFQQJU0Ta-tETFozeNjFUgj0bMNroW52SYIK3DBy5C1qy0wrxzcdNfDn_Xh36-9tbx_y-ZLpfwNrFajIpVIYzyqkwp-9oJFkzMygbHFP-qmsJfF84NBNaq_XCaDUXzKvz772wiJEPwXtAEOg2mJwUc1B2N6QLRayFzON12nrhm2AcmYW2z4z-7Y2hHd8Sgt5xbVhYB5Uo9LihoVacIo7qVH5FivBzaxLZ1sNd8Mtq3cz3xQI382QPQ2mOXP0-32JqBLnSHKkngjzlpr-FEESUEADnNUk6w=w1036-h623-no?authuser=0' width=900>
[[HBR Article|https://hbr.org/2016/06/managing-the-high-intensity-workplace]]
,,[[HBR: 10 Must reads for New Manager]] | [[09 September 2021]],,
! Fundamentals of machine learning
!! Four branches of machine learning
''1. Supervised Learning''
This is by far the most common case. It consists of learning to map input data to known targets (also called ''annotations''), given a set of examples (often annotated by humans). Applications include
* optical character recognition
* speech recognition
* image classification
* language translation
* ''Sequence generation''—Given a picture, predict a caption describing it
* ''Syntax tree prediction''—Given a sentence, predict its decomposition into a syntax tree.
* ''Object detection''—Given a picture, draw a bounding box around certain objects inside the picture.
* ''Image segmentation''—Given a picture, draw a pixel-level mask on a specific object
''2. Unsupervised Learning''
Consists of finding interesting transformations of the
input data without the help of any targets, for the purposes of data visualization, data compression, or data denoising, or to better understand the correlations present in the data at hand.
[[Dimensionality reduction]] and [[Clustering]] are well-known categories of unsupervised learning.
''3. Self-Supervised Learning''
Specific instance of supervised learning. This is supervised learning without human-annotated labels—you can think of it as supervised learning without any
humans in the loop.
For instance, [[Autoencoders]]: where the generated targets are the input, unmodified
''4. Reinforcement Learning''
In [[Reinforcement Learning]], an agent receives information about its environment and learns to choose actions that will maximize some reward. reinforcement learning take over an increasingly large range of real-world applications ''self-driving cars, robotics, resource management, education'', and so on.
!! Glossary
* ''Multiclass classification''—A classification task where each input sample should be categorized into more than two categories: for instance, classifying handwritten digits.
* ''Multilabel classification''—A classification task where each input sample can be assigned multiple labels. For instance, a given image may contain both a cat and a dog and should be annotated both with the “cat” label and the “dog” label. The number of labels per image is usually variable.
!! Evaluating machine-learning models
!!! Training, Validation and Test Sets
''1. Simple Hold-Out Validation'' - Set apart some fraction of your data as your test set. it ''suffers from one flaw'': if little data is available, then your validation and test sets may contain too few samples to be statistically representative of the data at hand. This is easy to recognize: if different random shuffling rounds of the data before splitting end up yielding very different measures of model performance, then you’re having this issue. K-fold validation and iterated K-fold validation are two ways to address this.
''2. K-FOLD VALIDATION''
With this approach, you split your data into K partitions of equal size. For each partition `i`, train a model on the remaining K – 1 partitions, and evaluate it on partition `i`. Your ''final score is then the averages of the K scores'' obtained
''3. ITERATED K-FOLD VALIDATION WITH SHUFFLING''
This one is for situations in which you have relatively little data available and you need to evaluate your model as precisely as possible. I’ve found it to be extremely helpful in Kaggle competitions.
!!! Things to keep in mind
* ''Data representativeness'' — shuffle training and testing data to have equal representation while evaluating model performance
* ''The arrow of time'' - While predicting for future data points with past data, do not shuffle data with future information that can lead to [[Information Leaks]]
* ''Redundancy in your data'' - The train and test data should be disjoint and any duplicates should be removed and kept in either of datasets.
!! Data Preprocessing
''1. VECTORIZATION''
* All inputs and targets in a neural network must be tensors of floating-point data
''2. VALUE NORMALIZATION''
The data should:
* ''Take small values'' — Typically, most values should be in the 0–1 range.
* ''Be homogenous'' — That is, all features should take values in roughly the same range. Not doing so can trigger large gradient updates that will prevent the network from converging.
''3. HANDLING MISSING VALUES''
In general, with neural networks, ''it’s safe to input missing values as 0, with the condition that 0 isn’t already a meaningful value''. The network will learn from exposure to the data that the value 0 means missing data and will start ignoring the value.
Note that if you’re expecting missing values in the test data, but the network was trained on data without any missing values, the network won’t have learned to ignore
missing values! In this situation, you should
artificially generate training samples with missing entries: copy some training samples several times, and drop some of the features that you expect are likely to be missing in the test data.
!!! Feature engineering
[[Feature Engineering]] is the process of using your own knowledge about the data and about the machine-learning algorithm at hand (in this case, a neural network) to make the algorithm work better by applying hardcoded (non-learned) transformations to the data before it goes
into the model.
Before deep learning, ''feature engineering used to be critical, because classical shallow algorithms didn’t have hypothesis spaces rich enough to learn useful features by themselves''.
Fortunately, modern deep learning removes the need for most feature engineering, because [[Neural Network]]s are capable of automatically extracting useful features
from raw data. ''Does this mean you don’t have to worry about feature engineering as long as you’re using deep neural networks? No'', for two reasons:
* Good features still allow you to solve problems more elegantly while using fewer resources.
* Good features let you solve a problem with far less data.
!! Overfitting and Underfitting
The fundamental issue in machine learning is the tension between optimization and generalization.
''Optimization'' refers to the process of adjusting a model to get the best performance possible on the training data (the learning in machine learning),
whereas ''generalization'' refers to how well the trained model performs on data it has never seen before. The goal of the game is to get good generalization, of course, but you don’t control generalization; you can only adjust the model based on its training data.
To prevent a model from learning misleading or irrelevant patterns found in the training data, ''the best solution is to get more training data''.
When that isn’t possible, the ''next-best solution is to modulate the quantity of information that your model is allowed to store ''or to add constraints on what information it’s allowed to store
The processing of fighting overfitting this way is called ''regularization''
!!! Regularization
''1. Reducing the network’s size''
The simplest way to prevent overfitting is to reduce the size of the model: the number of learnable parameters in the model. In deep learning, the ''number of learnable parameters in a model'' is often referred to as the ''model’s capacity''. ''More parameters has more memorization capacity ''and therefore can easily learn a perfect dictionary-like mapping between training samples and their targets
''2. Adding weight regularization''
Models learned using neural networks applies the idea of [[Occam’s Razor]]. A ''simple model'' in this context is a model where the distribution of parameter values
has less entropy.
A common way to mitigate overfitting is to put constraints on the complexity of a network by forcing its weights to take only small values, which makes the
distribution of weight values more regular. This is called ''weight regularization''
* ''L1 regularization''—The cost added is proportional to the ''absolute value of the weight coefficients'' (the L1 norm of the weights).
* ''L2 regularization''—The cost added is proportional to the ''square of the value of the weight coefficients'' (the L2 norm of the weights). L2 regularization is also called ''weight decay'' in the context of neural networks. Don’t let the different name confuse you: weight decay is mathematically the same as L2 regularization.
```python
model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
```
Other regularizers
```python
from keras import regularizers
regularizers.l1(0.001)
regularizers.l1_l2(l1=0.001, l2=0.001)
```
''3. Adding Dropout''
[[Dropout Regularization For Neural Networks]] is one of the most effective and most commonly used regularization techniques for neural networks, developed by Geoff Hinton. Dropout, applied to a layer, consists of randomly dropping out (setting to zero) a number of output features of the layer during training.
At test time, no units are dropped out; instead, the layer’s output values are scaled down by a factor equal to the dropout rate, to balance for the fact that more units are active than at training time.
''The core idea is that introducing noise in the output values of a layer can break up happenstance patterns that aren’t significant (what Hinton refers to as conspiracies), which the network will start memorizing if no noise is present''
```python
model.add(layers.Dropout(0.5))
```
[[The universal workflow of machine learning]]
* Avoid making sentences with "no"
* Affect Label - label your emotions
* Refer yourself in 3rd person to pump yourself up
[[Leveraging Neuroscience in the Workplace]]
Discretization, or binning, is the process of transforming continuous variables into discrete variables by creating a set of contiguous intervals, also called bins, that span the range of the variable values. Discretization is used to change the distribution of skewed variables and to minimize the influence of outliers, and hence improve the performance of some machine learning models.
!! 1. Dividing the variable into intervals of equal width
* Intervals are of same width
```python
width = int(max(df[x]) - min(df[x]))/10
min_value = int(np.floor(df['x'].min()))
max_value = int(np.ceil(df['x'].max()))
intervals = [i for i in range(min_value, max_value + inter_width, inter_width)]
df['x_eq_bins'] = pd.cut(df['x'], intervals, include_lowest=True)
```
!! 2. Sorting the variable values in intervals of equal frequency
* equal-frequency discretization using quantiles consists of dividing the continuous variable into N quantiles, with N to be defined by the user.
* ''useful for skewed variables ''as it spreads the observations over the different bins equally
```python
df['x_eq_quantiles'], intervals = pd.qcut(df['x'], 10, labels=None, retbins=True)
```
!! 3. Performing discretization followed by categorical encoding
* After discretization, the intervals of the variable can be treated as a discrete numerical variable, or as categories in a categorical variable
* using `pd.qcut` to create bins and treating them as categorical
* This variable can be created as monotonic by changing the order of categories
!! 4. Allocating the variable values in arbitrary intervals
* Intuitive binning - user defined intervals
```python
bins = [1,2,3,10]
df['x_user_bins'] = pd.cut(df['x'], bins)
```
!! 5. Performing discretization with k-means clustering
In discretization using k-means clustering, the intervals are the clusters identified by the [[k-means algorithm]]. The number of clusters (k) is defined by the user
```python
disc = KBinsDiscretizer(n_bins=10, encode='ordinal', strategy='kmeans')
disc.fit(df[['x', 'y', 'z']])
disc.bin_edges_ # intervals for each variable identified using kmeans
```
!! 6. Using decision trees for discretization
* Train a [[Decision Tree]] with a single variable against a dependent variable and create a category
* Always creates a [[Monotonic]] relationship
```python
tree_model = DecisionTreeRegressor(max_depth=3, random_state=0)
tree_model.fit(X_train['x'].to_frame(), y_train)
X_train['x_tree'] = tree_model.predict(X_train['x'].to_frame())
tree_model.predict_proba(X_train['x'].to_frame())[:,1]
```
,,[[Feature Engineering CookBook]] | [[28 August 2022]],,
* Million ways to get wealthy, only one way to stay wealthy which requires a combination of frugality and paranoia
** Jessie Livermore - in one day made $3B during the worst financial crisis as he betted against the market. Took his own life in 1933 after losing all the money on levered bets
** Abraham Germanski - Ruined his fortune in the same crash that Jessie Livermore made money - took his life
* 40% of the companies lost almost all of their value over time
* Forbes 500 list has 20% turnover rate
* Getting wealthy involves taking risks and putting yourself out there - keeping money requires opposite of risk. It requires humility and fear that it can be taken just as fast and frugailty and acceptance that at least some of what you made is attributable to luck
* Cannot assume that yesterday's success translates to tomorrow's good fortune
* survival mentality is so key with money. Need to avoid ruin at all costs
** Rick Garren was as smart as Warren Buffet and Charlie Munger. But he was in a hurry to get rich unlike the other two.
* Applying the survival mindset comes down to three things
** More than big returns, I want to be financially unbreakable - stick around enough for compounding to work
** You might say that cash position which earns only 1 percent while during the bull run makes 10% is 9% money made less. But if it helps you prevent selling during the bear market can return multiple times of that value. Because one ill timed stock sell can do more for a lifetime than picking a dozen winners.
** Merely good returns sustained uninterrupted for longest period of time especially in chaos and havoc will always win
** ''Plan on a plan not going according to plan''
,,[[Book: Psychology of Money - Morgan Housel]] | [[05 January 2022]],,
Posing it as a learning problem - For Relationship conflict problems
# To know that there exists a conflict - If I notice something a charged discussion or one of the colleagues reach out to me - I will probably first try to guide them to resolve their conflict by talking to themselves making clear the the relationship disagreement is harmful to the team as well as the organization. If they directly come to me to impose an outcome, they would have learned nothing to resolve the conflicts on their own
# If I notice it still continuing I would step in and listen to both parties, with [[Empathy]] to understand the source of conflict, understand their position and the interests behind them. I would do this connect separately with each one of them, so that both of them have a place to vent out their emotions and get all the information I need to resolve the conflict
# Will then call them together with the objective to find a resolution would be owned by both parties and agree on how to interact if any future issue arises. Can then ask each colleague to make a reasonable proposal that takes into account the interests and priorities of the other
# If they can't reach an agreement will then impose a decision that is best for the team. Will give feedback on what they might do differently next time, so that they have the guidance to resolve conflict on their own
!! References
* [[How to Handle a Disagreement on Your Team|https://hbr.org/2017/07/how-to-handle-a-disagreement-on-your-team]] from [[HBR]]
,,[[Preparing for the next role]] | [[13 January 2022]],,
* [[Cryptocurrency]] is a digital asset. Nothing is physically stored. The transactions are stored on a decentralized server. The authentication is important. If you lose the phrase/password then nothing can be done. Managed storage came into being
!! Two types of storage solutions
!!! 1. Custodial
* dependent on 3rd-party to store crypto eg. [[WazirX]] where exchange takes custody of crypto and keeps them safe
!!! 2. Non-Custodial
* Non-custodial crypto wallet if you don't trust exchanges because of regulations. for example [[TrustWallet]]. Can withdraw crypto bought from exchange and bring it to this wallet. Once you withdraw, only you have access to Bitcoin wallet and nobody else has, not even the creator of TrustWallet. If you lose the password, then it is lost forever
!! Strategy for choosing storage
* bigger exchanges have built in high security because of issues around hacking of exchanges, new exchanges would have to built this from scratch.
* can also keep only the tradeable amount on exchange while keeping the rest on the custodial wallet.
!! What is [[Hodling]]
It is ''holding ''crypto instead of selling. Someone on reddit ''misspelled'' holding to Hodling when bitcoin was falling in 2016/2017.
,,5 | Cryptocurrency Investing x Nischal Shetty- Ep 5 | [[Ankur Warikoo]] | [[27 October 2021]],,
!!! Small Trend - The trend formed by Small Pivots is called small trend
!! Up Trend
* higher SPH and higher SPL
* If we are in small uptrend and SPL is broken: Small Trend turns down
:<img src='https://lh3.googleusercontent.com/H-RctTNN0WnfiF9SmBPcVgfnnMNt5zRAJtKMYdiDWH36o88cE9ikGS7xASErrlpSuoCmHI58PhHw9w3nODU85ktC8FgGB-a4H1eCgmx4A7FKZ9_g8j4dnPeHBht61ttnz7MhquW1ZTH94NbaIKO6AajTOaBqO2kUufUhcg8OXhZIZRyRaML4ohFsMeh2lpcH0NnW8ULltK2suVe8gxLf8rD8tgoQJWEowrnKdqNFaCPV60CdHzvw2mp26KybZA8Nhla1iVRD6yodw802KGB88_wp42J8LwBRcsTNkvxt9t5gGvnLGSEzqLR3eOv1Y3wqGPfM_8rgxAm5m9K-iA4nR5PsCao5BgZLZf4f7F5i925y4ShBI8fWVBwh_y-YBZXE-YO-MZ5H3_fSzCj6ZhPqi7N-YpNSYqOO6ltwCUMJT2rbR1C3fGf-Uwz79yEVRu_ln-_7eHyTkWe6LA71HW0PI_vEGVpvagzfm-dukY-wyD3_dR80Lz6G8zrWX3KIgYoyF9fWIJkeBLaHtO49Q4Igeblhf9uUNEzdYI8jCEqtrUZtkfj6YcvHiqem_1EKHHQAltyQedUJNkx8ne5Q4eohF6YHsPVFnC2JNOio5z3zfql-0bRh1S1NIk9m0ZBvKJDWhLfftRjwOLJ0XIBncSmyl83PoJsQjCh-Op4qlvlz5gETGqLaF0o6EJit9vlUv6OkzeisOWZ6bZIybpE59Y38VBYcDA=w619-h572-no?authuser=0' width=300>
!! Down Trend
* Lower SPL and Lower SPH
* If we are in a small downtrend and SPH is broken: Small trend turns up
:<img src='https://lh3.googleusercontent.com/qqLkztEygfdvJmcBYtyCJ-KRJDljNrNjXUgRNLZRRB_i9kxEvillwhD0G7rnZAzjccmAtFGPkEfI3lmeiADWXtebS9rcj9Cdi_qK_fmrIqPMeKBv3Rvwe8Hip4FCQTwfVhUatJvHdJbQ50qpu10v14etaC2P2lf-7yONeW49rxfa4njNupJs6irFSGOplXfaeqzHcypuzYT0774KrRW4oyN3vsIrVGEAG-nXJdNfWeKqG6t14oC1jeDWwSXopXgDZ-6EPY4-lMF5MjcIm6hQthY3Cvhe5SqytE82aKqPft00R72PBe3Af8pIsUKKhsEUurTHkrC9k6DMV1OQ7Fl6AaHV2yHY0TV4OQ81UWvQJh292R0Khrkmj1bm8o3aPOB9EYniJVIWk7al2PdU4QXk_hxV_oOdU0zsut8Xc9BS74b0tPuNPKEqpyd5RWtvNo1okfiCkCKYNKtJtPA6-kCtdxCeLpO0XeBhJeJLyLG6MlTJH4D2wvioY0kuKFV9VOwN25d9QFDOsDZFITyGLxP6o9zosboDKJWxOPhqGCdKFx6_rX8VeWKcvSdfEZbE1kwxMF-791B6UyGN2rYq4kNBPLQMnNGqijSJYOJ__wwCH7lMCOfKirufyxSg30ovZ1A4Gc51KQGaT_Rtrwkvwfntq1BMSokUdEnFlD2Pfcfh95xnG1_aLNQH84JYGSpEx81bsvVtAaHzW_X9977PmahSSuKU2A=w472-h443-no?authuser=0' width=300>
,,[[MarketsWithMadan]],,
* we became the first global [[Inflation-indexed Bond]] manager in the world
Protecting Wealth
* no matter what asset class one held, there would come a time when it would lose most of its value. This included cash. I had to create a mix of assets that could be good in all economic environments. There were only two big forces to worry about: growth and inflation - ''all weather portfolio''
* [[Risk parity]] investing
* real idea meritocracy, there must be transparency. virtually all our meetings be recorded and made available to everyone.
* I recognized that managers who do not understand people’s different thinking styles cannot understand how the people working for them will handle different situations, which is like a foreman not understanding how his equipment will behave
* took the [[Myers-Briggs Type Indicator (MBTI)]] assessment for the first time and found its description of my preferences to be remarkably accurate.
* Baseball Cards for employees that listed their stats.
:<img src='https://www.stryvemarketing.com/wp-content/uploads/2017/10/BaseballCardTemplate_Example.jpg' width=400>
* Paul was “crazy,” he always believed his own illogical arguments, no matter how strange they sounded to others. While more extreme in the case of someone with [[Bipolar Disorder]], this is something I’ve seen most everyone do
* With so much changing so fast, it had seemed pointless to focus on getting everything “just right” when something newer and better was sure to come along
* To me, ''the greatest success you can have as the person in charge is to orchestrate others to do things well without you''. A step below that is doing things well yourself, and worst of all is doing things poorly yourself. As
* 2007-08 crisis - If you look at the big macro models, they don’t have a financial sector typically in them. They don’t admit the possibility that the financial sector could essentially melt down. Lesson of the crisis is to do a lot more work to make sure that the finance people are talking to the macroeconomist people
* Investors think independently, anticipate things that haven’t happened yet, and put real money at stake with their bets. Policymakers come from environments that nurture consensus, not dissent, that train them to react to things that have already occurred, and that prepare them for negotiations, not placing bets
* Getting a lot of attention for being successful is a bad position to be in. Australians call it the [[Tall poppy syndrome]], because the tallest poppies in a field are the ones most likely to have their heads whacked off.
:<img src='https://images.huffingtonpost.com/2016-07-29-1469819168-6756685-Tallpoppycopy-thumb.jpg' width=200>
[[Ray Dalio: Principles]]
!!Main Ideas
Using six principles together to lead and manage effectively by [[Robert B. Cialdini]]
* ''People like those who like them''
:Uncover real similarities and offer Genuine Praise - and people are likely to follow who is similar to them than who is not
* ''People Repay in Kind''
:Give what you want to receive - Give help if you want to receive help in future. Display behaviors that you want to see in your DRs
* ''Social Proof (people follow the lead of Similar others)''
: Use peer power when available - try to influence horizontally through peers than vertically
* ''Consistency: People align with their clear commitments''
:make their comments active and public, and specially voluntary- get their commitments in writing / email and public
* ''Principle of Authority - People defer to experts''
:expose your expertise; don't assume it is self-evident - utilize the opportunity of offline connects to touch lightly on relevant backgrounds as a natural part of social exchange
* ''Principle of Scarcity - People want more of what they can have less of.''
:Highlight unique benefits and exclusive information - share an information that is exclusive and position it in a way what they stand to lose if they don't get this information instead on what they stand to gain. Make it genuine, cause deceiving has the opposite effect
<hr>
!! Summary
,,[[HBR: 10 Must reads for New Manager]] | [[09 September 2021]],,
! Deep learning for computer vision
[[Convolutional Neural Network]]
''Inputs ''- convnet takes as input tensors of shape `(image_height, image_width, image_channels`). Simple covnets work work so well, compared to a densely connected model. The answer lies in `Conv2D` and `MaxPooling2D` layers
!! The convolution operation
* ''Dense layers learn global patterns'' in their input feature space whereas ''convolution layers learn local patterns'' such as edges, texture and so on.
* Two characteristics of covnets:
** The patterns they learn are translation invariant - After learning a certain pattern in the lower-right corner of a picture, a convnet can recognize it anywhere. This makes convnets data efficient when processing images.
** They can learn spatial hierarchies of patterns - A first convolution layer will learn small local patterns such as edges, a second convolution layer will learn larger patterns made of the features of the first layers, and so on
* Convolutions operate over 3D tensors, called ''feature maps'', with two spatial axes (''height ''and ''width'') as well as a ''depth ''axis (also called the ''channels ''axis).
** Channel - 1 (black and white image)
** Channel - 3 (Color or RGB image)
* When things are unceratain our [[Brain]] distorts how we see things.
* [[Negativity Bias]] - When things are uncertain. 75% of the people that something bad is going to happen
!! Causes of dread and [[Uncertainty]]
* parts of the brain that process [[Conflict]] and [[Anxiety]] overreact - overeacting gut feelings as well. You lose your ability to perceive reality - Dark lens
!! Managing these distortions by
* self talk - say out loud, "MY BRAIN OVEREACTS TO UNCERTAINTY". Not knowing what will happen doesn't necessarily mean something bad will happen - this resets the brain to neutral rather than negative
* Track things you can control - keep a to-do list or take regular breaks - this will help add elements of certainty - helps you feel more secure
,,[[Leveraging Neuroscience in the Workplace]] | [[18 March 2022]],,
!! Summary in 3 bullets
* Don't try to time the market. Once you have identified good companies for your portfolio, even if you buy at their highest today, 10-20 years down the line your outcome would be close to 90% of the perfect timer in the market
* Timing matters where stocks are cyclical and when the companies are not able to generate return on capital above cost of capital.
,,[[Diamonds in the Dust]] | [[17 October 2022]],,
* Most countries have not banned crypto except a few
* [[Nischal Shetty]] has tweeted one tweet everyday n support of crypto in India since last few years
* Nobody can seize it from you, because it is decentralized. They can only tell that it is not allowed in various forms and mechanisms
!! What is the air around crypto in India
* India will follow the suit as the progressive nations will follow
** For example, internet is banned only in North Korea but it is allowed everywhere else, India does the same
** Gambling is banned everywhere, so India has banned gambling
* India's growth in the last 10-20 years is because of internet and software. Crypto is an extension to this. Will it leave this space of technological edge and hamper growth?
Innovation comes first then regulation. You can regulate only which exists. Market is currently forming and eventually will be regulated
!! Taxation in India for Crypto
* Pay tax in the highest tax bracket on the profit from crypto - nothing to worry about
* Consult a CA
,,[[Cryptocurrency Investing x Nischal Shetty]] | [[27 October 2021]] | [[Ankur Warikoo]],,
* life consists of three phases
** In the first, we are dependent on others and we learn.
** In the second, others depend on us and we work.
** third and last, when others no longer depend on us and we no longer have to work, we are free to savor life
* [[Steve Jobs]], who was probably the greatest and most iconic [[Shaper]] of our time, as measured by the size and success of his shaping. A shaper is someone who comes up with unique and valuable visions and builds them out beautifully, typically over the doubts and opposition of others.
* [[Bridgewater]] has often been called the [[Apple]] of the investment world
* all ranked low on called “Concern for Others.” But that doesn’t mean quite what it sounds like.
* [[Muhammad Yunus]], for example. A great [[Philanthropist]], he has devoted his life to helping others. He received the [[Nobel Peace Prize]] for pioneering the ideas of microcredit and microfinance and has won the [[Congressional Gold Medal]], the [[Presidential Medal of Freedom]], the [[Gandhi Peace Prize]], and more. Yet he tested low on “Concern for Others". This is not necessarily bad. When faced with a choice between achieving their goal or pleasing (or not disappointing) others, they would choose achieving their goal every time.
* Said differently, by knowing what someone is like we can have a pretty good idea of what we can expect from them
* management systems in the same way I worked with Greg and others (Bob, etc.) on the investment systems. You are seeing this happen via the development of the Baseball Cards, [[Dot Collector]], Pain Button, testing, job specing, etc
* algorithmic decision making is that it focuses people on cause-effect relationships and, in that way, helps foster a real idea meritocracy
* Dot Collector” (an app that gathers information about people in real time described in detail in the Work Principles
* He never got the praise he deserved, but he didn’t care because his satisfaction came from seeing the results he produced. To me, that is a hero.
* That led me to make a thirty-minute video, How the Economic Machine Works, which I released in 2013. Besides explaining how the economy works it provides a template that helps people assess their economies and gives them guidance about what to do and what to expect during a crisis.
:<iframe width="500" height="300" src="https://www.youtube.com/embed/PHe0bXAIuk0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!! Heros
* [[Joseph Campbell]]’s great book [[The Hero with a Thousand Faces]], because he is a classic hero and I thought it might help him. I also gave him The Lessons of History, a 104-page distillation of the major forces through history by Will and Ariel Durant, and [[River Out of Eden]] by the insightful [[Richard Dawkins]], which explains how evolution works
* Unattainable goals appeal to heroes,” he once told me. “Capable people are those who sit there worrying about the future. The unwise are those who worry about nothing
* Campbell, a “hero” isn’t a perfect person who always gets things right. Far from it. A hero is someone who “found or achieved or [did] something beyond the normal range of achievement,”
* Heroes inevitably experience at least one very big failure (which Campbell calls an “abyss” or the “belly of the whale” experience) that tests whether they have the resilience to come back and fight smarter and with more determination
[[Ray Dalio: Principles]]
* higher SPH and higher SPL make a small uptrend
* lower SPH and lower SPL make a small downtrend
* Meeting point of small uptrend and small downtrend
!!! Marking Rules
* To mark LPH, we need to break the previously marked SPL (temp SPL break is enough)
* To mark LPL, we need to break the previously marked SPH (temp SPH break is enough)
* LPH and LPL alternates
* To mark LPH, we go back to see all the SPHs (that we marked after the last LPL - including highs) and mark the highest SPH as LPH
* To mark LPL, we go back to see all the SPLs (that were marked after the last LPH - including lows) and mark the lowest SPL as LPL
* Once marked, Large Pivots are permanent (unlike SPH/SPL)
,,[[MarketsWithMadan]],,
* A German art dealer, Heinz Berggruen, bought artworks by portfolio and held them for long periods of time till some of the works (~1%) tended to be of extraordinary value
* Long tails the farthest ends of a distribution of outcomes have tremendous influence in finance where a small number of events can account for the majority of outcomes.
** It means we underestimate for a lot of things to fail which causes us to over-react when they do
* Anything that is huge, profitable, famous or influential is the result of a tail event. Some industries
** Venture Capital,
** 40% of all Russel 3000 companies los 70% of their value and never recovered
** Public technology, telecom, public utilities
** 4/10 public companies experience catastrophic loss
* google hiring acceptance - 0.1%, apple - 2%, they have one or two products that account for majority of value generated, and they are run by tail careers
<<<
The man who can do the average thing when all those around him are going crazy is a military genius (same is for investing genius)
<<< Napoleon
* It is the same in investing. Keeping cool during 22% of the time the economy is in or near a recession - you make 3/4 th more money than anyone who waits and sells during recession and buys post recession. Consistently investing wins
* Your success as an investor will be determined by how you respond to punctuated moments of terror not the years spent on cruise control
* In most fields, we only see the finished product but not the losses incurred that led to tail successes product - similar for stand up comics
* even for role models, the gains come from small percent of their actions and that makes our own failures losses and setbacks feel like we are doing something wrong
,,[[Book: Psychology of Money - Morgan Housel]] | [[06 January 2022]],,
!! [[Emotional Intelligence]]
<img src='https://lh3.googleusercontent.com/X2dYLK8uVAE5anmQQgyBCKUzHllYcH3blDjAwn4ju21JSycS3AWSaeHRYvSol-bF3Kugwsfq8sXyhXFlZNyqLDipb0YXhfKY1xu_hw8nyiJGQW_OzErufxmKDngTLzM85-LsoFLB9cSDtiewqe-1b5VoxCPUNCHt4VSoXrfKHE-rRKVOBFOjbBY5f8ILGUL_HY37KrFupMsH-jTbbyDyoEog2lZNsKiwLgve02Rx0dcdd8PohE1koWup1lr6L9CGVbQXC1D5s0VO7SHDKFg94o_vwM-W8wfHA3tbLnEm3HkQDQ8kooORNnGdX067P-5F8dmCfqz0FI84ByNrZsAUB1o6ootYLSagiWBtdYdsLtUOG9r6IBKxmkOzxR0DtD4rR-T4wL2YG26y3eV6n_szi9P5kZViWEi0XtamL5YvUezhvSPS4KI7D7owYqC5iGyb8lY9IjY8wgaW94BQUiVYmHkV28ath6qwSIL2FXz1ZkgclEKEfxqDrPi7QRM22MD8St7xP3R4cEtDH3Juvk0XU-wgWksoD_bAZbY7ecMRGiUq95zXXsETEFFrSDa-_gvAQOsLwx0pKvfkpd1R2mLJm_Xvm-uDMQaPC9E1WNhDHmyeNE_HV4SH6-Yrud7wkJuXvkkhMHAfhtzxGwwq8pvej-yOnQ2Jp3Y-7mFWDN6ZOm4Y66h7n9Ptfe8vG8E2u1Ky16t8kRX9JCnEvmnPynoumLNeeA=w1546-h907-no?authuser=0' width=1000>
,,[[HBR: 10 Must reads for New Manager]] | [[Daniel Goleman]] | [[12 September 2021]],,
Change throws the [[Brain]] in a state of chaos called [[Cognitive Dissonance]] - activates the conflict detector in the brain. Change is easier when the price paid for change is worth the change
Manage this brain chaos
* Name the emotional price you have to pay for the change - [[Switch Cost]] - uncertainty, fear and unfamiliarity
* Use a technique called [[Spreading of alternatives]] - write pros of POD and POA in two columns - the more pros racked for POA - the change will become more manageable - more likely the brain will push forward
** must take care to be authentic and feel the advantages too
,,[[Leveraging Neuroscience in the Workplace]] | [[18 March 2022]],,
* ''The highest form of wealth is the ability to wake up every morning and say i can do whatever i want today''
* Happiness fuel - people want to control their lives - the ability to do what you want with whom you want for as long as you want is priceless
* Using money to buy time and options has a lifestyle benefit few luxury goods can compete with
* ''Doing something you love on a schedule that you can't control becomes something you hate - Reactants''
* Americans are less happy compared to 1950s because they have spent money buying bigger and better stuff which made them have less control over time. A lot of this has to do with the jobs we have involve more thinking than doing - knowledge working - decision making jobs
* If the operating equipment of 21st century is a portable device, then modern factories are not a place but the day itself
,,[[Book: Psychology of Money - Morgan Housel]] | [[06 January 2022]],,
!!! Large Trends
* ''Large Trend''
** The trend formed by large pivots are called Large Trends
** Large Uptrend - Higher LPH and Higher LPL
** Large Downtrend - Lower LPH and Lower LPL
* If we are in Large uptrend and LPL is broken; large trend turns likely down
** Confirmed when we make lower LPH and lower LPL
* If we are in Large downtrend and LPH is broken; Large trend turns likely up
** Confirmed when we make higher LPH and LPL
,,[[MarketsWithMadan]],,
* [[Jim Collins]], who told us that “to transition well, there are only two things that you need to do: Put capable CEOs in place and have a capable governance system to replace the CEOs if they’re not capable.”
* ''Governance is the system of checks and balances ensuring that an organization will be stronger than whoever happens to be leading it at any one time''
* I had learned that it’s wrong to assume either that a person in one role will be successful in another role or that the ways one person operates will work well for another.
* I realized that reality was, if not perfect, at least what we are given to deal with, so that any problems or frustrations I had with it were more productively directed to dealing with them effectively than complaining about them. I came to understand that my encounters were tests of my character and creativity
* Instead of feeling frustrated or overwhelmed, I saw pain as nature’s reminder that there is something important for me to learn
* Successful people, even after they surpass their wildest dreams, they still experience more struggle than glory. This has certainly been true for me. While I surpassed my wildest dreams decades ago, I am still struggling today. In time, I realized that the satisfaction of success doesn’t come from achieving your goals, but from struggling well
* struggling well doesn’t just make your ups better; it makes your downs less bad
* Being well-known is probably worse than being anonymous, all things considered
* It’s now clear to me that my purpose, your purpose, and the purpose of everything else is to evolve and to contribute to evolution in some small way
* Look to the patterns of those things that affect you in order to understand the cause-effect relationships that drive them and to learn principles for dealing with them effectively.
[[Ray Dalio: Principles]]
<<<
Being authentic doesn’t mean that you can be held up to the light and people can see right through you
<<<
<img src='https://hbr.org/resources/images/article_assets/2014/12/R1501C_A.png' width=600>
* [[HBR Article|https://hbr.org/2015/01/the-authenticity-paradox]]
[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]] | [[Herminia Ibarra]]
!! Mindfulness
* state of mind where you bring all your mental attention to the present with open awareness and no judgement
* Ignore mind chatter - Prior memories , distractions and future worries are of no concern
!! Pros
* Brain is calmer
* Able to think much more clearly
* Decisions are easier to make and less draining
* Less prone to distractions
!! How to practice mindfulness
* close your eyes and focus on your breath, or
* Walking mediation - find a quiet pace where you can walk slowly and deliberately, or
* Build into your lunch break
* do it for 5 minutes and increase it to 20 mins
* twice a day
Studies show that 5 minutes of mindfulness you can see the effects in 7 days
,,[[Leveraging Neuroscience in the Workplace]] | [[18 March 2022]],,
* [[Binary Bias]]: When people are presented with binary versions of an article, they defend their own perspective. But if they read a complexified version of article, they are 2x likely to find common ground. They are also more willing to ask more questions and generated more sophisticated, higher quality position statements
* Productive vs unproductive conversations
: <img src="https://pbs.twimg.com/media/EwG03RSUUAUAWWM.jpg" width=600>
,,[[Adam Grant: Think Again]] | [[14 November 2021]],,
* People looking at expensive cars rarely look at the driver and instead imaging if I had that card, I would be cool
* People tend to want wealth to signal to others that they should be liked and admired but in reality those other people bypass admiring you because they use your wealth as benchmark for their own desire to be liked and admired - This is the [[Paradox]]
* If respect and admiration are your goal - buying expensive luxuries are not the right way, it is increasing humility, kindness and empathy
[[Book: Psychology of Money - Morgan Housel]] | [[07 January 2022]]
<img src='xyz'>
* Series of Higher SPH and SPL makes a small uptrend
* Series of lower SPH and SPL makes a small downtrend
* Small Uptrends and downtrends meet at large pivots
* Series of Higher LPH and LPL makes a Large uptrend
* Series of lower LPH and LPL makes a large downtrend
,,[[MarketsWithMadan]] ,,
* I realized that reality was, if not perfect, at least what we are given to deal with, so that any problems or frustrations I had with it were more productively directed to dealing with them effectively than complaining about them. I came to understand that my encounters were tests of my character and creativity
* Instead of feeling frustrated or overwhelmed, I saw pain as nature’s reminder that there is something important for me to learn
* Even after they surpass their wildest dreams, they still experience more struggle than glory. This has certainly been true for me. While I surpassed my wildest dreams decades ago, I am still struggling today. In time, ''I realized that the satisfaction of success doesn’t come from achieving your goals, but from struggling well''. Struggling well doesn’t just make your ups better; it makes your downs less bad.
* //Being well-known is probably worse than being anonymous, all things considered//
* ''It’s now clear to me that my purpose, your purpose, and the purpose of everything else is to evolve and to contribute to evolution in some small way''
* Look to the patterns of those things that affect you in order to understand the cause-effect relationships that drive them and to learn principles for dealing with them effectively. Reality, in turn, will send you loud signals about how well your principles are working by rewarding or punishing you, so you will learn to fine-tune them accordingly.
* If you were to write down what type of encounter you have every time you have one (e.g., the birth of a child, the loss of a job, a personal disagreement) and compile them in a list, it would probably total just a few hundred items and only a few of them would be unique to you
* I suggest that you think through all the principles available to you from different sources and put together a collection of your own that you can turn to whenever reality sends “another one of those” your way.
,,[[Ray Dalio: Principles]] | [[21 September 2021]],,
!! Mutual Dependence
* Managers depend on their bosses and Manager's bosses also depend on them
*Some see the boss as the enemy and fight him at every turn; others are overly compliant, viewing the boss as an all- wise parent
:<img src='https://lh3.googleusercontent.com/Dw0xDQV3HiwBr6vYsV7tMBJBoOciHCf89dO0zPpu-46Dg8rc8l18FmbOG0Uw0NWN455mhQlC7jvspKxzNvIy82rWTUJ6mLWzqRCzrWpPsckhUJDIukhzTn3MQah_sCjyc3Fk9s4OQo_tV4AwJ9Df6KxNfAJQLZwe29Z2un7XPlkV_dECbj5tewdf8HCHn-eLGURWtDnUht66f45VkXj3agVjDno00zfH4rTvZvQpNNZSP9TUsNdy3CeB8KhfRG-Nwgns4ZY32AUNlDtzMulmNtbkX_YLhA7xqnGuoXfrnal6y8cVfmVd516dMFDjrKUCZX67RTLn3IHXpk9CnAHpFjJ16mRLEunn6HLsPPaKNzlIIP78oW9VcR8dS3wPzkC2EPDW2MxRlQTaNttG8F-HDf6bv4wMQiZVUzQ76v1ZMiAMCXxZp6XV28i8zryyDvvGBDtebAlMz8LhkxKMtziyNMi7_CgeCZTXYQF3TjMl0UB3tHdsOzh6d4SO31XSKsfGNAPWZ2NcDl1Jglc4cy2aGdA_2p1k8ofas58WH53pxVDlR0ih16I6flirRAwS6ARVYeC8w1kQUc3eE-sb3Nm8FUcXpabqDoCDzjKxdMv4nVUEefE1mguNLobxcrKM2d_kYjS_UN198UPstMKElre4BpUwpDQSfTwkWPNGO-clfRkX-zX7d-bhTqotO4WVXvM670hdj5S1VJi63aFn09PqTZ5X9g=w733-h807-no?authuser=0' width=500>
,,[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]],,
!! 1. Combining multiple features with statistical operations
```python
f_t = df[features].agg(['sum','prod','mean','std', 'max', 'min'], axis='columns')
```
!! 2. Combining pairs of features with mathematical functions
!! 3. Performing polynomial expansion
!! 4. Deriving new features with decision trees
create new features by combining two or more variables using [[Decision Tree]]s and then used those variables to train the model. This technique is particularly ''useful to derive features that are monotonic with the target'', which is convenient for linear models. The procedure consists of building a decision tree using a subset of the features, typically two or three at a time, and then using the prediction of the tree as a new feature.
```python
tree_model.fit(X_train[['x1', 'x2', 'x3']], y_train)
X_train['new_feat'] = tree_model.predict(X_train[['x1', 'x2', 'x3']])
X_test['new_feat'] = tree_model.predict(X_test[['x1', 'x2', 'x3']])
```
!! 5. Carrying out PCA
* Dimensionality reduction
* sensitive to feature scales
```python
from sklearn.decomposition import PCA
pca = PCA(n_components=None)
pca.fit(X_train)
train_t = pca.transform(X_train)
test_t = pca.transform(X_test)
```
,,[[Feature Engineering CookBook]] | [[28 August 2022]],,
<img src='https://lh3.googleusercontent.com/HtK-rwC7ZSjUSBLFuEq4y0--eKpMpRxJpI6CdCF-HehIpjelgeFi9NmlRxa1r92S8DLeJYaC_pAAIyAevcXpqVKAPQCKbKfHHLdKHqaF9XDPhadrhPufUAa99Tk18t_ucRHgSns0v9zZzEnOo7503gmxz_yEaDfazcBcCFdexabG0L7Jj900jZvAiLICF-D5E_YnOBZFHGKQiruuX_KAVCuiV_rLZROfHD84OLo-KgN007V7-EhAmSYdeijCX12FomMz2XGoxt2OHClwizRSSmJkFhpB3YhKKlT68Mqe2Ime7G_Y-hoE3xxfbRb5hhC2jL7T6_mhiJAzvSTjuT2p5s2N0tYwMKinBsoTaHTsJHNMV53KFNqdA8WsaIxNfFJyFvVLvYI82zZRsC5nehu_yBieiiBkfV3nb-gPrHvIuAi9Xd1DzYCVL-XRhrmBqOZBENPyrb5M-DN_EO2R1lh3J3PYkn09bFbioDrzjKbibCn_mWmAeZM_0pVTctiOrJQ54rEStwds6OFier8a9ael1Gbj20YN6JozEH-qwkqczi5uaLe6jLKOzc3QTv1XYRvbxFxPmtkFKAQm_nkWrQDfe21viM2h3vs65sQjJVQL_BX6HCSHQdkuUDkQZoKULSgcE5l60WRQ16fnqf24v-El5dfdZ3sXpxN-0gr-d1tQV0s5BetwGkOIcNG-sWgXdwpnwq8xvNMQ_MPoqwniHCYGOpsdaw=w1368-h929-no?authuser=0' width=500>
* When LPL7 is broken, Large trend turns down
* Only when we form LPH10 and the new LPL9 is broken, large confirmed downtrend as we now have a lower LPL and lower LPH
[[MarketsWithMadan]]
* Expensive car ownership - is being rich. That means if they own a $100K car then they have $100K less in bank or are $100K in debt
* We tend to judge wealth with what we see. Outward appearances to gauge financial success because we can't see bank accounts & investments
* ''Wealth is an asset that is not converted in the stuff that you see. Only way to be wealthy is not to spend the money you do have''
* Rich vs Wealthy
** Rich is current income
** Wealth is hidden and it is the income not spent. It's value lies in offering options, flexibility and growth to one day purchase more stuff that you could right now
** It is easy to find rich role models but harder to find wealthy ones
,,[[Book: Psychology of Money - Morgan Housel]] | [[07 January 2022]],,
!! Main Ideas
# Don’t confuse what you wish were true with what is really true.
# Don’t worry about looking good—worry instead about achieving your goals.
# Don’t overweight first-order consequences relative to second- and third-order ones.
# Don’t let pain stand in the way of progress.
# Don’t blame bad outcomes on anyone but yourself.
!! Summary
* ''I have found it helpful to think of my life as if it were a game in which each problem I face is a puzzle I need to solve. By solving the puzzle, I get a gem in the form of a principle that helps me avoid the same sort of problem in the future. Collecting these gems continually improves my decision making, so I am able to ascend to higher and higher levels of play in which the game gets harder and the stakes become ever greater.''
* was much more a matter of working effectively, because working effectively could increase my capacity by hundreds of times
* Focus on more to understand and deal with the bad stuff since the good stuff will take care of itself.
* Yet if you don’t put yourself out there with your radical transparency, you won’t learn.
* ''Habit formation typically takes about eighteen months''
* ''We are incapable of designing and building a mosquito, let alone all the species and most of the other things in the universe. So I start from the premise that nature is smarter than I am and try to let nature teach me how reality works.''
* Don’t get hung up on your views of how things “should” be because you will miss out on learning how they really are
* ''Whenever I observe something in nature that I (or mankind) think is wrong, I assume that I’m wrong and try to figure out why what nature is doing makes sense''. Nature seems to define good as what’s good for the whole and optimizes for it, which is preferable. Reality is optimizing for the whole—not for you
* The world is littered with once-great things that deteriorated and failed. So rather than getting stuck hiding our mistakes and pretending we’re perfect, it makes sense to find our imperfections and deal with them. The key is to fail, learn, and improve quickly. If you’re constantly learning and improving, your evolutionary process will look like the one that’s ascending
* The individual’s incentives must be aligned with the group’s goals
* Nature gave us one hell of an incentive to have sex in the form of the great pleasure it provides, even though the purpose of having sex is to contribute to the advancement of the DNA.
* There are at least three kinds of learning that foster evolution:
** ''memory-based learning'' (storing the information that comes in through one’s conscious mind so that we can recall it later);
** ''subconscious learning'' (the knowledge we take away from our experiences that never enters our conscious minds, though it affects our decision making); and
** “learning” that occurs without thinking at all, such as the ''changes in DNA'' that encode a species’ adaptations
* When I began to look at reality through the perspective of figuring out how it really works, instead of thinking things should be different, I realized that most everything that at first seemed “bad” to me. With time, I learned that my initial reaction was because I hadn’t put whatever I was reacting to in the context of the fact that reality is built to optimize for the whole rather than for me
* Chasing after them forces us to evolve, and it is the evolution and not the rewards themselves that matters to us and to those around us.
* As Freud put it, “Love and work are the cornerstones of our humanness
* Carl Jung put it, “Man needs difficulties. They are necessary for health.” Yet most people instinctually avoid pain
* If you can reflect well while you’re in pain (which is probably too much to ask), great. But if you can remember to reflect after it passes, that’s valuable too. (I created a Pain Button app to help people do this
* I’ve come to see that people who overweigh the first-order consequences of their decisions and ignore the effects of second- and subsequent-order consequences rarely reach their goals
* Whatever circumstances life brings you, you will be more likely to succeed and find happiness if you take responsibility for making your decisions well instead of complaining about things being beyond your control. Psychologists call this having an ''“internal locus of control,”'' and studies consistently show that people who have it outperform those who don’t.
* Higher-level thinking gives you the ability to study and influence the cause-effect relationships at play in your life and use them to get the outcomes you want.
* ''When encountering your weaknesses you have four choices:''
*# You can deny them (which is what most people do).
*# You can accept them and work at them in order to try to convert them into strengths (which might or might not work depending on your ability to change) - accepting your weaknesses while trying to turn them into strengths—is probably the best path if it works.
*# You can accept your weaknesses and find ways around them - is the easiest and typically the most viable path
*# Or, you can change what you are going after
* Because it is difficult to see oneself objectively, you need to rely on the input of others and the whole body of evidence to gather your weaknesses
* ''Distinguish between you as the designer of your machine and you as a worker with your machine''. It is much more important that you are a good designer/manager of your life than a good worker in it, you will be on the right path.
** For example, if you as the designer/manager discover that you as the worker can’t do something well, you need to fire yourself as the worker and get a good replacement, while staying in the role of designer/manager of your own life
* Watching people struggle and having others watch you struggle can elicit all kinds of ego-driven emotions such as sympathy, pity, embarrassment, anger, or defensiveness. You need to get over all that and stop seeing struggling as something negative. Most of life’s greatest opportunities come out of moments of struggle
,,[[Ray Dalio: Principles]] | [[21 September 2021]],,
<img src='https://lh3.googleusercontent.com/aINI3OEp1TN1oELB8OmkeJJh6c1FRKFFbV4bSX1kw5iNN5QlFMRa2zTGnzLv1FYrnDc8cUbV1RHLOISCUWtuDYCbidsLykNsZPPQpkqVI4rqDDBDAOmBI9IlqA9yRna7mpzTxplbMFKZyx9jEFRuzR6H56RXY3RuwgPQv_TWhy5ztBYr6-d6hA6md7oZiPyA3KrxZXLxQM-PwDm5izCWVktE6mj2K0MriD2gvU9j9DT7P5osz1z0g5xjTeFe1m25os4faG276ED7x2kt4lKSmn8D3Dh2129BiXJTC8v2IIe_rn908whVBI3qkjB6tgHX2RZUdDT6F7KpXqM9vN9W969B9pvJ_DzNEdJbG9fzGvf8peH8XPwfRZF58_jrsxt4b2oy-FDfmK5PySF9gKbFpsyCBy-3YcBWtDBJtxONVWrFZA6f2AZQ89Lue5VIwwMeN8bxPwJ8wZf9-u09LR4C6-XunryuXdI-JaHGQAZVFnEF-sq06FTufg2E2ZqRuCK5WZUqxscFChQkL7k5FvO5-GI-2Q1KRzTMaMw0qzrA0nJWp-77lu9PtnwWTWiIYghWQlgjGFaR4_Kk4JKnoMK6oVZkdMjr0_a7xjFYU32VlkYCZpQ-I7ncP6TEnABNVTl6JqAe0jU7OrjUhuzTQKWMnJ1rK8X7fYqOk2uwumgm9juPCvrmIIJoaY5wpswjc3beKZzzqTHRaZr2WJxFQp0s7PvLkw=w1570-h716-no?authuser=0' width=1000>
<img src='https://lh3.googleusercontent.com/ClB8kYJx3E3QWpLnDlo_JoGyGOWl1fnjKwHStEwck7zGQqn9JI5de7r67vK9gGE1NzPyg8r5EABdfUZapQUKViEAo1GZawg4pEXLwsOnTgn69PFi0EfCxI3-6Vc_j69WjhhzIMo7k5cv3SI3c9uWpGx1yGe-d-T8u1TsMw6Ly8nZ-2zePavqp65zMV3s1z9n5jfF8NB_Nlw4zXKD0rTk_bdlaq76P8s-YcQ0Ofyk1EuyG-Gup3aF-_2C0bzZc3C5-5wX6UoJlAtuCuQaHM9zO7NEms6ukebC2MkLBr_1Li7MxcKiHv2bSC4ZYrcZ4lE-9dWqHg6MJA6Vx-o9MVk1ntFdPB4BtExCIh20me_XMSuLc0INFF90-oaF1N0PiVaChoCmj4YSTQNF9mjZResvKsxa4yRFVsQaCLRIhxfGQHZSeokewKkVqDdk20vFqjCwPbgS46oYA2IR15nh9s9PsblQ5xYK-PhKk-R8qjv27Hl3oIODQKXJmMNIMUeWDY_2aRcqtwH1VWSJxJEk4GokXKSB1HhEyOOEAXv8AqKPp9PHxL0x3EXuuhWOgoseC8cyGwTzEMHF-9IGlz0zLHL0HgmbrLmoklp3g9A2RtSk2I3vBV8PkJjfFuE8DzGt9QWxxPIS7mS_RmaNzqvpzDbgOXgscTMe57jo6lLGxo6l1od2LUXNXIMCU7UxRXd-QBdZ0LzncSaOr0sSLB2-40-XBhTycg=w1444-h716-no?authuser=0' width=1000>
[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]] |
* Reading [[The Visual Display of Quantitative Information]]
!! 1. Aggregating transactions with mathematical operations
!! 2. Aggregating transactions in a time window
!! 3. Determining the number of local maxima and minima
!! 4. Deriving time elapsed between time-stamped events
!! 5. Creating features from transactions with Featuretools
,,[[Feature Engineering CookBook]] | [[28 August 2022]],,
* There are three kinds of people
** Those who save
** Those who think they can't save
** Those who think they don't need to save
* Building wealth has less to do with investing returns and more to do with savings rate
* frugality is 100% in your control than investment returns which are shrouded in uncertainty
* past a certain level of income, what you need is what just sits below your ego
* It takes a huge amount of research to add 0.1% returns to wealth by investment overperformance while savings alone can affect 2-3% of your returns
* ''The most powerful way to increase savings is not to increase income but to increase humility''
* Savings = Ego - Incoe
** increase savings by decreasing spend which can be decreased by decreasing desires which can be reduced by not caring what others think of you
* Save for the sake of saving. It does not require a goal - this only makes sense in the predictable world
* ''Savings is hedge against life's inevitability to surprise the hell out of your at your worst possible moment''
* Savings without spending goal gives you options and flexibility, the ability to wait and the opportunity to pounce
* What is the return on cash in the bank?
** It gives you the option of changing careers or retiring early or freedom from worry. It is incalculable or too important to put a price tag
* ''Intelligence is not a reliable advantage in our connected world but flexibility is'' - communication, flexibility and empathy are advantages in today's world
,,[[Book: Psychology of Money - Morgan Housel]] | [[08 January 2022]],,
Rally & Decline
$$\big\downarrow$$
Small Pivots
$$\big\downarrow$$
Small Trends
$$\big\downarrow$$
Large Pivots
$$\big\downarrow$$
Large Trends
,,[[MarketsWithMadan]],,
* Empowering employees to handle their problems (Keeping their monkeys to themselves, feeding them and taking care of them) will free up your time
* Clarify that they should propose solutions and implement a solution or report the outcome on a regular update
<img src='https://lh3.googleusercontent.com/GiVRV9uVzn0okyirJTExcwiEjzjsSJBKOdfThGuvq2k7kJWoHefMrzSYsrRvcNXUFlRNPvhbsm1cyk3qPMomXv9OopAzRx9MiMgxdikTZfsgqb0LqyuDrxZYTZccFVLE4WkfxbZVEtmXbIRAvZGBOYE3GW7Hlr6KUzqLXRVQV4sGsYwFNfGWLKX67bu0Wj-JXIvQzaubbykwC40wye5aC0RYA19n8v5RXlF9OozXnKETZdDEZdFrnyxzI7w5CHERl-13c6dw36eyMalu_IFsRlhkDrGUMktUJlq5K7gZMuoBsdpPhhDcJV2BEBmhhBbMmrZISvNu1-kdPFLb87Uj8N_OoglUZ7tPcKI56HMNQj-_ikmvbdeA82bu6wlrJgV1Wy0FM0KOdHdGvsViMPooSivhlne-wjnJc8RBpj13k2D-UktAj3UTdVv8mdv03cEPImaN22V4lDqXKs1TV6Y1WrU9v90T9K4VRVeySpo4XZB5A55hW-7WHx3n5iOG2Cu9pnmV-t2ewW-ABad8DvgtzrI8jidz9fU-meiHKPBfuAO3Hnr9Tahr2-JrCpwCshTfz9RJ68-KeU2rqWbrS1m05B3RqbaD5xQxHhzYn3_O6tEeXATTGpYj3jhRUdTUKq8TlCKMUaT84otrsftOKPGdzpAr5C4l-iCF5Jyk-NdccFC7CzIbwt4NMGZgk6wpsbHMMdhmNi51J9UGez5zFfxNTMUDjw=w580-h916-no?authuser=0' width=500>
* [[HBR Article|https://hbr.org/1999/11/management-time-whos-got-the-monkey]]
,,[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]],,
!! Main Ideas
# Have clear goals.
# Identify and don’t tolerate the problems that stand in the way of your achieving those goals.
# Accurately diagnose the problems to get at their root causes.
# Design plans that will get you around them.
# Do what’s necessary to push these designs through to results
!! Summary
!!! 1. Have Clear Goals
* For example, when setting goals, just set goals. Don’t think about how you will achieve them or what you will do if something goes wrong. When you are diagnosing problems, don’t think about how you will solve them—just diagnose them
* You’ll soon realize that excuses like “//that’s not easy//” or “//it doesn’t seem fair//” or even “//I can’t do that//” are of no value and that it pays to push through.
* Desires are things that you want that can prevent you from reaching your goals. Typically, desires are first-order consequences
* you limit your goals to what you know you can achieve, you are setting the bar way too low
* Your mission is to always make the best possible choices, knowing that you will be rewarded if you do.
!!! 2 Identify and don’t tolerate problems.
* View painful problems as potential improvements that are screaming at you
* Acknowledging your weaknesses is not the same as surrendering to them. It’s the first step toward overcoming them.
!!! 3. Diagnose Problems
* Don’t mistake a cause of a problem with the real problem.
* Diagnose problems to get at their root causes
* A good diagnosis typically takes between fifteen minutes and an hour, depending on how well it’s done and how complex the issue is
!!! 4. Design a Plan
* Think about your problem as a set of outcomes produced by a machine. Practice higher-level thinking by looking down on your machine and thinking about how it can be changed to produce better outcomes.
* Designing precedes doing
!!! 5. Push through results
* Lose sight of the why and you will surely lose sight of your goals
* Your values determine what you want, i.e., your goals
* Everyone has weaknesses. They are generally revealed in the patterns of mistakes they make
* Write down what your one big thing is (such as identifying problems, designing solutions, pushing through to results) and why it exists (your emotions trip you up, you can’t visualize adequate possibilities)
* Humility can be even more valuable than having good mental maps if it leads you to seek out better answers than you could come up with
* Having both open-mindedness and good mental maps is most powerful of all
,,[[Ray Dalio: Principles]] | [[21 September 2021]],,
!! Long Entry Rules for 30 mins chart
# Long over LPH
# Long on SPH above LPH or long on any SPH above LPL
# Re-entry long - Long above the recent high after getting stopped out
# Re-entry long - Long above new SPH above LPH
# Re-entry long - again break of LPH
# Gap-up - If not in trade and gap is above LPH or below LPL line; then enter on break of high of first 30 min bar for long and break of low of first bar for short
# Vice-Versa for shorts
!! Exit Rules
# Stoploss = Last SPL. If it is too far then 0.25 - 0.4% of [[NIFTY]] Value
# Early exit idea - Exit at the break of the low of entry bar or preceding bar of the entry bar. One can also exit if a bar that closes below the entry point and that bar low (for longs)
# Trailing SL = successive higher SPLs or LPLs
# Gapdown = If in trade and gap against our trade, then exit at the break of the low of 30 min bar
[[MarketsWithMadan]]
* You are not a spreadsheet
* Do not aim to be coldly rational when making financial decisions - aim to be reasonable
* Fevers help fight bodily infections by slowing down the replication rate. They turn on the immune system
** Wagner Yari treated mental illness, syphilis by introducing malaria virus to induce fevers - was awarded Nobel
* We don;t want a strategy that is mathematically optimal but one that optimizes how well we sleep at night
* Harry Markwoitz - minimizes future regret
* investing has a social compoenent that is often ignored when viewed through a strictly financial lens
* There are a few financial vfariables more correlated to performance than commitment to a strategy during its lean years
* Making money in the markets has certain odds
** 50% in 1D, 68% in 1 Year, 88% in 10 Years and 100% in 20 years
* If you are not passionate about the company, you will not likely stick with it during the downtimes. But for the ones you are passionate about, you will at least think that you are part of something meaningful.
* Investing is effectively giving money to strangers. People prefer investing in home countries but ignore 95% of the planet is reasonable
,,[[Book: Psychology of Money - Morgan Housel]] | [[08 January 2022]],,
* ''Closed-minded people say things like “I could be wrong . . . but here’s my opinion.”'' This is a classic cue I hear all the time. It’s often a perfunctory gesture that allows people to hold their own opinion while convincing themselves that they are being open-minded. If your statement starts with “I could be wrong” or “I’m not believable,” you should probably follow it with a question and not an assertion. Open-minded people know when to make statements and when to ask questions.
* ''The two biggest barriers to good decision making are your ego and your blind spots'' - these are fatal flaws that keep intelligent, hardworking people from living up to their potential.
** To be effective you must not let your need to be right be more important than your need to find out what’s true
** Just as we all have different ranges for hearing pitch and seeing colors, we have different ranges for seeing and understanding things
** When you point out someone’s psychological weakness, it’s generally about as well received as if you pointed out a physical weakness.
* When trying to figure things out, most people spin in their own heads instead of taking in all the wonderful thinking available to them. As a result, they continually run toward what they see and keep crashing into what they are blind to until the crashing leads them to adapt
* ''Radical open-mindedness is motivated by the genuine worry that you might not be seeing your choices optimally. It is the ability to effectively explore different points of view and different possibilities without letting your ego or your blind spots get in your way
''
* They understand that you can’t make a great decision without swimming for a while in a state of “not knowing.
* People interested in making the best possible decisions are rarely confident that they have the best answers. They recognize that they have weaknesses and blind spots, and they always seek to learn more so that they can get around them.
* You should make it clear that you are asking questions because you are seeking to understand their perspective. Conversely, if you are clearly the more believable person, you might politely remind the other of that and suggest that they ask you questions.
* ''thoughtful disagreement, your goal is not to convince the other party that you are right—it is to find out which view is true and decide what to do about it''
** observe a “two-minute rule” in which neither interrupts the other, so they both have time to get all their thoughts out.
** It doesn’t pay to be open-minded with everyone. Instead, spend your time exploring ideas with the most believable people you have access to
* It’s easy to tell an open-minded person from a closed-minded person because they act very differently.
** They feel bad about getting something wrong and are more interested in being proven right
** Closed-minded people block others from speaking.
** Open-minded people can take in the thoughts of others without losing their ability to think well
* you consistently use feelings of anger/frustration as cues to calm down, slow down, and approach the subject at hand thoughtfully, over time you’ll experience negative emotions much less frequently
* ''Gaining open-mindedness doesn’t mean losing assertiveness. In fact, because it increases one’s odds of being right, it should increase one’s confidence''
,,[[Ray Dalio: Principles]] | [[21 September 2021]],,
<img src='https://lh3.googleusercontent.com/f0GXIJeL6AP7ELVtwCvkR8c7JX_TDWWRyTZVMXaAJzNeA9gxZApuFhzlDX8-AJJC5NImF-405xyodrnXl5mjH8wut3FFil__Mq3Vs014pk7ynnPHUkkdjk2PV5S4SbAMc6yxhKZtubph9rci5QJbFD4V01fRRTMlbKky3u3Vy1IuwuuULcLRmgv-eYnW9WFXBsoHorL5mBurx7YYOPKTihkGl0kTbomg3Tyl4-W3pm4yIRJyhqRmP9zHd95Py63E1MbqQLiJ2qRbF0nycKz85TY7Z38JadJydpgASnRy4JiVFkj4L-9agChPFSMbMZ0GGe46JgApynFECmxU9fiFa23t95z397GfGxgZippgMWIdIOhUEgM1xt29mjmjvwrUtKNj0vi_Mk6sxlU94y23tQxkhFbMcQwIsdlZEvJxda_gzfIqykIMTh-vMGwjc5Conc7HDsHMGLfDQZGdwsi3lC2x9VugHLtY7ygi3kobo2hWYuzKQ28nZZpNOy52z6_XvY029j-V_QSWR44o_G8Yn1VrmXcu2wHXZ31RY38KJS9yGQWtc9W3a5rrLseLg9Rcy47FtesOrTpa1QCZegMDbhPD6Oe-jUPgblK8ULnidRwdoFUnTk4B0xfVR1lgG-wNg6dlSSlfWKCv19hGZGpMv1T0rJfsgo-f--rIgs88xorpC8JHLJKAHk1bIek4gfdKoAclgk-oxKwZ9dvVnoEZ2Wv1Pg=w1656-h725-no?authuser=0' width=1000>
* [[HBR Article|https://hbr.org/2012/06/how-managers-become-leaders]]
,,[[HBR: 10 Must reads for New Manager]] | [[12 September 2021]],,
!! Long Entry
# Entry - Long over LPH
# Long on SPH above LPH or long on any SPH above LPL
# Re-entry long - Long above the recent high after getting stopped out
# Re-entry long - Long above new SPH above LPH
# Re-entry long - again break of LPH
# Gap Situation - If not in trade and gap is above LPH or below LPL line; then enter on the break of high of first 5 min bar for long and break of low of first bar for short
# Market gaps down below LPL and creates a SPH - go long above SPH
# Vice versa for shorts
# One Special condition for shorts - Market gaps above LPH and creates a red 5 min bar - Go short below that bar low - no need to wait for SPL to form
!! Exit Rules
# Stoploss = Last SPL or 0.3% of [[NIFTY]] value
# Trailing SL = successive higher SPLs
# Trailing SL = LPLs
# Aggressively start trailing after market gives us 0.5% of Nifty value as profits - as in intra, time is against us
# Aggressive trailing - previous bar low or the bar that hits 0.5% of Nifty Value
[[MarketsWithMadan]]
* Create account
* Curate a wishlist of products you want to buy
* Get the same product pricing across different e-commerce website
* ''get the best deal'' - get notified for price drops, availability, lowest price
* order from the app
* track price movements
* ''Feature'': For recurring items automatically place order in the cart - request user approval of buying the item
* ''Feature'': Total money saved by ordering through our app
,,[[Idea Book]] | [[05 August 2022]],,
* Things that never happened before happen all the time. History is mostly the study of surprising events. But the irony is that it is used as an unassailable guide to future
** Historical events helps calibrate expectations
** Study where people tend to go wrong
** But it is not a map of future. [[Historians as prophets]] fallacy - Overreliance on past data where innovation and change are the lifeblood of progress
* Image how hard physics must be if electrons had feelings - [[Richard Fynman]]
* Experience leads to overconfidence more than forecasting ability
* Anchoring to previous outcomes, two dangerous things happen
** You are likely to miss the outlier events that move the needle the most. 15B people were born in the last 50 years decade, but only 7 people influenced the course of history. Hitler, Bill Gates, Steve Jobs,... Only a handful of events impact history
*** ''Surprise is not a failure of analysis, it is a failure of imagination''. The correct lesson to learn from surprises is that the world is surprising. because they are unprecedented
** History does not account for strucutural changes that are relevant to today's world
*** The way current startups are funded did not exist 25 years ago - [[Venture Capital]]
*** Recessions are fewer because they don't rely on boom and bust of industry cycles but pessimistic view is also that they are lower in number but each one is more powerful
* [[Benjamin Graham]] suggested that people should find value stocks where the value of company is below cash - This rule doesn't apply today. In fact Graham was constantly testing and seeking out what works and discarded those facts in the previous editions.
** 1934- 1969 - Formulas discarded 5 times
* Recent history is the best guide to the future because it is likely to contain the conditions relevant to the future
* The further back in history you look, the more general your takeaways should be
[[Book: Psychology of Money - Morgan Housel]] | [[08 January 2022]]
* ''I attribute as much of my success to what I’ve learned about the brain as I do to my understanding of economics and investing''
* The problem was that conceptual people who visualized what should be done in vague ways expected more literal people to figure out for themselves how to do it
* I constantly had to remind myself that there was no basis for my anger because his distorted logic was a product of his [[Physiology]]
** While I used to get angry and frustrated at people because of the choices they made, I came to realize that they weren’t intentionally acting in a way that seemed counterproductive;
** Having expectations for people (including yourself) without knowing what they are like is a sure way to get in trouble
* recording these qualities in people’s [[Baseball Cards]], others who’d never worked with them before could know what to expect from them.
* [[Basal Ganglia]] (which controls habit)
* [[Neuroscientist]]s, [[Psychologist]]s, and [[Evolutionist]]s agree the human brain comes pre-programmed with the need for and enjoyment of social cooperation
* when our ancestors were somewhere between chimpanzees and modern [[Homo Sapiens]], the brain evolved in ways supporting cooperation so man could hunt and do other activities
* [[Dalai Lama]], His view was that prayer and meditation seemed to have similar effects on the brain in producing feelings of spirituality (the rising above oneself to feel a greater connection to the whole) but that each religion adds its own different superstitions on top of that common feeling of spirituality
* It’s physiological. Love, for example, is a cocktail of chemicals (such as [[Oxytocin]]) secreted by the pituitary gland.
* while some subconscious parts of our brains are dangerously animalistic, others are smarter and quicker than our conscious minds
* ''It may seem counterintuitive, clearing your head can be the best way to make progress''. I now understand why creativity comes to me when I relax
* Know that the most constant struggle is between feeling and thinking
* The biggest difference between people who guide their own personal evolution and achieve their goals and those who don’t is that those who make progress reflect on what causes their amygdala hijackings.
* Habit driven by a golf-ball-sized lump of tissue called the [[Basal Ganglia]] at the base of the [[Cerebrum]].
** Habit is essentially inertia, the strong tendency to keep doing what you have been doing
** Research suggests that if you stick with a behavior for approximately eighteen months, you will build a strong tendency to stick to it nearly forever
* Charles Duhigg’s best-selling book [[The Power of Habit]]
** Duhigg’s core idea is the role of the three-step “habit loop.” The first step is a cue
** two is the routine
** there is a reward
* I recommend that you write down your three most harmful habits. Do that right now. Now pick one of those habits and be committed to breaking
* [[Left-brained]] or “linear” thinkers who are analytically strong are often called bright
* [[Right-brained]] or “lateral” thinkers with more street smarts are often called smart.
* [[Brain plasticity]] is what allows your brain to change its “softwiring
!!! Personalities
* Because of the biases with which we are wired, our self-assessments (and our assessments of others) tend to be highly inaccurate. [[Psychometric]] assessments are much more reliable. The four main assessments we use are the [[Myers-Briggs Type Indicator (MBTI)]], the [[Workplace Personality Inventory]], the [[Team Dimensions Profile]], and [[Stratified Systems Theory]]
* ''Introverts will usually find such conversations painful, preferring to think privately and share only after they’ve worked things out on their own''
* ''Sensing person'' who focuses on details
* ''intuitive thinker’s'' attention is focused on the context first and the details second
* Focusing on tasks vs. focusing on goals - similar to the differences between people who are intuitive vs. sensing. Those who tend to focus on goals and “visualize” best can see the big pictures over time and are also more likely to make meaningful changes and anticipate future events. They are the most suitable for creating new things (organizations, projects, etc.) and managing organizations that have lots of change. Task-oriented people tend to make incremental changes that reference what already exists. They are slower to depart from the status quo and more likely to be blindsided by sudden events
* the spacey, impractical Artist; the tidy Perfectionist; the Crusher who runs through brick walls to get things done; the Visionary who pulls amazing big ideas seemingly out of the air
* Shapers are people who can go from visualization to actualization. Shapers get both the big picture and the details right. To me, it seems that ''Shaper = Visionary + Practical Thinker + Determined.'' He also wasn’t surrounding himself with the right people. He tended to want to work with people who were like him.
* Lots of data show that relationships are the greatest reward—that they’re more important to your health and happiness than anything else
,,[[Ray Dalio: Principles]] | [[21 September 2021]],,
! Universal rules for Good DM
!! Biggest threat to good DM is harmful emotions. DM is a two step process - First Learning then Deciding
* Deciding is the process of choosing which knowledge should be drawn upon - both the facts of this particular "what is" and your broader understanding of the cause-effect machinery that underlies it - and then weighing them to determine a course of action
* Never seize on the first available option, no matter how good it seems, before you've asked questions and explored
!!! 1. Learning well
* learning is getting accurate picture of reality - synthesize accurately and navigate levels
''1.1 Synthesize the situation at hand''
* Ask questions to believable people
* Separate opinions from facts
* Step back and gain perspective
* Chose the great over new
* Don't overweight one information collected at one point in time
''1.2 Synthesize the situation through time''
collect information through time and analyze.
<img src='https://i.insider.com/545a52706bb3f75606becb20?width=443' width=300>
* For example, seeing the customer satisfaction growing over time. More important is to look at the slope of ascent, which should be at a level that makes you reach excellent level bar (like in A and not in B)
* Be imprecise - use approximations
* Remember the 80/20 rule
* Be an imperfectionist - perfectionist spend too much time on little differences at the margins at the expense of important things
''1.3 Navigate levels effectively''
* 1. High-level big picture: ''I want meaningful work that is full of learning''
** 1.1 Subordinate Concept: ''I want to become a expert in ML and Data science''
*** Sub point: ''I need to do ML based projects''
**** Sub sub point: ''I need to do my current project best to get more projects in future''
***** sub sub sub point: ''I need to compute metrics and find solution to generalization problem''
[[Ray Dalio: Principles]] | [[13 August 2021]]
* ''PLan on a plan not going according to plan''
* Room for error - acknowledging uncertainties, Unknowns, randomness & chance. The only way to deal with them is by increasing the gap between what you think will happen and what can happen while still leaving you capable of fighting another day
* [[Margin of Safety]] - Their purpose is to render forecast un-necessary. Instead of seeing things black and white, seeing them as grey areas where pursuing things where a range of outcomes are acceptable
* ''The biggest gains happen infrquently''
* Specific places to think about room for error
** ''Volatility'' - Can you survive by your assets declining by 30%. On a spreadsheet, yes, but it is not good at modelling feelings. Mentally, the confidence is shot when opportunity is at its highest. It can be physically exhausting after seeing losses
** ''Saving for retirement'' - What if target retirement date ends up in a brutal bear market? What if you want to cash out to pay for a medical mishap.
* Room for error is more art than science
* '' One way to think about room for error is to aim low. Assume that the returns going to be earned are 1/3rd lower than historic average. So I would save more than I would''
* [[Russian Roulette Syndrome]] - Attachment to upside when the potential downside is unacceptable
** If the cost is ruin, no matter how good is the upside or how low the probability it is not worth the risk. Leverage has that ability to produce ruin
* HOw the author invests is take risks with one portion and be terrified of the other
* ''If many thing relies on one thing working - you are counting the days to catastrophe''
* ''The biggest single point of failure with money is sole reliance on paycheck to fund short term spending needs with no savings to create a gap between what you think expenses are and what they may be in future''
,,[[Book: Psychology of Money - Morgan Housel]] | [[09 January 2022]],,
1. Learned to code android application development in [[Python]] using [[Kivy Android App]]
* People are poor forecasters of their future selves. Imagining a gola is easy and fun, but imagnining in the context of realistic life stresses that grow with competeitive pursuits is something entirely different. This creates a big impact on planning or future financial goals
* Only 27% of college graduates have a job related to their major in US.
*The [[End of History Illusion]] - the tendency of the people to be keenly aware of how much they have changed in the past but still underestimate how much their personality, desires and goals will likely change in future
** Tattoos people pay huge sum to get them removed for which they paid huge sum to get them in the first place
<<<
''The first rule of compounding is to never interrupt it unnecessarily''
<<< [[Benjamin Graham]]
* but how do you do it when your goals change?
* we instead of having a 1 80 year old life span have 4 distinct 20 year old blocks
* We should avoid extreme ends of financial planning, other wise they become enduring regret which are painful. Balance at every point in life is a strategy to avoid future regret and encourage endurance
** Aiming for moderate annual savings, moderate free time, moderate commute, moderate time with family - increases the odds of sticking with the plan and avoiding future regret
* [[Daniel Kahneman]] could come up with entirely different texts after having discussed it with peers. He says - ''I have no sunk costs''
** Sunk Costs - Anchoring decisions to past efforts that can;t be refunded are a devil where people change overtime - make future selves prisoners to our past. It is equivalent to a stranger making life decisions for you
[[Book: Psychology of Money - Morgan Housel]] | [[09 January 2022]]
* Every job looks easy when you are not the one doing it. The problems faced in the arena are often invisible to the crowd
* ''Successful investing demands a price, but it's currency is not in dollars or cents. It is volatility, fear, doubt, uncertainty and regret, all of which are easy to look until you are dealing with it in Realtime''
* The irony is by trying to avoid the price investor ends up paying double
* Why are so many people willing to pay the price for houses, food, vacation, cars try so hard to avoid paying the price of good investment.
** The price of investing success is not obvious, but when it comes it feels like a fine than a fee and people try to avoid fines
,,[[Book: Psychology of Money - Morgan Housel]] | [[10 January 2022]],,
* Created my first tiddly note using [[Stroll]], a [[Roam Research]] like experience for note taking
* Bubbles form because people are greedy, but also
* Investors, often innocently, take cues from the other investors who are playing a different game than they are
* ''Bubbles form when the momentum of short term traders attracts enough money that the makeup of investor shifts from mostly long term to mostly short term''.
** Time horizon matters here because a price that is ridiculously high for long term investor is often reasonable since he would exit the market at the end of day or few days
* Rising prices persuade all investors in ways that the best marketers envy. They are a drug that can turn value conscious investors into dewy eyed optimists detached from their own reality by the actions of someone playing a different game than they are
* So, Go out of your way to identify the game you are playing
,,[[Book: Psychology of Money - Morgan Housel]] | [[10 January 2022]],,
* Discovered [[Relanote]] note taking app
* Pessimism isn't just more common that optimism it also sounds smarter
* ''Optimism'' - Real optimists don't believe that everything would be great. That's complacency. It is a belief that the odds of a good outcome are in your favor overtime even when there will be setbacks along the way. It's not guaranteed. But it is the most reasonable bet for most people most of time
* If you say I have a stock that is going to go 10x in 1 year, you would shrug, but if you say the stock is going to get bust, you would pay full attention
* [[Factfullness]]
* [[Daniel Kahneman]] says asymmetric [[Loss Aversion]] is an evolutionary shield - Organism that threat more urgent than opportunities have a better chance to survive and reproduce
* There is always an effort to explain why stocks went down, instead of why it went up
* Only a few families own stocks but market going down is viewed by everyone as a sign of doom. only 2.9% of American Families owned stock during 1929 crash, yet everyone watched in amazement as if the ground has been pulled of their feet.
* Iron law in [[Economics]] - Extremely good and extremely bad circumstances rarely stay that way for long because supply and demand adapt in hard to predict ways
* ''Assuming that something ugly will stay ugly is an easy forecast to make, and its persuasive and it doesn't require the world changing but problems correct and people adapt. Threats incentivize solutions in equal magnitude''
* Progress happens too slowly to notice and setbacks happen too quickly to ignore
* Growth takes place with compounding which takes time but destruction happen due to single points of failure and loss of confidence which can happen in an instant
* Pessimism reduces expectations, maybe that's why it is so seductive. Expecting things to be bad is the best way to be pleasantly surprised when they are not
,,[[Book: Psychology of Money - Morgan Housel]] | [[12 January 2022]],,
* If there was an alien unleashed to see the differences between 2007 vs 2009, It would not notice any tangible differences yet unemployment rate was at all time high and people were in debt. What changed is the story we kept telling ourselves - ''Narrative Damage''
** In 2007 - housing market is rock solid
** In 2009 - stopped believing this stoy
* We tend to think of tangible things which thinking about business growth & economies, but stories are by far the most powerful force in the [[Economy]] - they are a fuel that can lead to the tangible parts of economy work or brake that holds our capabilities back
* At a personal level, 2 things to keep in my in a story driven work for managing money
*# The more you want something to be true, the more likely you are to believe a story that overestimates the odds of it being true - [[Appealing Fiction]]. If you are smart and desperate for a solution given limited control and high stakes - you'll believe just about anything
*#* the bigger the gap between what you want to be true and what you need to be true to have an acceptable outcome - the more you are protecting yourself from falling victim to an appealing financial fiction
*#* [[Room for Error]] should be higher for high stakes
*# Everyone has an incomplete view of the world, but we form a complete narrative to fill in the gaps. We explain the work through limited set of mental models just like a 1 year old kid
*#* [[Hindsight]] gives us the illusion that the world is understandable
*#* ''[[Risk]] is the leftover when you think you have thought of everything''
*#* [[Phillip Tetlock]] - We need to believe we live in a predictable world, so we turn to authoratative sounding people who promise to satisfy that need
*#* We believe the role of effort is high and ignore the role of luck
,,[[Book: Psychology of Money - Morgan Housel]] | [[15 January 2022]],,
Following recommendations of decision making for [[Money Management]]
# Go out of your way to find [[Humility]] when things are going right and [[Forgiveness]] and [[Compassion]] when things are going wrong. Respect [[Luck]] and [[Risk]]
# Less Ego; More [[Wealth]]. Saving money is the gap between [[Ego]] and your income. And wealth is what you don't see
#* ''Manage your money that helps you sleep at night - use this as a universal guidepost for all financial decisions''
#* The single most powerful thing to do increase your time horizon
# Become okay with a lot of things going wrong
#* Measure your performance on full portfolio rather than individual investments
#* Good investment returns are a function of tail events
# ''use money to gain control over your time'' - ''The ability to do what you want, when you want, where you want, with whom you want is the highest form of dividend that money pays''
# Be nicer and less flashy - no one is impressed by your possessions except you
#* if the goal is to gain respect and admiration, it is best gained with kindness and [[Humility]] than horsepower and chrome
# Save - for the sake of saving for no reason. At some point in your life, you would face an unexpected even which you haven't saved for
# Define the cost of success and be ready to pay it. Most things don't come with price tags attached. ''Uncertainity, Doubt & Regret'' are common costs in the financial world. You would have to pay them as fees rather than as fines to avoid to enjoy a good outcome
# Worship [[Room for Error]]. The Gap between what needs to happen and what will happen gives you endurance. Endurance makes compounding magic overtime. It makes your investments live to fight another day.
# Avoid extreme ends of financial decision. Everyone's goals and desires change overtime - the more extreme the past decisions, the more you'll regret them as you evolve
# Define the game you are playing. Your actions should not be driven by the people who are playing a different game than you are.
,,[[Book: Psychology of Money - Morgan Housel]] | [[16 January 2022]],,
* More than half of the [[Mutual Fund]]s do not invest a single cent in their own schemes. It is similar to doctors who chose a different life treatment that they recommend for patients - detailed in [[How Doctors Die |https://www.zocalopublicsquare.org/2011/11/30/how-doctors-die/ideas/nexus/]]
<<<
I did not intend to get rich, I just wanted to be independent
<<< [[Charlie Munger]]
* Financial decisions are not made on spreadsheets, rather they are made on dinner tables often not with the goal of maximizing returns by with the goal of not disappointing family members
* ''being able to wake up in the morning and change what you are doing on your own terms whenever you are ready , seems like a grandmother of all financial goals''
* Independence at any income level is driven by your savings rate. It is the top goal of the author
<<<
True success is exiting some rat race and modulate once activities for peace of mind
<<< [[Nassim Taleb]]
* Good decisions aren't always rational - at some point we have to chose between being ah[pay and being right
* Everyone without exception will face a huge expense that they did not expect. They don't plan especially because they did not expect them
* Every investor should pick a strategy that has the highest odds of successfully meeting their goals. [[dollar-cost averaging]] over long periods of time in low cost [[Index Funds]] works for most people
** There is low [[Correlation]] between investment efforts and investment results because they are driven by tails
* Best investment strategy - Patience, High Savings Rate and Optimism that over the long run the growth in the economy will accrue to my investments
,,[[Book: Psychology of Money - Morgan Housel]] | [[16 January 2022]],,
!!! HDFC
* ''Date'': Nov 3, 2020
* ''Stock'' : HDFC
* Long/Short : Long
* Execution Price: 2093.80
* ''How was secturity Found'': Looked at daily chart; Secturiy trading in range since apr. Range breakout. Tested. Entry after testing
* Misc: Majority of range breakout happened previous day at 1912 level. RSI is also high at the time of buying.
* Volumes: High during buying
* Money Control
** Sentiment Bullish
** Event - HDFC beat market estimates
[[Trading Journal]]
* If you fail to connect to audience you are giving the opportunity for someone else to connect with them
!! Times when you miss the message
* Winging it - Little or no time in preparation
* Making it all about you - opening it with the things that you have achieved and how brilliant you are
* Reading from a script or slides
* Going to presenter mode - asking inane questions every 5 mins or so
* Giving little though to what your audience is thinking and feeling about the topic
* Speaking through data only and not stories
* Failing to commit to the performance
!! How to build Rapport
* Grabbing attention at the start of the presentation - episode 65, 87,
* Be present in the moment - react/acknowledge
* Sharing the story - where they are and showing the future that correlates with what they desire (episode 5,7,9)
* Don't be Provocative and challenging - balance it with [[Empathy]] and [[Solidarity]]. ''Being in the problem with them, not a judge or superior to them''. Build bridges with the audience not barriers
* Always be 1 step ahead of them - reflecting what they are thinking. ''Show that you have thought about them'' - episode 72
* Showing yourself and your personality - being open and vulnerable with your message
* Smile at your audience - treat them like a friend in a conversation
* Share why you care and big picture
* Going all in - storytelling, performance and being there with them
!! Pre-requisites for making a connection
* [[Audience Intimacy]] - Not superficial understanding - but understanding their buttons
* Absolute clarity - ''intention, message and big idea''
* Find your stories - Stories emotionalize information - memorable, resonant, actionable
* Look to share them in a way that gets across - ''what's at stake, what's possible, why you care, and who you are''
!! Reference
https://thespeakingclub.com/
[[Communication Skill]] | [[Storytelling]] | [[Podcast: Speaking Club with Sarah Archer]]
# ''Spending on experiences'' shared with others than material possessions. Results in more positive feelings during, before and after consumption
# ''Pro Social Spending'' - gifting to others and charity than material possessions - enhances social connection, provides opportunity to make an impact, promotes well being and autonomy
# ''Buying time'' - removal of negative experiences - report greater life satisfaction
#* more opportunity to choose relationships
#* reduces daily stress
#* help navigate major life decisions
!!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/5p_sqQHdvcE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
''[[Well Being]] | [[Financial Literacy]]''
* Character - reputation of the borrower/firm
* Capital - leverage
* Capacity - volatility of the borrower’s earnings
* collateral - pledged asset
* cycle - macroeconomic conditions
If while evaluating an option the score comes out to be < 90 then reject that option else accept that option
!! Main Ideas
* Simple Model can explain itself. For complex model we need an ''explanation model'' - interpretable approximation of the original model.
* The are only one set of values that satisfy the following 3 properties and can only be Shapley values. These properties are heart of explanations. Any explanation not derived based on Shapley will violate one of the below properties
** ''Local accuracy'' - the ''explanation model'' outputs from ''simplified inputs'' should approximately match the outputs generated by ''original model'' on ''original inputs''
** ''Missingness ''- If the simplified inputs represent feature presence, then missingness requires features missing in the original input to have no impact
** ''Consistency'' - Consistency states that if a model changes so that some simplified input’s contribution increases or stays the same regardless of the other inputs, that input’s attribution should not decrease.
* SHAP explanations found to match human intuition than other methods, like, [[LIME]] & [[DeepLift]]
!! Definition
* Simplified Inputs $$(x')$$ - approximations of input features mapped to original input $$(x)$$.
:$$x' = h_x(x)$$
!! References
* https://arxiv.org/abs/1705.07874
,,Tags: [[14 August 2021]],,
* Interpretation similar to [[Partial Dependence Plot]]s - average effect of features on the outcome
* faster computation than [[Partial Dependence Plot]]s
* Works reasonably well when features have [[Correlation]]
!! Why activation functions are necessary
Without an activation function like [[Rectified Linear Unit (ReLU)]], the [[Dense Layer]] would consist of two linear operations.
`output = dot (W, input) + b`
So the layer could only learn linear transformations [[Affine Transformation]] of the input data: the [[Hypothesis Space]] of the layer would be set of all possible linear transformations of the input data into a N-dimensional space. Such a space is too restricted and would not benefit from multiple layers of representations.
,,[[Deep Learning with Python - François Chollet]],,
! [[Adam Grant]]
* Helping other can help you career and also undermine it, if you are not thoughtful about it
* Giver, taker and matchers
* Successful givers are ambitious about their personal success and others
* Risky when you are burnt by your takers. Can't get your work done. Yes to all kinds of requests
* ''Batching ''- one day 5 helping acts eg. more boost to energy. Feeling that making progress but also show up for other people
* Two major reasons why people help
** ''1. being a good actor'' - image benefits, doing them disservice,
** ''2. Being a good soldier'' - intrinsically motivated
** Impulse is to help for a desire to be liked - find a more helpful way to say no.
* Productive email habits
** ''people appreciate a fast no than delayed response or saying yes in the beginning and then dropping the ball''
** Bashers vs Swoopers - bashers write one sentence and perfect it. Swoopers write in one flow not worrying about the perfection. Treating writing and editing as two separate tasks. This applies to any idea of creativity.
* How to balanace the work and things that don't work
** Balance is wrong metaphor - Balance is never there. All the domains that you are focused on may not be balanced in a span of a day or a week. A better way is to think about ''Work life Rhythm'' - thinking about an year as a song, bunch of different verses, melody
** Several days a week - totally family focus
** Work days -
** balance is mythical. We should give up
* Success is increasingly dependent on how we interact with others
** It will be harder to get away with being a taker
** World organized around of projects - automated lot of technical work
**
* think like a scientist than a politician, preacher or a prosecutor, to test [[Hypothesis]] and update your beliefs based on evidence
* Use [[Imposter Syndrome]] to do more and achieve confident humility
* Chart is the representation of market and the not the market itself
* Beginners want trading patterns with entry signals. Professions, don't trade patterns but trade underlying buying and selling imbalances that sometimes creates those patterns.
* [[DeepAR Forecasting]]
* [[N-Beats]]
* [[fbprophet]]
* [[LSTM]]
* [[Temporal Fusion Transformer (Google)]]
An adversarial technique is capable of flipping the decision using [[Counterfactual]] examples to fool the machine learner.
!!! Pros
* adversarial examples could help to discover hidden vulnerabilities as well as to improve the model
People determine what they think by consulting their feelings
!!! Example
Professors have noticed that in a year when they get high marks for teaching, students also give the course material a high rating. In a year when students don't like the professor much, they give lower rating to the identically assigned readings
* Affine Transformation is [[Data Augmentation]] technique.
* ''Affine Transformation helps to modify the geometric structure of the image, preserving parallelism of lines but not the lengths and angles''.
* It preserves [[Collinearity]] and ratios of distances.
* This technique is also used to correct Geometric Distortions and Deformations that occur with non-ideal camera angles. Ex: Satellite Imagery.
* Relies on matrices to handle rotation, shear, translation and scaling.
```python
tf.keras.preprocessing.image.apply_affine_transform(
x, # 2D numpy array, single image
theta=0, # Rotation angle in degrees
tx=0, # Width shift
ty=0, # Height Shift
shear=0, # Shear angle in degrees
zx=1, # Zoom in x direction
zy=1, # Zoom in y direction
row_axis=0, # Index of axis for rows in the input image
col_axis=1, # Index of axis for columns in the input image
channel_axis=2, # Index of axis for channels in the input image
fill_mode='nearest', # Points outside boundaries of input `{'constant', 'nearest', 'reflect', 'wrap'}`
cval=0.0, # Value used for points outside the boundaries of the input if `mode='constant'
order=1 # int, order of interpolation
)
```
!!! Translation
* Moving every point a fixed distance in specified direction
* `tx` & `ty`
,,[[06 July 2020]],,
One stop for all the resources you would need for learning ML and Data science
Alcor life extension foundation for the past 50 years has been developing a technology they believe that will allow people living today to enjoy a second life-cycle later.
* 129 people currently [[Cryopreserved]]
* Person has to sign [[Life Insurance]] policy with the foundation
* [[Legally dead]] bodies are cooled below -124 Celcius to avoid ice formation. Takes about 3 hours to reach [[Vitrified]] or stable ice free state
* Uses 16 different chemicals to protect cells as the body cools
* Body is further cooled to -196 Degrees over the next two weeks
* At the end of procedure, clients are lowered into ultra-cooled liquid in giant stainless steel cylinders called ''dewars''
No one on the planet currently knows how to successfully unfreeze and reanimate these frozen residents. The hope is that one day the technology will exist to carefully thaw and revive the people in the community.
* ''Authors'': [[Alex Krizhevsky]] in collaboration with [[Ilya Sutskever]] and [[Geoffrey Hinton]]
* similar to [[LeNet-5]] but much bigger
* [[ReLU]] activation was used
* Had a complicated way of training on multiple [[GPU]]s
* Had used [[Local Response Normalization]] layer. which is not used now. This type of layer normalizes values across channels. Many researchers have found that this doesn't help.
* This paper convinced [[Computer Vision]] researchers to look at [[Deep Learning]] and that it really works
* This paper is an easier one to read
!! Architecture
<img src='https://neurohive.io/wp-content/uploads/2018/10/AlexNet-1.png' width=800>
!!! Alfred Binet was the inventor of IQ test.
Although ''IQ Test'' appears to be a one number summary of someone's intelligence, but this was originally designed to measure efficacy of Paris's public schools for all kinds of children, so that they can introduce new educational programs to get the students back on track.
Two hands can act totally different intentions: like the patient beings to zip up a jacket with one hand, and the other hand (alien hand) suddenly grabs the zipper and pulls it down. This normally fades in weeks after the surgery
!! Facts
* ''Founded in'' : 1979
* ''Founders'': Yogesh Kothari
* ''Sector'': Chemicals (Speciality Chemicals)
* ''Product''
** [[Alliphatic Amines]] - products derived from [[Ammonia]], Methylamines, Ethylamines, amine derivatives and specialty chemicals.
** Acetonitrile - largest indian player
* ''Applications'': Key ingredient in Pharma and Chemical Industries
* [[ROCE]] - 25, 29, 41 (Mar'20) and 56 (Mar'21)
* ''Sales Growth'': 25% (Mar'21)
* ''Promoter Share'': High, 74.09%, [[FII]] and [[DII]] shares low (~1% each)
* Part of [[Saurabh Mukherjea]]'s [[Little Champs]] portfolio
* ''Barriers to entry'' - Additives are ubiquitous and used in very small quantities (typically constitute <1% of the molecular weight of the end product) but lend critical functional characteristics to the end product. Hence, ''high quality alongside consistency, customisation, safety'' (since these are used in food products) and ''environmental considerations create strong barriers to entry''
* ''Competitive Advantage''
** R&D: in-house product development
** Shifting customer preferences towards green additives (like Oleo-Chemical based products)
* ''Key Risks''
** Regulatory or customer actions
** Price of Raw materials
* ''Revenue Streams''
:<img src='https://marcellus.in/wp-content/uploads/2020/11/unnamed-53.jpg' width=600>
* Exports accounted for 15-20% of the Company’s revenues
* strong global presence in food and polymer additives. These two segments together account for nearly 60-70% of the Company’s revenues
!! In the News
<<<
Stocks worth INR 101m were sold by Yogesh Kothari, Promoter and Director. Though still owns a very significant portion of the company
<<< [[Yogesh Kothari sold 0.08% of stock|https://simplywall.st/stocks/in/materials/nse-alkylamine/alkyl-amines-chemicals-shares/news/this-insider-has-just-sold-shares-in-alkyl-amines-chemicals]]
<<<
The main reason which seems to be driving Alkyl Amines stock is the anticipation of a ''boost for amine producers for vaccines with the increased drive for vaccination,'' amine makers are expected to do well, and this may be the precise reason for such a splendid rally in such times
China has not been able to keep up with the demand for amines for [[Pharma]] and agricultural industries. more in [[Speciality Chemicals Segment]]
<<< [[Gaurav Garg, Head of Research at CapitalVia Global Research|https://www.moneycontrol.com/news/business/markets/alkyl-amines-stock-is-up-135-in-2021-is-it-still-a-good-buy-6927111.html]]
!! Why invest in this Stock
''Key Success Factors''
* ''Competition'' - Not much competition. [[Balaji Amines]] and Alkyl Amines now account for ''>90% market share'' of aliphatic amines and amine-based derivatives in India. 3rd largest player has only single digit market share. Consolidation prevalent in markets outside of India as well.
* ''Strong R&D Focus''
** Top Brass include Mr. Kothari himself a chemical engineer, his son Suneet, Chemical Engineer from Cornell and top management from IITs and Institute of Chemical Technology (Mumbai)
** 50 member team with many senior members associated with Alkyl Amines for > 10 years
** 20 products every year and shortlisted based on competitive advantages, economies of scale, dependence on customers, fungibility - if the demand drops, can another product be manufactured in the same facility
** In house R&D also focused on process improvements
* ''Success with Acetonitrile''
** Used as solvent in DNA synthesis, production of rigid Foams, Rubber chemicals, extraction of fatty acids
** Aklyl amines found a synthetic route to manufacture rather than traditional route of ACN
** Due to decrease in automobile production - also decrease in ACN route of Acetonitrile production - Alkyl Amines' Acetonitrile in demand which raised the prices to almost 2x
*''Pricing Power''
** Raw materials to Aklyl Amines are Methanol, Ethanol and Ammonia. The prices have been highly volatile, but the gross margin has been stable, this means that Alkyl Amines have very good pricing power.
* ''Prudent Capital Allocation''
** Reinvestment Rate of 60%
** Remaining cash for closing debt and [[Dividends]]
''Factors for Amines Industry''
* ''Barriers to entry'':
** Capital intensive industry - hazardous raw material handling requires technical know how and initial investments
** Environmental Clearances - Hazardous raw material handling requires 1.5 to 2 years of time to set up a new plant
** Approval lead time from customers - Products used as raw materials in [[Pharma]] industries; takes time to derive comfort on the product as well as the manufacturing process
** Efficiencies from Scale
* ''New Capacities and Product Opportunities''
** Aliphatic amine is a niche industry accounting for less than 1% of the broader chemicals industry globally as well in India
** Both Balaji and Alkyl have been proactive in setting up production capacities
!! Key Risks
!! Financial Performance
<img src='https://marcellus.in/wp-content/uploads/2020/11/unnamed-54.jpg' width=600>
!! Information on [[Screener]]
''Business Leadership''
* 100+ products, most developed inhouse
* Global leader in Ethyl amines.
* One of the leading players globally in DEHA
* One of the largest producers of DMA-HCL
* Leading producer of Acetonitrile with a unique process
* 10 manufacturing plants at Kurkumbh, Pune
* 2 Manufacturing plants at Patalganga, Raigad
* 2 Manufacturing plant at Dahej, Gujarat
''Shift to value added products:''
:Apart from manufacturing basic aliphatic amines like Methylamines and Ethylamines, Alkyl has over the years also diversified into value added products like amine derivatives and speciality chemicals. These products find applications in end-user industries like Pharma (61%), Agro (6%), water treatment (5%), foundry (4%), dyes (3%) etc
''New plant in Dahej''
:New ''acetonitrile'' plant in Dahej will come up by Q3 FY 2021. This plant has capacity of 15000 tonnes and can generate 300 to 350 Crores turnover at peak utilization
''30-40% Capacity expansion''
:Company is expanding capacity for Aliphatic Amines by 30-40% at Kurkumbh and Patalganga sites. It is expected to be completed within 15 to 20 months, with capex of Rs 300 to 350 Crores
!! References
* [[Spotlighting Alkyl Amines|https://marcellus.in/newsletter/little-champs/spotlighting-alkyl-amines/]]
* [[Information from Screener|https://www.screener.in/company/ALKYLAMINE/]]
`all` is an iterable in [[Python]] that returns true if all the elements in a iterator are true - i.e. non empty or non zero
!! Usage
```python
all(condition(x) for x in list_of_xes) # returns either true or false
```
Aliphatic amines are products derived from [[Ammonia]] (NH3) by displacement of H2 in the Ammonia molecule by other radicals (R) such as Methyl, Ethylene and Propanol
An alpha overlay strategy aims to limit overexposure to risks or factors by targeting alpha across different asset classes and factor strategies. This can be used to reduce the correlation within a portfolio and improve diversification, thereby smoothing volatility risk and a fund’s overall risk-adjusted performance.
!! References
* [ext[Using Alpha to Control Volatility|https://www.quantilia.com/volatility-alpha-generation/]]
* EMR stands for ''Elastic Map Reduce'' is a service provided by Amazon
* EMR provides (Elastic Compute Cloud) EC2 instances with [[Big Data]] technologies like Hadoop and Spark already configured.
* negates the need for the user to manully install Spark and its dependencies for each machine and configure them for smooth operation
!!! Steps to setup and EMR Cluster
<iframe width="600" height="360" src="https://www.youtube.com/embed/ZVdAEMGDFdo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[Lesson 4 : Spark by Udacity]]
Speed up your typing to predict next word to autocomplete and auto-correct.
[[Idea Book]] | [[AI Businesses]]
* 2nd largest brand in head painbalm segment in India
* Strong market share in parts of India - gaining market share in other parts as well
* Amrutanjan - First company in India to bring roll on format - Emami was not able to succeed
* Comfy brand (Sanitary Napkins) - Market leader in WB and Orissa
* Good vendor in place
* 3% market share in Sanitary Napkins - huge opportunity
* Trying to beat J&J - targeting in Rural in areas with competitive segments
* EPS growth - Not good - menthol price very volatile
* Price leverage can be encashed with growth in brand
*
An Arbitrary number can affect the estimates of people who must make a quantitative judgement
Anchoring is an extremely robust effect and is often deliberately used in [[Negotiation]]s. Whether you are haggling in a bazaar or sitting down in a for a complex business transaction, you probably have an advantage of going in first, because the recipient of the anchor is involuntarily drawn to think of ways your offer could be reasonable
* This only works for [[Stock Market]] and not any other instrument
* Two things to ensure
*# Create an emergency fund if not already done so for 6M or 12M
*# Save for 3y or 5y Big Expense
* If you still have that money left, invest in stock market
** 60% money as SIP over 6 month period
** 40% hold as cash to be used when you feel that market is corrected significantly. This is to avoid regret when you don;t have cash when the market is at its lowest.
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/1VbNCaMS-Lw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[Ankur Warikoo]]|[[16 January 2022]]
* This only works for [[Stock Market]] and not any other instrument
* Two things to ensure
*# Create an emergency fund if not already done so for 6M or 12M
*# Save for 3y or 5y Big Expense
* If you still have that money left, invest in stock market
** 60% money as SIP over 6 month period
** 40% hold as cash to be used when you feel that market is corrected significantly. This is to avoid regret when you don;t have cash when the market is at its lowest.
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/1VbNCaMS-Lw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[Ankur Warikoo]]|[[16 January 2022]]
* The biggest inhibitor for great ideas is the fear of repudiation of BAU tasks. Individuals are vulnerable to motivation to conform.
* ''Anonymous Brainstorming'' + silent voting
** Individuals are allowed to submit ideas
** The list is read by facilitator in front of executives
** The executives can silently vote on the idea
** Once the submissions are vetted and reprioritized, the silent voting can continue until a clear choice is made
!! References
* [[Bias busters: A better way to brainstorm|https://www.mckinsey.com/business-functions/strategy-and-corporate-finance/our-insights/bias-busters-a-better-way-to-brainstorm]] from [[McKinsey Insights]]
,,[[13 February 2022]],,
Anscombe's quartet comprises four data sets that have nearly identical simple descriptive statistics, yet have very different distributions and appear very different when graphed
<img src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Anscombe%27s_quartet_3.svg/1200px-Anscombe%27s_quartet_3.svg.png' width = '500'>
<img src = 'https://miro.medium.com/max/1166/1*JyDU5qgFA-S2XOFBah9YcQ.png', width = '500'>
<img src='https://miro.medium.com/max/800/1*GEqJnb8ZK_UFVsNX9ZCQDw.jpeg' width=500>
First described by the Roman [[Philosopher]] Seneca, who wrote of a blind woman who described herself as not blind but complained that she was in a dark room.
Anton's [[Syndrome]] is deficit of [[self-awareness]] in which a person is oblivious to a [[physical disability]] but otherwise doing fairly well [[Congnitive]]ly. It is known to be caused by damage to the [[Occipital Lobe]]
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
fast and general engine for large-scale data processing
* Some football fans who are convinced that they know more than the coaches on the sidelines
* It is the opposite of [[Imposter Syndrome]]
<img src='https://i.pinimg.com/originals/a6/26/48/a626482c8e4e828bd3232578952dd6aa.jpg' width=300>
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
Asperger's is a form of [[Autism]]
* Getting 1% better everyday compounds to 37 times better after one year. This is true reverse also if you get 1% worse every day you would left with no performance after 1 year
* 1% does not seem significant and slow transition which can lead to good habits slide. There is a [[Plateau of Latent Potential]] when things seem to be moving
<img src='https://images.squarespace-cdn.com/content/v1/5898cac7be6594a51d24a616/1571176415956-JHV0X8A3V83NVXCCK3TN/Plateau%252Bof%252BLatent%252BPotential.jpg' width=300>
* Your outcomes are lagging measure of your habits
!! Forget About goals and focus on systems instead
* ''Difference between goals and systems'': Goals are the results that you want to achieve and systems are about the processes that lead to those results.
* Goals are good for setting direction but systems are best for making progress
* Problems with focusing on goals and not on systems
*# Goal setting suffers from [[Survivorship Bias]]. We concentrate on people who end up winning
*# Achieving a goal changes life for only a moment. You need to solve inputs to the system and outcomes will fix itself
*# Goal setting restricts happiness before achieving of goal. They also lead to binary outcomes - achieved or not - succeeded or failed. Systems first mentality focusses on processes rather than product and you are happy and satisfied every time your system is running
*# Goal-oriented mind sets create [[Yo-Yo Effect]] where people find themselves reverting to old habit after accomplishing a goal. The purpose of goals is to win the game, but that of systems is to continue playing the game
!! System of Atomic Habits
''Atomic Habits'' are a regular practice or routine that is not only small and easy to do but also the source of incredible power, a component of the system of compound growth
,,[[Atomic Habits]] | [[15 April 2022]] ,,
*Changing habits is challenging for two reasons
*# We Try to change the wrong thing
*# We try to change our habits in the wrong way
* [[Three Layers of Behavior Change]] - Outcomes (what you get), Processes (what you do) and Identity (what you believe) - Outermost to inner most. People start with what they want that leads to outcome based habits, the alternative is to build identity-based habits.
* The difference between a person who says //I am trying to quit smoking// vs //No thanks, I am not a smoker// is that the former believes he is a smoker and latter does not
* The ultimate form of [[Intrinsic Motivation]] is when habit becomes part of the identity - instead of ''wanting ''to be this person, you say "''I am this''". The more pride that you have in your identity the more fiercely you will fight to keep habits intact
** THe goal is not to read a book, but to become a reader
** The goal is not to run a marathon but to become a runner
* This also leads to the other aspect where what you already believe is hard to change as it has become a part of your identity. Habits conflicting with identify thus will be hard to adopt
!! Two step process to changing your identity
# Decide the person you want to be
# Prove it with small wins
* Identity is not preset, but emerges out of your habits. ''Whatever identity you possess now is because you have proof of it''. You believe you are religious because you go to church every day. The more the evidence of habit the stronger the belief
* Every action you take is voting for the type of person you wish to be
** Each time you read a page you are a reader
** Each time you start a workout you are an athlete
* [[Identity-based Habits]] shapes our identity. But reverse is also true. Identity also shapes our habits
* Habits are not about ''having ''something, it is about ''becoming'' something. Though habits can help achieve what you want to have
,,[[Atomic Habits]] | [[15 April 2022]],,
* [[Experiment: Cat escape]] by [[Thorndike]] - Behaviors followed by satisfying consequences tend to be repeated and behaviors followed by unpleasant consequences are discarded
* Habit formation is useful as it frees up resources from our conscious brain by making the behavior automatic.
<<<
Habits do not restrict freedom. They create it.
<<<
!! The science of how habits work
Four step process
# Cue - noticing the reward (information that predicts reward)
# Craving - Wanting the reward (motivational force behind the habit). You don't crave smoking, but the feeling it provides
# Response - obtaining the reward
# Reward - end goal of every habit
This forms a [[Habit Loop]]. These four steps are split into two phase
# Problem Phase (Cue, Craving)
# Solution Phase (Response, Reward)
<table>
<thead><tr><th colspan=2>Problem Phase</th><th colspan=2>Solution Phase</th></tr></thead><tbody>
<tr><td>Cue</td><td>Craving</td><td>Response</td><td>Reward</td></tr>
<tr><td>Your phone buzzes with text</td><td>You want to learn the contents</td><td>You read the text</td><td>Satisfy the craving to read the message. Grabbing your phone becomes associated with phone buzzing</td></tr>
</tbody></table>
!! [[Four Laws of Behavior Change]]
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th colspan=2>How to Create a Good Habit</th></tr></thead><tbody>
<tr><td>The 1st law (Cue)</td><td>Make it obvious.</td></tr>
<tr><td>The 2nd law (Craving)</td><td>Make it attractive.</td></tr>
<tr><td>The 3rd law (Response)</td><td>Make it easy.</td></tr>
<tr><td>The 4th law (Reward)</td><td>Make it satisfying.</td></tr>
</tbody></table>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th colspan=2>How to Break a Bad Habit</th></tr></thead><tbody>
<tr><td>Inversion of the 1st law (Cue)</td><td>Make it invisible.</td></tr>
<tr><td>Inversion of the 2nd law (Craving)</td><td>Make it unattractive.</td></tr>
<tr><td>Inversion of the 3rd law (Response)</td><td>Make it difficult.</td></tr>
<tr><td>Inversion of the 4th law (Reward)</td><td>Make it unsatisfying.</td></tr>
</tbody></table>
,,[[Atomic Habits]] | [[15 April 2022]],,
* A woman working in [[Paramedic]]s learned the ability to look for face patterns on sight for people undergoing heart failure. She recognized a man who didn't look right in a party who was later found to have blocked [[Artery]]
* Some hairdressers can guess whether they are pregnant by just feeling the hair. We can't always explain what we are learning, but it is happening along the way. And ''noticing the relevant cues in a given situation is the foundation for every habit that we have''
* You don't need to be aware about the cue for a habit to begin - ''you notice an opportunity without dedicating conscious attention'', which makes them useful. It is the same thing that makes them dangerous
* Simple cues can be - cookies in kitchen, remote control next to couch, phone in pocket
<<<
Until you make the unconscious conscious, it will direct your life and you will call it fate
<<< [[Carl Jung]]
* [[Pointing and calling]] is a safety system designed to reduce mitakes. It is effective because it raises the awareness from non-conscious to [[conscious]] level
* [[Habit Scorecard]] - start with a list of habit that you already do, starting with waking up, brushing teeth, getting dressed. Then mark "+", "-" or "=" if it is a good habit, bad habit or a neutral habit. The good and bad are inaccurate labels, they are either effective in solving problems or not. Bad habits also serve something that is why you repeat them
* The first step in changing bad habits is to be aware about them. [[Pointing and calling]] and [[Habit Scorecard]]
,,[[Atomic Habits]] | [[16 April 2022]],,
The [[1st Law of Behaviour Change]] is to make it obvious. Follow [[Habit Stacking]] strategy to use [[Implementation Intention]] to create obvious cues for habits and design a clear plan as to when and where to take action
* [[Implementation Intention]] is a plan that you make before hand about when and where to act. Time and location and are the two most common cues. Implementation intention leverages this as seen in [[Experiment: Implementation Intention]]
* ''People creating a specific plan of when and where to execute are more likely to follow through''
* Many people think they lack [[Motivation]] by instead they lack clarity
* People are more likely to take action on 1st day of week/month/year - if unsure about when to start a habit
* No behavior happens in isolation. Each action becomes a cue that triggers the next behavior - this is principle behind [[Habit stacking]]. It applies to chain purchases as well which is termed as [[Diderot Effect]]
,,[[Atomic Habits]] | [[16 April 2022]],,
* Behaviour = f(Environment). People often choose products not because of what they are but where they are
* [[Suggestion Impulse Buying]] - customers buy products not because they want them but because how they are presented to them. 45% of [[Coca-Cola]] sales come from end-of-aisle racks
* Habits can be changed based on the cues from the environment.
* Human body as ~11 million sensory receptors, roughly 10 million are dedicated to sight using roughly more than 50% of brain’s resources. Visual cues are greatest catalyst for our behaviour.
!! Designing environment for success
* Making better decision is easy and natural when the cues of good habits are in front of you. If you want to practice guitar regularly, place it in the middle of your room
!! Context is the cue
<<<
Stop thinking about your environments as filled with objects and start thinking about them as filled with relationships
<<<
* habits can be easier to change in a new environment. To create a new routine go to a different coffee shop, bench in the park, corner of your room.
* Create separate space for work, study excercise, entertainment and cooking. ''One Space, One Use ''.
* When ever possible, avoid mixing the context of one habit -as the easier one will always win out. Studying in the same place where you play games can distract you.
* For smaller rooms, divide your room into activity zones. For digital spaces, use separate devices for texting/browsing, gaming and studying/productivity
[[Atomic Habits]] | [[08 April 2022]]
''The secret to self control is to make the cues of good habits obvious and for bad habits invisible''
* Addictions spontaneously dissolve if there is a radical change in the environment
** 90% of [[Heroin]] users become addicted once they return home from [[Rehab]]
** [[Discipline]] would not solve problems if the cues are there. Disciplined people are better at organizing lives that does not require heroic [[Will power]] and [[self-control]]. They spend less time in tempting situation. People with best self-control are the ones who need to use it the least
** Once the habit is encoded, the urge to act follows once the cues re-appear
** Bad habits are [[Autocatalytic]] the process feeds itself
* [[Cue-induced wanting]] an external trigger causes compulsive craving to repeat a bad habit. Once you notice something you begin to want it.
* You can break a habit but you are unlikely to forget it. Once the mental groves have been carved into the [[Brain]], it is impossible to remove it entirely even if they go unused for a while. Simply resisting temptation is ineffective strategy. The best way is to eliminate the cue for the bad habit
,,[[Atomic Habits]] | [[16 April 2022]],,
* The [[Brain]] of animal is loaded with pre-defined rules and it lights up extensively when it sees exaggerated versions of these rules. it is called [[Supernormal Stimulus]]
* The modern food industry follows [[2nd Law of Behavior Change]] - ''Make it attractive''
** The primary goal of [[Food Science]] is to create products that are more attractive to customers. They optimize how a product feels in your mouth known as [[Orosensation]]
** your brain loses interest when you begin to feel full, but the dynamic contrast of some foods keep the experience novel and encourage you to eat more
** You overeat because of [[Hyperpalatable]] foods that are more attractive to human brain
** The opportunities of the future will be more enticing than today. ''The trend for rewards is to be more concentrated and stimuli to be more enticing''. We have the brains of the ancestors with the temptations that they had never had to face
* All biological habits share [[Dopamine]] spike
** [[Experiment: Importance of Dopamine]]
** habits are [[Dopamine]] driven feedback loop
** Dopamine is released not only when experience pleasure but also when you anticipate it
:: <img src='https://miro.medium.com/max/1400/1*GgMYzqrwlOeyFrbJAad-QQ.png' width=500>
* The brain has far more circuitry allocated for wanting rewards than for liking them. 100% of the [[Nucleus Accumbens]] is activated during wanting while only 10% is activated during liking. Again craving and desire plays a huge role in our behviours
** So make habits more attractive by using strategy called [[Temptation Bundling]]
* [[Temptation Bundling]] is a strategy that can be exploited to create a habit that gets you what you need to by still doing your favourite thing. For example Eliminating obesity one Netflix binge at a time, and ABC’s TGIT (thank God it’s Thursday) to associate watching TV with relaxation on Thursday. It is build on a [[Psychology]] theory known as [[Premack’s Principle]]
* Habit Stacking and [[Temptation Bundling]] formula
*# After [CURRENT HABBIT], I will [HABIT I NEED]
*# after [HABIT I NEED], I will [HABIT I WANT]
**For example,1. After I pull out my phone, I will do 10 push ups. 2. After I do 10 pushups I will check insta
,,[[Atomic Habits]] | [[16 April 2022]],,
<<<
In the long history of humankind, those who learned to collaborate and improvise most effectively have prevailed
<<< [[Charles Darwin]]
* Behaviors are attractive when they help us fit in . We imitate the habits of three groups in particular
** The close, the Many and the powerful
!! Imitating the close
* [[Peer Pressure]] is bad if only you are surrounded by bad influences
* We imitate the behavior of whom we are close to without realizing it
* Join a group where the behavior you want to pursue
** Is a normal behavior in that group
** YOu already have something common with the group. For example, Nerd Fitness - helps nerds misfits get in shape. Nothing sustains motivation better than belonging to a tribe. Growth and change are no longer an individual pursuit
** Remain a part of group to maintain the habits
!! Imitating the many
* When changing habits means challenging the tribe, change is unattractive
* Running against the grain of culture requires extra effort
!! Imitating the powerful
* Historically, a person with greater power and status had access to more resources, worries less about survival and proves to be a more attractive mate. Once we fit in, we start looking for ways to stand out. This is the reasons we care about the habits of highly effective people
* You mimic the communication style of your boss
[[Atomic Habits]] | [[16 April 2022]]
* Every behaviour has a surface level craving and a deeper underlying motive. Our habits are modern day solutions to ancient desires. Pairs of motives and cravings like
** Find love and reproduce = use [[Tinder]]
** Connect and bond with others = browse [[Facebook]]
** Win social acceptance and approval = posting on [[Instagram]]
** Achieve status and prestige = playing video games
* The ''cause of habits'' is a prediction that precedes them. The gap between the current state and predicted state provides a reason to act. It is called desire. You want to satisfy deeper motives is the need to feel different.
* Emotions and feelings help us decide, whether to hold steady or make a change
* We can make habit more attractive simply by ''reframing the habits to highlight the benefits rather than their drawbacks''
** Reframe “Running in the morning” to “get healthy”
** Finance - “Instead of sacrifice today to save” reframe it to “increasing purchasing power tomorrow”
** Pregame Jitters - “Getting anxious before presentation” - reframe to getting excited
* ''Motivation Ritual'' - Associate habits with something that you enjoy.
** For example, if you always play the same song before having sex, you’ll begin to link music with the act. Whenever you want to get into the mood, just press play
** Athletes use similar strategies to warm up and get motivated even if they weren’t before
[[Atomic Habits]] | [[10 April 2022]]
* [[Experiment: Quantity vs Quality]] - quantity group produce much better results than quality as they hone their skills and improve. Quality group is so focused to find best approach that they never took action
* ''Motion vs Action'': We slip into motion rather than action to delay failure
** ''Motion'' is planning, strategising and learning. This allows us to feel we are making progress without running the risk of failure.
** ''Action'' is what produces the result
* Habit formation takes place due to [[Long-term Potentiation]] where a repeated action changes the structure of the brain. Each repetition improves cell to cell signalling and neural connections tighten. This phenomenon is called as [[Hebb’s Law]]
* ''How long does it take for form a habit?'' Repetition moves the behaviour from conscious to unconscious [[Brain]] through effortful practices in a process called [[Automaticity]], where action is performed without thinking. So the answer is not “how long” but “how many times”.
[[Atomic Habits]] | [[11 April 2022]]
* In [[Guns Germs & Steel]] by [[Jared Diamond]] he mentioned that continent has different shapes and that shape determined where the agriculture spread. IT was easier to spread from west to east than north to south, which decided who will be prosperous. This is 3rd law “Make it Easy” applied at global scale
* Habits follow the [[Law of least effort]] which describes that we tend to do what is easy and convenient. This is why it is crucial to make habits very easy to do
* Reduce the friction by environment design.
** [[Japan]]ese made televisions received 5x lower calls than [[American]] made TVs because of the lean production environment designed by Japanese to reduce friction and eliminate waste
** Tidying up reduces our [[Cognitive Load]]
* Prime the environment for future use:
** Tidying up after every action gives so much time back. It primes you for next action rather than wasting time to tidy up first and do action
[[Atomic Habits]] | [[11 April 2021]]
Habits take place in the few defining moments and guide our behaviour for the next few minutes and hours. Deciding to get a video controller instead of studying is a small decision but it controls the next few hours.
The objective of [[Two minute rule]] is to reduce the habit to a bare minimum where it only takes < 2mins to perform a habit. For example
* Going for a run - Tying running shoes (<2min)
* Reading a book - Read one page (<2 min)
Just mastering two minute version of the behaviour we can scale our habits towards the ultimate goal in phases
[[Atomic Habits]] | [[12 April 2022]]
* Make bad habits more difficult by creating a [[Commitment Device]]. A commitment device is a one time decision that locks in future behaviour -binding to good habits and restricting bad ones. Also goes by the name of [[The Ulysses Contract]]
* Some One time actions that lock in good habits
** Good General health - Buy a good chair and standing desk
** Productivity - Delete games and social media apps on phone
** Finance - auto bill pay
** Sleep - Buy a good mattress. Remove TV from bedroom
* Automating can reinforce good habit and remove bad ones
** Timer Adapter - Cuts of internet at designated time, so that its time to sleep
** Every monday author’s assistant resets passwords for all social media accounts and only sends back on Friday to be only used on weekends
[[Atomic Habits]] | [[12 April 2022]]
!! Four laws of Behaviour Change
# Make it obvious
# Make it attractive
# Make it easy
# ''Make it satisfying'' - increases the odds that the behaviour will be repeated next time
!! Two kinds of return environments
* [[Immediate Return Environment]] - actions instantly deliver clear and immediate outcomes
* [[Delayed Return Environment]] - Need to work for years before action actually pays off. likely began 10,000 years ago when farmers began planting crops. Now it involves, career planning, vacation planning, retirement planning
[[Hyperbolic Discounting]] or [[Time Inconsistency]] is how the brain evaluates rewards that are inconsistent over time. You value present more than the future
People who have [[Delayed Gratification]] have higher SAT scores, less substance abuse, better responses to stress and superior social skills
Good habits usually have immediately feels bad but delayed returns are good and vice-versa for bad habits, and thus our mind moves to bad habits due to [[Hyperbolic Discounting]]. The best way to work towards a good habit to add a little bit of pleasure after the habit is done. For example, if you pass on eating out for you put the same amount in savings for a purchase that you like e.g. leather jacket
[[Atomic Habits]] | [[13 April 2022]]
* [[Paper Clip Strategy]] - A salesman started with two jars and moved clips from one jar to another everytime he made a sales call.
* Making progress is satisfying and visual measures provide clear feedback and immediate satisfaction
!! How to keep habits on track
* [[Benjamin Franklin]] used to keep a booklet where he tracked 13 personal virtues
* The idea is to not break the chain and show up
* [[Habit Tracking]] is powerful because it leverages multiple laws of behaviour change
** Make it obvious, attractive and satisfying
** ''Habit tracking is obvious'': Habit tracking keeps you honest, because most of us have a distorted view of our behaviour and tracking is the evidence.
** ''Attractive'': Each small win feeds your desire. More powerful on bad days when it is easy to forget about all the progress that you have made
** ''Satisfying'': Keeps you focused on the process rather than the result. Just trying to keep the streak alive
* Tracking isn’t for everyone and it should be automated as possible. As it also requires habit of tracking after performing the habit
* Manual tracking should be limited to most important habits and record it after each habit
!! Recover Quickly when habits break down
* ''Rule: Never miss twice''. Missing one time can be an accident but missing twice is the start of a new habit.
<<<
The first rule of compounding is to never interrrupt it unnecessarily
<<< [[Charlie Munger]]
* Don’t put up a zero. Going to the gym for 5 minutes doesn’t improve performance but it reaffirms your identity
!! When not to track a habit
* Dark side: we become driven by the number rather than the purpose behind it.
* [[Goodhart’s Law]] - when measure becomes a target, it ceases to be a good measure. Change the metric
[[Atomic Habits]] | [[13 April 2022]]
Using a [[Habit Contract]] which is a verbal or written agreement in which you state your commitment to a particular habit and punishment that will incur if you don’t follow through. Then find one/two [[Accountability Partners]] to sign off the contract with you
TO make the bad habits unsatisfying, your best option is to make them painful in the moment. When the consequences are severe, people learn quickly
Roger Fischer a WWII pilot suggested [[Pentagon]] that having a nuclear missile launch button next to President is powerful and at the same time he will not see his carnage if he presses. He proposed a volunteer to be with him carrying a butcher’s knife that President have to kill the volunteer before he kills millions
[[Atomic Habits]] | [[13 April 2022]]
* The key to maximising success is picking right field of competition, as people are born with different abilities.
* [[Genes]] predispose but not pre-determine. The areas where you are genetically pre-disposed to success are where the habits are more likely to be satisfying
* [[Big Five Personality Traits]]
** [[Openness to Experience]]
** [[Conscientiousness]]
** [[Extroversion]]
** [[Agreeableness]]
** [[Neuroticism]]
* [[Experiment: Extrovert vs Introvert Babies]]
* Use [[Explore/Exploit Tradeoff]] to find activities that you like. At the beginning of each activity, do some exploration, and exploit strategies that lead to success while leaving some room for further exploration
<<<
Every one has at least a few areas in which they could be top 25% with some effort
<<< [[Scott Adams]] of [[Dilbert Comics]]
* A combination of multiple things where you are better than other makes a rare combination, reduces competition and increases chances of success
* [[Genes]] do not eliminate the need for hard work. They clarify where to hard work on
[[Atomic Habits]] | [[14 April 2022]]
* [[Goldilocks Rule]] of [[Desirable Difficulties]] when peak motivation is achieved when the task is not hard and neither to easy which can help achieve [[Flow]] state
* To achieve flow state the task must be roughly 4% beyond current ability
* The difference between successful people and others is that at some point it ''comes down to who can handle the boredom of training every day
''
* men desire novelty to such an extent that those who are doing well wish for a change as much as those who are doing badly. Most habit forming products are those which offer continuous form of novelty - Video games provide visual novelty, porn provides sexual novelty, junk food provides culinary novelty. This is known as [[Variable Reward]] in [[Psychology]]
* ''variable rewards'' are a powerful way to amplify craving. The sweet spot of desire occurs at a 50/50 split between success and failure.
* Amateurs get life in the way, professionals stick to the schedule
,,[[Atomic Habits]] | [[14 April 2022]],,
Habits deliver numerous benefits, but the downside is they can lock us into our previous patterns of thinking and acting even when the world is shifting around us. A lack of [[self-awareness]] is poision. reflection and review is the antidote
* Good habits come at a cost of becoming less sensitive to feedback. Mindless repetition can let mistakes slide
* Once a skill has been mastered, it loses performance overtime. Habits are necessary but not sufficient for mastery
* ''Habits + Deliberate Practice = Mastery''
<img src='https://miro.medium.com/max/1226/1*ThcBc1ZnwTZQlvI2cJBlNQ.png' width=350>
* Instead of slipping into trap of complacency, establish a system of reflection and review. Like [[Career Best Effort (CBE)]] for NBA
* Reflection and review enables the long-term improvement of all habits because it makes you aware of your mistakes and helps you consider possible paths of improvement. Without reflections we can make excuses, create rationalizations and lie to ourselves
* Answer the following questions to reflect
** What went well this year
** What didn;t go so well this year?
** What did I learn?
*[[Integrity Report]]
* reflection also brings sense of perspective. Don't worry too much about everyday choices but focus over bigger picture with periodic review
* With habits you can latch on to pride that encourages you to deny your weak spots and prevents you from growing. So, Avoid making any single aspect of identity an overwhelming portion of who you are
<<<
Keep your Identity small
<<< [[Paul Graham]]
,,[[Atomic Habits]] | [[14 April 2022]],,
* our [[AI]], will provide an instant high-level critique of your novel
* https://authors.ai/
[[AI Businesses]]
Autism is a neurodevelopmental disorder which affects 1% of the population. Both genetic and environmental causes underpin its development. Autistic people have less activity in the regions involved in searching for social cues about feelings and thoughts of others. This is paralleled by diminished social skills.
!! References
* [[https://www.analyticsvidhya.com/blog/2021/04/automate-time-series-forecasting-using-auto-ts/]]
auto-sklearn is an automated [[Machine Learning]] toolkit and a drop-in replacement for a [[scikit-learn]] estimator.
auto-sklearn frees a machine learning user from algorithm selection and [[Hyperparameter Tuning]]. It leverages recent advantages in [[Bayesian optimization]], [[Meta-learning]] and [[Ensemble Construction]]
automatically; in a way that is hidden from or not understood by the user, and in that sense, apparently “magical”
,,[[Vocabulary]],,
```python
import time
from selenium import webdriver
# Inputs
SOURCE = 'India'
ID = 'stock'
MIN_SCROLL_SLEEP = 1
CSV_NAME = ID+SOURCE
SCROLL_ITER = 500
# Opens Chrome Browser
def open_browser():
path_to_chromedriver = 'assets/chromedriver.exe'
brow = webdriver.Chrome(executable_path=path_to_chromedriver)
return brow
browser = open_browser()
URL = f'https://in.tradingview.com/chart/'
browser.get(URL)
time.sleep(5)
# search symbol
browser.find_element_by_id('header-toolbar-symbol-search').click()
# clear symbol text
browser.find_element_by_class_name('inputContainer-nVh4c_cg').find_element_by_tag_name('input').clear()
# click on sources
browser.find_element_by_class_name('flagWrap-iQpFFgN_').click()
# search for source - India - and click
source_search = browser.find_element_by_class_name('input-nVh4c_cg')
source_search.send_keys(SOURCE)
browser.find_element_by_class_name('wrap-jKCUPVoO').click()
# select only stocks to view
browser.find_element_by_id(ID).click()
time.sleep(1)
# Infinite scroll
tickercontainer = browser.find_element_by_class_name("scrollContainer-vWG52QBW")
print(tickercontainer)
for i in range(SCROLL_ITER):
browser.execute_script(f"arguments[0].scrollTo(0,1000000000)", tickercontainer)
time.sleep(MIN_SCROLL_SLEEP+(i/100))
list_html = browser.find_element_by_class_name("listContainer-vWG52QBW").get_attribute('innerHTML')
```
,,[[Scrape TradingView Symbol Info]] | [[15 September 2022]] | [[Web Scraping]],,
!!! Executing well and managing well are different things
* Why gap between knowledge and action - like not following up on new years resolution
!!! Provide purpose, connection, and growth
* What are the drivers that keep them in the work place - Leave stories
** ''Purpose and Impact'' - need to know if my work leads to making different to organizations larger goals
** ''Feel connected to my team, company'' and boss - ''Self Determination Theory'' - need to relatedness
** ''Growth and Development'' (millennials specially care about this)
* Your boss controls this influence of these three things - These 4 are traits to the outcomes that great leaders produce
** Motivate
** Evaluate - who to plug in? who is on the right team? what's going on
** Communicate - directly
** Serve - leadership is an act of service. Hold critical conversations
* What actions done over and over again lead to motivation? How can we focus our energy on the actions that happen everyday that will lead to somebody feeling motivated? - ''The act of listening with intention & attention''
!!! Uncover your listening blind spot
* Blind spot - habitual thought or behavior pattern -something brain has been doing thousands of times - and it is natural tendency when you show up in a conversation.
** Like trying to make a connection
** Like Listening to figure out the next step that I have to do?
** Listening to find out if i should be paying attention
** Listening to solve the problem
** Listening to see if this person needs help
* we are all listening for some reason and that is your blind spot - and most people are not aware.
''Change doesn't happen unless you are aware''
Every listening act is not solving something, it is the act of just being heard. The other people just want to know that they are being listened to.
!!! Thinking is faster than speaking and listening
* How do people know when they are heard?
** ''You notice'' when you've felt heard
** They will share and open up more
** ''We Think at 1 to 3000 words per minute (wpm) and we listen to 1-300 wpm and speak at 1-200 wpm. So the process of getting out thoughts are takes some time. People feel it as very good conversation when they finally get a chance to feel heard''
!!! Listen well by connecting to your purpose
you dial into much stronger connect who you are and why you are here. How to find that?
* What are some of the most proud moments in your life
* What are some of the most significant experiences
* What are some of things that piss you off the most
* what was the conversation that you felt you were best with somebody else
and these tie back to couple of common themes
* Speaking up for other people who can't speak for themselves
* Sharing love with others
* Bringing honesty to the world
Usually something subtle and simple
!!! The serving mindset helps you listen
* To practice is remove all distractions and have a couple of conversations a week. Prepare that you are going to show up in a state and know what the purpose / outcome of this connect is / will be? - start to get some signs of better conversation. It's not about you
!!! Improve listening through deliberate practice
* learn apply reflect
!!! Ask powerful questions
* Key to exploring
* Biases and Heuristics - blind spot is the [[Confirmation Bias]] - confirming what you already think that you know versus challenging your beliefs
* Trigger to asking powerful questions is to let go of the assumptions that you know the answers
* There is not a list - but instead of asking ''WHY'' questions which can make people defensive, instead ask ''WHAT'' or ''HOW'' - Why this matters - What about it matters to you, what makes this so important.
!!! Cultivate psychological safety and courage
* Do's and Don'ts for Communicating Directly
** Creating [[Psychological Safety]] - can speak up without the feeling that I would be made fun of or rediculed
** Best performing teams feel safe to speak up and challenge ideas. Have clarity of purpose.
Instead of communcating directly, you create a foundation for direct communication to occur by creating [[Psychological Safety]]
* Serving & Critical COnversations
** Direct Communcations
** Asking powerful questions
** By not giving someone feedback, you are holding them back, you are not serving them. So, in order to serve them you need to tell them they are not doing well
Two part of process
* ''Feedback is a gift''
* //Courage is not the absence of fear but rather the judgement that something else is more important//
When a speaker delivers an inspiring message, the audience scrutinizes the material less carefully and forgets more of the content - even while claiming to remember more of it
,,[[Adam Grant: Think Again]] | [[14 November 2021]],,
* Build a character level [[RNN]] model on Baby names
* Similar to programming assignment of [[COURSE5: Sequence Models]] W1A2
,,[[Idea Book]],,
!!! [ext[Python Trading Toolbox: a gentle introduction to backtesting|https://towardsdatascience.com/python-trading-toolbox-05-backtesting-84266edb1d59]] on [[Medium]]
* Python based backtesting from scratch
* Computing SMA, EMA using `df.rolling`
* Getting signals and converting into buy and sell signals
* Charting buy and sell signals on graph
* Compute strategy returns
* Compare with buy and hold
* Compute annualized returns
Bagging is an ensembling technique in which we build many independent models and combine their predictions through averaging (weighted average, majority vote etc)
* Typically bootstrapped data is used so that each independent model is slightly different from the other
* Reduces error by reducing [[Variance]] in [[Bias-Variance Trade-off]]
* Example - [[RandomForestClassifier]]
* is a deposit-taking [[Non-Banking Financial Company]] (NBFC-D) registered with the [[Reserve Bank of India (RBI)]]
* BFL has two 100% subsidiaries (i) Bajaj Housing Finance Ltd. (‘BHFL’ or ‘Bajaj Housing’), which is registered with National Housing Bank as a Housing Finance Company (HFC); and (ii) Bajaj Financial Securities Ltd. (‘BFinsec’), which is registered with the [[Securities and Exchange Board of India (SEBI)]] as a stock broker and depository participant
* BFL’s consolidated net NPA at 0.65% is among the lowest in the NBFC industry
!! Bar plot with Variable alpha
```python
seasons = ["Spring","Summer","Fall","Winter"]
heights = [50.96, 69.86, 41.13, 37.43]
alphas = [height/max(heights) for height in heights]
colors = [(.1,.7,.2,a) for a in alphas]
plt.bar(seasons,heights,.6,color=colors)
plt.title('Average Temperature',fontsize=16)
plt.ylabel('Farenheit.',fontsize=12)
plt.xticks(rotation=60,fontsize=12)
plt.show()
```
<img src='https://lh3.googleusercontent.com/7ysaERYblP7WQaCgNI-aFTnn6iuYntRcdcybFy7hGXJ-2U45jDOl3tDB3ZB92ZpnvBWxut_gEPfR-Oh7nz4Ghn1wSXwPsCqsw0LhlMZbCvcANm2t664AbDqMRAXhEXdHs2NF16Whdc839Cgzp7RrO3bcHIkY4qdqciIveRNdnIHJYetJj7UreWfCykaVNBPPe5fvaheXPYpWI6tdr9P1-o0NPlkVUyeChAbob75GnDpmC46vTk7jiLBvhYmcWxnya7uWu3tQjHEIJ-1KaNkHCjMXBveBNmqY2wMEVDNlxxh3e_1jP2DlGMRo8hVQ5HADdvxtvAruxhIwHuvTzu1PAnQintRJqM5lbVKpCcNDnDg7IFHnXNsXpH6O1gGG0PSedw5PFCKBdLV1nAG116mO88TnRFKS9OyZzPTCKPosO4zQnv_zAHHoA5tWN_t876Nl9raiEhmWAYTpsXsOQK6M05m3ImyU9JgPaFGrO7S14BGfvVJcE6xBX1R-mobB9aqH6hzh6jpyCQmzD51lGzEv7QO6FXWlhJ-xUfaHT7bM9ghSayLz4y2DgmoaiI5j9dSAr7znCPbxIICJBLDc-rwHbL_WF7KUTHGzkp0B6Z-0h8HZlpwJxonLHkkenFsvJgigDY9_n9P5SiYrHPhGdebLXPn3o6BmlZK7NrFQ1FtDVdL0WqbGotYG7wX4UCB8kU1VY1vG1reHzef3pRStZlfaTpgUyA=w389-h307-no?authuser=0' width=400>
!! Bar plot with table at the bottom
```python
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
heights = [50.95, 69.85, 41.13, 37.43]
plt.bar(seasons,heights,.6,align='center',color=colors)
plt.title('Average Temperature',fontsize=16)
plt.ylabel('Farenheit.',fontsize=12)
rows = ["Spring","Summer","Fall","Winter"]
columns = ["Max","Date","Min","Date"]
plt.table(cellText=min_max_temps('2014'),
rowLabels=rows,
colLabels=columns,
rowColours=colors,
cellColours=[[c]*4 for c in colors],
loc='bottom')
plt.xticks([])
[plt.text(i,h+2,s) for i,h,s in zip([.08,1,2.15,3.1],heights,seasons)]
plt.ylim(0,80)
plt.subplots_adjust(left=0.2, bottom=.1,top=.8)
plt.grid(True)
plt.show()
```
<img src='https://lh3.googleusercontent.com/WOQJP-_g99xZ_Z9cH7fz43nUYqMrANIysKAuRo2BaCfZWeFyHByxRGJfIeFm8L9-ZDk1T7j-GbZvD3AhCh4NuUIi_vAFxNirvMyTw2th4N3zY5cUbjb9svLyqNXfXfAEquR_qp62AtC9V41taL_gNmhQKvgMCCsFHs3EgPzMCvSFF1xyQPF_kZa_Hntmn7Wlgan2nslIbJC_BaXlvPXdDj3O-1kSZISMwZJUGoY4YKgVdyX0Ku0gfq0eWYOePSjNtDhIDjc-KzHN04qzQ-sjNEIwjMno3pPyZPFY6b_BlzE4CQyRRLkr4GGajCd-cBy8CMF9-0QFB1iQ0yBHosTp7S8yekJGDjGL_M4t8rVXYbKDBRlu1gkANmhJ6pEaIY2jRG5VR-96a49uVC36jQ7YVs0cUScvXKclyrHlW5wh2fr_kja-_EARekwxAdp_o8YKyZbilU-ikPzDgVrqSQwWFONKkB5CBfed7vwdqxEh7dtt8gRRq4zzqbW8NWnjTrAA9OGVorb3MnPk4tDORWM-7LW8Sj1sdZVpwgQQ7L3uY3kmGCZyDYde3jpmPx0KNi92CtKtM4jJMkiLBz4z71SRGGKTDnrZC1JMpSTHixouXLymLC67kXaI5TTV-zLtUbZW8-tr77FX5z973abkkkhgzm-STI-zoKYG5oYJEQTeuQTNrLmB4iW4z3Fucs-d_MZnVC8Rvc1w94kUswXMm7CEpGuESw=w371-h289-no?authuser=0' width=400>
[[Matplotlib]]
A weak learner is an [[Ensembling]] method is called a base learner
!! Reference
* [[Ensemble Learning from SpringerLink|https://link.springer.com/referenceworkentry/10.1007/978-0-387-73003-5_293#:~:text=Base%20learners%20are%20usually%20generated,kinds%20of%20machine%20learning%20algorithms.]]
* [[Strong Learners vs. Weak Learners in Ensemble Learning|https://machinelearningmastery.com/strong-learners-vs-weak-learners-for-ensemble-learning/]] on [[Machine Learning Mastery]]
* ''BATNA'' - The Best Alternative To a Negotiated Agreement
* used to enter negotiations
<img src='https://miro.medium.com/max/875/1*Vp4WjLi5-3lTCyXkRChCzg.jpeg' width=500>
!!!Applying [[Bayesian Online Change Point Detection (BOCPD)]] to predict meaningful regime changes in stock prices and putting in production to run daily and send insights on email to [[Fund Managers]] to take action
!! Reference
* https://paperswithcode.com/paper/bayesian-online-changepoint-detection
* [[Github]] Implementation [[available here|https://github.com/hildensia/bayesian_changepoint_detection]]
* <iframe width="560" height="315" src="https://www.youtube.com/embed/cas__TaFk9U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
''Computes the probability of a changepoint given run length at time t''. More formally, BOCPD calculates the posterior run length at time t, i.e. $$p(r_t|x_{1:t})$$, sequentially
!! Assumptions
* Time series can be segmented into chunks called ''runs''
* The data within each segment is [[IID-Independent and Identically Distributed]] but there is no restriction on which distribution they follow
<img src='http://gregorygundersen.com/image/bocd/conceptual_diagram.png' width=600>
!! Code
* [[Github Repo|https://github.com/hildensia/bayesian_changepoint_detection]]
,,[[Research Paper]] | [[06 November 2021]],,
!! Bayes Rule
<img src='https://miro.medium.com/max/875/1*Vp4WjLi5-3lTCyXkRChCzg.jpeg' width=400>
!! Algorithm
* Bayesian optimization is a probabilistic model based approach for finding the minimum of any function that returns a real-value metric
* also called [[Sequential Model-Based Optimization (SMBO)]], implements this idea by building a probability model of the objective function that maps input values to a probability of a loss: ''p (loss | input values)''
* The concept is to limit evals of the objective function by spending more time choosing the next values to try.
!!! Choosing best [[Hyperparameter]] for [[Machine Learning]] models
* Optimizing the hyperparameters of a machine learning model is just a minimization problem: ''it means searching for the hyperparameters with the lowest validation loss.''
* Bayesian optimization more efficient than manual, random, or [[Grid Search]] with ''Better overall performance on the test set'' and ''Less time required for optimization''
* Bayesian optimization methods differ in the algorithm used to build the surrogate function and choose the next hyperparameter values to try
** Gaussian Process - Spearmint
** Random Forest Regression - SMAC
** Tree Parzen Estimator (TPE) - [[Hyperopt]]
!!! References
* [ext[An Introductory Example of Bayesian Optimization in Python with Hyperopt|https://towardsdatascience.com/an-introductory-example-of-bayesian-optimization-in-python-with-hyperopt-aae40fff4ff0]] on [[Medium]]
* [ext[XGBoost and Random Forest® with Bayesian Optimisation|https://www.kdnuggets.com/2019/07/xgboost-random-forest-bayesian-optimisation.html]] on [[KD Nuggets]]
,,[[04 July 2020]],,
```python
import xgboost as xgb
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from bayes_opt import BayesianOptimization
# Define the objective function
def xgb_evaluate(max_depth, gamma, colsample_bytree):
# Set XGBoost parameters
params = {
'eval_metric': 'rmse',
'objective': 'reg:squarederror',
'max_depth': int(max_depth),
'subsample': 0.8,
'eta': 0.1,
'gamma': gamma,
'colsample_bytree': colsample_bytree
}
# Train the model and return RMSE
dtrain = xgb.DMatrix(X_train, y_train)
cv_result = xgb.cv(params, dtrain, num_boost_round=100, early_stopping_rounds=10, nfold=5, seed=0)
return -1.0 * cv_result['test-rmse-mean'].iloc[-1]
# Define the bounds for the hyperparameters
pbounds = {
'max_depth': (3, 10),
'gamma': (0, 1),
'colsample_bytree': (0.3, 1.0)
}
# Initialize BayesianOptimization object
optimizer = BayesianOptimization(f=xgb_evaluate, pbounds=pbounds, random_state=0)
# Set number of iterations and run optimization
num_iterations = 20
init_points = 5
optimizer.maximize(init_points=init_points, n_iter=num_iterations)
# Print the best hyperparameters
print(optimizer.max)
```
[[Bayesian optimization]] | [[XGBoost]] | [[Regression]]
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
!! Dilemma
Despite their best intentions, executives fall prey to cognitive and organizational biases that get in the way of good [[Decision Making]]. While brainstorming sessions some business leaders stay silent, discussion proceeds in pro-forma way
!! Research
When it comes to group interactions in the workplace, individuals are particularly vulnerable to
* ''motivations to conform'' because of the need to avoid rejection and conflict, accomplish group goals, or establish one’s identity.
* [[Risk Aversion]] - repudiation of BAU priorities
leading to mediocre ideas flourishing and true change was less likely to happen
!! Remedy
''Anonymous brainstorming with silent voting'' - can serve as a counterweight to individuals’ motivations to conform and help contributors feel like their expertise and ideas are being fairly considered
!! References
[[https://www.mckinsey.com/business-functions/strategy-and-corporate-finance/our-insights/bias-busters-a-better-way-to-brainstorm]] from [[McKinsey Insights]]
When model makes a prediction, the difference between the actual and predicted is a the error. There are three sources of error
* Noise - irreducible error
* [[Bias]] - caused by Underfitting
** Reduce bias by training a complex model
* [[Variance]] - caused by [[Overfitting]]
** Reduce variance by [[Regularization]]
** Try [[Bagging]]
<img src='https://s7280.pcdn.co/wp-content/uploads/2018/07/Bias-and-Variance-Model.png' width=300>
!! References
* [[Bias & Variance in Machine Learning: Concepts & Tutorials|https://www.bmc.com/blogs/bias-variance-machine-learning/]]
Basic human tendency to seek clarity and closure by simplifying a complex continuum into two categories
<<<
There are two kinds of people, those who divide the world into two kinds of people and those who don't
<<< [[Robert Benchley]], a humorist
<img src='https://i.imgur.com/ZFmqHPa.jpg?fb' width=400>
,,[[Adam Grant: Think Again]] | [[14 November 2021]],,
* launched in 2009 by an individual or group known by the pseudonym [[Satoshi Nakamoto]]
* peer to peer cash system that avoids the double spending problem through [[Blockchain]]
* worldwide payments
* low processing fees
!!! There are three main ways people get Bitcoins.
* You can buy Bitcoins using 'real' money.
* You can sell things and let people pay you with Bitcoins.
* Or they can be created using a computer.
!! Important News
<<<
As talk of the currency has gone global, the Bank of Singapore has suggested that the 12-year-old currency could replace gold as its store of value.
<<< [[BBC|https://www.bbc.co.uk/newsround/25622442]]
!! Whitepaper
<embed src='https://www.bitcoin.com/bitcoin.pdf' width='1200px' height='300px'>
!! References
* [[https://www.pwc.com/us/en/industries/financial-services/fintech/bitcoin-blockchain-cryptocurrency.html]]
* https://bitcoin.org/en/
* [[Bitcoin wiki maintained by bitcoin community|https://en.bitcoin.it/wiki/Main_Page]]
“Black Monday” – as it is referenced today – took place on October 19 (a Monday) in 1987. On this day, stock markets around the world crashed, though the event didn’t happen all at once. Black Monday saw the biggest one-day percentage drop in U.S. stock market history. The Dow Jones Industrial Average (DJIA) dropped by slightly more than 22%
* [[Black Monday|https://corporatefinanceinstitute.com/resources/knowledge/trading-investing/black-monday/]]
!!! Human minds tend to confuse decisions with their outcomes, which makes it hard to see mistakes clearly
* The tendency to confuse the quality of decision with the quality of its outcome - Poker players call it [[Resulting]]
* Decision making are like bets which either being right or wrong tends to have probabilities of being right or wrong - Similar to [[02 Luck & Risk]] in [[Book: Psychology of Money - Morgan Housel]]
!!! If we want to seek out truth, we have to work around our hardwired tendency to believe what we hear.
* Beliefs are hard to change. You can simply counter this by asking ''"wanna bet?"'' Betting helps us to look harder at the statement to confirm its validity. It triggers you to look more closely at the belief in question, and motivates you to be objectively accurate
!!! Learning from outcomes
* [[Outcome Fielding]] is looking at outcomes to see what we can learn from them
* Outcomes are a result of ''luck'', ''skill ''& ''unknown information''. Knowing how much is involved is tricky as we are prone to [[self-serving bias]] - taking credit for good outcomes and blaming others for bad ones
* For others we blame luck for other success and blame them for their bad decisions
* Improve ''outcome fielding '' by thinking in bets. If an outcome is a result of pure luck would you bet on it. This helps us to look at outcomes more objectively and with perspective. This will also make you compassionate while evaluating others decisions and yours
* Dissent and diversity are crucial to objective analysis. ''Dissent'' helps us look more closely at our beliefs. That’s why the [[CIA]] has “''red teams''," groups responsible for finding flaws in analysis and logic and arguing against the intelligence community’s conventional wisdom
!!! To work together productively, a group needs [[CUDOS]]
* C - Communism - a group shares all the relevant information and is transparent
* U - [[Universalism]] - sharing a common standard for evaluating all information
* D - Disinterestedness - omitting the outcome to focus on the process to avoid bias resulting from knowing the outcome
* OS - organized skepticism - examination of what we know and don't know - [[Devil's Advocate]]
!!! To make better decisions, we need to spend some time in the future
* [[Temporal discounting]] – making decisions that favor our immediate desires at the expense of our future self – is something we all do
* Suzy Welch’s “10-10-10.” A 10-10-10 brings the future into the present by making us ask ourselves, at a moment of decision, how we’ll feel about it in ten minutes, ten months and ten years. We imagine being accountable for our decision in the future and motivate ourselves to avoid any potential regret we might feel
* the present moment and immediate future are always more vivid to us, planning from present can overemphasize momentary concerns which can be avoided with [[Backcasting]] by imagining a future in which our goals have been achieved, and then asking, “How did we get there?" - This leads to imagining the decisions that have led us to success and also recognizing when our desired outcome requires some unlikely things to happen. If that’s the case, we can either adjust our goals or figure out how to make those things more likely.
* Premortems are when we imagine that we’ve failed and ask, “What went wrong?" This helps us identify the possibilities that backcasting might have missed
* people who imagine the obstacles to their goals, rather than achieving those goals, are more likely to succeed
,,[[Blinkist]] | [[12 January 2022]],,
Block Deal is a single transaction of a minimum quantity of ''five lakh shares'' or a ''minimum value of Rs 5 crore'' between two parties which are mostly big institutional players.
A ''blockchain ''is a ''decentralized ledger'' of all transactions across a peer-to-peer network. Using this technology, participants can confirm transactions without a need for a central clearing authority
!! References
* [[Making sense of bitcoin, cryptocurrency and blockchain by PWC|https://www.pwc.com/us/en/industries/financial-services/fintech/bitcoin-blockchain-cryptocurrency.html]]
!! Creative Problem Sovling
* [[Kaggle]]
* [[Innocentive]]
* [[IDEO]]
!! [[Machine Learning]]
* [[Blogs on Machine Learning]]
!! Information Visualization
* [[VisualizingData]]
* [[FiveThirtyEight]]
* [[TheFunctionalArt]]
!! Business and Economics
* [[ETPrime]]
* [[Ken]]
* [[Finshots]]
* [[Economist]]
!! Technology
* [[Techcrunch]]
* [[Scientific American]]
* [[Mashable]]
* [[Futurism]]
* [[Gizmodo]]
* [[Vice]]
!! Finance
* [[Investopedia]]
!! Marketing
* [[Mad Over Marketing]]
* [[marketingexperiments.com]]
!! Design
* [[PyCaret]]
* [[Difference-In-Difference (DID) Regression]]
* [[paperswithcode.com|https://paperswithcode.com/]]
* [[OPENAI|https://openai.com/blog/]]
* [[Distill|https://distill.pub/]]
* [[Machine Learning Mastery]]
* [[Machine Learning is Fun|https://www.machinelearningisfun.com/]]
* [[Apple Machine Learning Journal|https://machinelearning.apple.com/]]
* [[Berkley AI Research (BAIR)|https://bair.berkeley.edu/blog/]]
* [[Andrej Karpathy|https://karpathy.medium.com/]] on [[Medium]]
* [[GoogleAI Blog|https://ai.googleblog.com/]]
* [[The Unofficial Google Data Science Blog|https://www.unofficialgoogledatascience.com/]]
* [[Fast.ai|https://www.fast.ai/]]
,,Tags: [[AI/ML/DL Resources]],,
Telling stories with [[Illustration]]s
!! Reference
* https://blush.design/
* developed by Jon Bollinger in 1980’s
* Used to ''determine oversold and overbought levels''
* 3 components
** Middle line - 20 SMA - closing
** +2SD of middle line → upperband
** -2SD of middle line → lower band
* Current MP should hover around average (20 SMA)
* Close to upper band → stock expensive → short → sell at +2SD target of 20 SMA
* Close to lower band → stock cheap → buy @ -2SD; target 20 SMA
* Envelope expansion - when price continues to drift higher that leads to upper band expansion
> BB works well in sideways market and fails in trending market
While using BB expect the trade to start working in your favour, if it does not then possible ''envelope expansion''
Bonus issue is allotment of bonus shares against currently held shares. This is usually in the form of 1:1, 2:1 or 3:1.
* 3:1 is read as 3 bonus shares for every share
* The total investment amount remains the same
* The [[Face Value]] remains the same
* `New Share Price = previous share price / 4` for 3:1 bonus issue
* Date of bonuses also correspond to the dates for [[Dividends]] issue.
<section name="a860" class="section section--body section--last"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><p name="90d5" class="graf graf--p graf--leading">Morrie Schwartz was Mitch Albom’s sociology professor from his graduation school. Mitch had earlier written a thesis under his guidance. Morrie had contracted amyotrophic lateral sclerosis (ALS), Lou Gehrig’s disease, a brutal, unforgiving illness of the neurological system.</p><blockquote name="1aca" class="graf graf--blockquote graf-after--p">ALS is like a lit candle: it melts your nerves and leaves your body a pile of wax. Often, it begins with the legs and works its way up. You lose control of your thigh muscles, so that you cannot support yourself standing. You lose control of your trunk muscles, so that you cannot sit up straight. By the end, if you are still alive, you are breathing through a tube in a hole in your throat, while your soul, perfectly awake, is imprisoned inside a limp husk, perhaps able to blink, or cluck a tongue, like something from a science fiction movie, the man frozen inside his own flesh. This takes no more than five years from the day you contract the disease.</blockquote><p name="7ec0" class="graf graf--p graf-after--blockquote">Morrie once attended a funeral of a relative. He contorted that all these good things that people had said, the dead soul would never be able to listen to them. So he decided to have a <em class="markup--em markup--p-em">living funeral</em>. A funeral in which he invited his family and friends, and had performances.</p><p name="1aea" class="graf graf--p graf-after--p">Mitch, now a celebrated sport’s columnist, busy with his life. This was what busy life and and it is relatable to most,</p><blockquote name="e556" class="graf graf--blockquote graf-after--p">I buried myself in accomplishments, because with accomplishments, I believed I could control things, I could squeeze in every last piece of happiness before I got sick and died, like my uncle before me, which I figured was my natural fate.</blockquote><h3 name="946f" class="graf graf--h3 graf-after--blockquote">The Orientation</h3><p name="72d8" class="graf graf--p graf-after--h3">Once Mitch was driving around near Morrie’s neighborhood, where he encountered Morrie on a wheelchair. Mitch learned that Morrie had ALS. Morrie was delighted to see Mitch and requested Mitch to visit him soon.</p><p name="704b" class="graf graf--p graf-after--p">What was once a visit, later became a life project, another thesis that Mitch would do under his guidance and learn from him when he met every Tuesday as ritual till Morrie’s last breath.</p><p name="af21" class="graf graf--p graf-after--p">This was during the time when O.J. Simpson was accused of Murder. Mitch’s job in <em class="markup--em markup--p-em">Detroit Free Press</em> was in turmoil because of union protests at that time, when Mitch decided to learn from his professor a list of themes that the current young generation is grappling with and which he would cover with his Professor’s visits.</p><h3 name="bc4f" class="graf graf--h3 graf-after--p">The Classroom</h3><p name="b609" class="graf graf--p graf-after--h3">The series of visits took place in Morrie’s dining room, where they would use to chat for hours. In his first class, Morrie asked Mitch some question from which Mitch and the younger generation was already been grappling with,</p><ul class="postList"><li name="22a3" class="graf graf--li graf--startsWithDoubleQuote graf-after--p"><em class="markup--em markup--li-em">“Have you found someone to share your heart with?” “</em></li><li name="c035" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“Are you giving to your community?”</li><li name="635c" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“Are you at peace with yourself?”</li><li name="fc81" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“Are you trying to be as human as you can be?”</li></ul><p name="14d2" class="graf graf--p graf-after--li">Morrie observed Mitch was sort of unhappy and said,</p><blockquote name="759e" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“Well, for one thing, the culture we have does not make people feel good about themselves. We’re teaching the wrong things. And you have to be strong enough to say if the culture doesn’t work, don’t buy it. Create your own.</blockquote><h4 name="fc76" class="graf graf--h4 graf-after--blockquote">The tension of opposites?</h4><blockquote name="dce9" class="graf graf--blockquote graf-after--h4">Life is a series of pulls back and forth. You want to do one thing, but you are bound to do something else. Something hurts you, yet you know it shouldn’t. You take certain things for granted, even when you know you should never take anything for granted.</blockquote><p name="f018" class="graf graf--p graf-after--blockquote">Morrie was true to his word. He created his own culture.</p><blockquote name="a340" class="graf graf--blockquote graf-after--p">He started greenhouse poor people could receive mental health services. He read books to find new ideas for his classes, visited with colleagues, kept up with old students, wrote letters to distant friends. He took more time eating and looking at nature and wasted no time in front of TV sitcoms or “Movies of the Week.”</blockquote><p name="aec1" class="graf graf--p graf-after--blockquote">Mitch recalled Morrie once told him,</p><blockquote name="f903" class="graf graf--blockquote graf-after--p">So many people walk around with a meaningless life. <strong class="markup--strong markup--blockquote-strong">They seem half-asleep, even when they’re busy doing things they think are important. This is because they’re chasing the wrong things.</strong> The way you get meaning into your life is to devote yourself to loving others, devote yourself to your community around you, and devote yourself to creating something that gives you purpose and meaning.”</blockquote><h3 name="7745" class="graf graf--h3 graf-after--blockquote">First Tuesday – We talk about the world</h3><p name="f9b2" class="graf graf--p graf-after--h3">Mitch asked Morrie whether he has been keeping up with the news. Morrie answered affirmatively. He feels, he is more closer to the people who suffer because he is the one suffering now. He started weeping because he saw people suffered and that’s why Mitch realized</p><blockquote name="7cc2" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“Maybe death is the great equalizer, the one big thing that can finally make strangers shed a tear for one another.</blockquote><p name="da40" class="graf graf--p graf-after--blockquote">Morrie shares that he is learning great with his disease. He says,</p><blockquote name="5cb2" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“The most important thing in life is to learn how to give out love, and to let it come in. A wise man named Levine once said, “*</blockquote><blockquote name="d99f" class="graf graf--pullquote graf--startsWithDoubleQuote graf-after--blockquote">“Love is the only rational act”</blockquote><h3 name="6848" class="graf graf--h3 graf-after--pullquote">2nd Tuesday – Feeling Sorry for Yourself</h3><p name="f1d2" class="graf graf--p graf-after--h3">Mitch asked Morrie, whether he feels sorry for his disease.</p><blockquote name="ff6a" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“Sometimes, in the mornings,” he said. “That’s when I mourn. I feel around my body, I move my fingers and my hands – whatever I can still move – and I mourn what I’ve lost. I mourn the slow, insidious way in which I’m dying. But then I stop mourning.”</blockquote><h3 name="45a6" class="graf graf--h3 graf-after--blockquote">3rd Tuesday – Regrets</h3><p name="47d0" class="graf graf--p graf-after--h3">Mitch wanted know what regrets had once he found out that his death was imminent. He said,</p><blockquote name="f260" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“the culture doesn’t encourage you to think about such things until you’re about to die. We’re so wrapped up with egotistical things, career, family, having enough money, meeting the mortgage, getting a new car, fixing the radiator when it breaks – we’re involved in trillions of little acts just to keep going. So we don’t get into the habit of standing back and looking at our lives and saying, Is this all? Is this all I want? Is something missing?”</blockquote><blockquote name="acdd" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--blockquote">“You need someone to probe you in that direction. It won’t just happen automatically”</blockquote><p name="a645" class="graf graf--p graf-after--blockquote">So Mitch wrote a list about things that he wanted clarity on</p><ul class="postList"><li name="94c6" class="graf graf--li graf-after--p">Death</li><li name="21b6" class="graf graf--li graf-after--li">Fear</li><li name="bfba" class="graf graf--li graf-after--li">Aging</li><li name="4120" class="graf graf--li graf-after--li">Greed</li><li name="4e49" class="graf graf--li graf-after--li">Marriage</li><li name="6da6" class="graf graf--li graf-after--li">Family</li><li name="84dd" class="graf graf--li graf-after--li">Society</li><li name="ece6" class="graf graf--li graf-after--li">Forgiveness</li><li name="72e5" class="graf graf--li graf-after--li">A meaningful life</li></ul><blockquote name="310e" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--li">“A teacher affects eternity; he can never tell where his influence stops”– HENRY ADAMS</blockquote><h3 name="9707" class="graf graf--h3 graf-after--blockquote">4th Tuesday – Death</h3><blockquote name="31f5" class="graf graf--blockquote graf-after--h3">To know you’re going to die, and to be prepared for it at any time. That’s better. That way you can actually be more involved in your life while you’re living.”</blockquote><blockquote name="aa1f" class="graf graf--blockquote graf-after--blockquote">Why is it so hard to think about dying? “Because,” Morrie continued, “*most of us all walk around as if we’re sleepwalking*. We really don’t experience the world fully, because we’re half-asleep, doing things we automatically think we have to do.”</blockquote><p name="4852" class="graf graf--p graf-after--blockquote">Morrie said,</p><blockquote name="868d" class="graf graf--pullquote graf--startsWithDoubleQuote graf-after--p">“Once you learn how to die, you learn how to live.”</blockquote><h3 name="7844" class="graf graf--h3 graf-after--pullquote">5th Tuesday – Family</h3><blockquote name="4677" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--h3">“If you want the experience of having complete responsibility for another human being, and to learn how to love and bond in the deepest way, then you should have children.”</blockquote><h3 name="ee22" class="graf graf--h3 graf-after--blockquote">6th Tuesday – Emotions</h3><blockquote name="bf70" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--h3">“You know what the Buddhists say? Don’t cling to things, because everything is impermanent.” Detachment doesn’t mean you don’t let the experience penetrate you. On the contrary, you let it penetrate you fully. That’s how you are able to leave it.</blockquote><blockquote name="7b62" class="graf graf--blockquote graf-after--blockquote">If you hold back on the emotions – if you don’t allow yourself to go all the way through them – you can never get to being detached, you’re too busy being afraid. You’re afraid of the pain, you’re afraid of the grief. You’re afraid of the vulnerability that loving entails.</blockquote><p name="e8c1" class="graf graf--p graf-after--blockquote">Morrie was worried that once ALS would reach his chest, that is the end of him. He talked about his most fearful moments while coughing, thinking that it was it.</p><blockquote name="e5f0" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“he said, and his first emotions were horror, fear, anxiety.” But once he recognized the feel of those emotions, their texture, their moisture, the shiver down the back, the quick flash of heat that crosses your brain – then he was able to say, “Okay. This is fear. Step away from it. Step away.”</blockquote><p name="d3ee" class="graf graf--p graf-after--blockquote">Mitch began to read about death, and how various cultures view the final passage differently. He finds that,</p><blockquote name="b089" class="graf graf--blockquote graf-after--p">There is a tribe in the North American Arctic, for example, who believe that all things on earth have a soul that exists in a miniature form of the body that holds it – so that a deer has a tiny deer inside it, and a man has a tiny man inside him. When the large being dies, that tiny form lives on.</blockquote><h3 name="2900" class="graf graf--h3 graf-after--blockquote">7th Tuesday – The Fear of Ageing</h3><p name="7799" class="graf graf--p graf-after--h3">Mitch wanted to know whether Morrie was ever afraid to grow old. Morrie replied that he <em class="markup--em markup--p-em">embraces ageing</em></p><blockquote name="de5d" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“It’s very simple. As you grow, you learn more. If you stayed at twenty-two, you’d always be as ignorant as you were at twenty-two. Aging is not just decay, you know. It’s growth. It’s more than the negative that you’re going to die, it’s also the positive that you understand you’re going to die, and that you live a better life because of it.”</blockquote><p name="7ecd" class="graf graf--p graf-after--blockquote">Morrie believed that</p><blockquote name="14ef" class="graf graf--blockquote graf-after--p">Because if you’ve found meaning in your life, you don’t want to go back. You want to go forward</blockquote><blockquote name="be57" class="graf graf--blockquote graf-after--blockquote">All younger people should know something. If you’re always battling against getting older, you’re always going to be unhappy, because it will happen anyhow.</blockquote><p name="c424" class="graf graf--p graf-after--blockquote">Mitch also asked, that how does he keep himself from envying. He said</p><blockquote name="7b7e" class="graf graf--pullquote graf--startsWithDoubleQuote graf-after--p">“How can I be envious of where you are – when I’ve been there myself?”</blockquote><h3 name="b422" class="graf graf--h3 graf-after--pullquote">8th Tuesday – Money</h3><p name="5803" class="graf graf--p graf-after--h3">More has always kept with simple pleasures dancing, singing laughing, which he seemed to know a long time ago. He believed,</p><blockquote name="4667" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“We’ve got a form of brainwashing going on in our country,” Morrie sighed. “Do you know how they brainwash people? They repeat something over and over. And that’s what we do in this country. Owning things is good. More money is good. More property is good. More commercialism is good. More is good. More is good. We repeat it – and have it repeated to us – over and over until nobody bothers to even think otherwise. *The average person is so fogged up by all this, he has no perspective on what’s really important anymore.*</blockquote><blockquote name="835c" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--blockquote">“Wherever I went in my life, I met people wanting to gobble up something new. Gobble up a new car. Gobble up a new piece of property. Gobble up the latest toy. And then they wanted to tell you about it. ‘Guess what I got? Guess what I got?’</blockquote><blockquote name="9d14" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--blockquote">“You know how I always interpreted that?</blockquote><blockquote name="774d" class="graf graf--blockquote graf-after--blockquote">These were people so hungry for love that they were accepting substitutes. They were embracing material things and expecting a sort of hug back. But it never works. You can’t substitute material things for love or for gentleness ofor tenderness or for a sense of comradeship.</blockquote><h4 name="388e" class="graf graf--h4 graf-after--blockquote">Answer to satisfaction</h4><blockquote name="8471" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--h4">“<strong class="markup--strong markup--blockquote-strong">Offering others what you have to give</strong>.” I mean your time. Your concern. Your storytelling. You play cards with a lonely older man and you find new respect for yourself, because you are needed. Devote yourself to loving others, devote yourself to your community around you, and devote yourself to creating something that gives you purpose and meaning.</blockquote><blockquote name="fd6e" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--blockquote">“Status will get you nowhere. Only an open heart will allow you to float equally between everyone.”</blockquote><h3 name="e71a" class="graf graf--h3 graf-after--blockquote">9th Tuesday – How Love goes on</h3><p name="eddc" class="graf graf--p graf-after--h3">Mitch realised something when he met Morrie this time. He just met Morrie, who despite his illness tried to keep his enthusiasm intact while meeting his scores of well wishers. Mitch thought,</p><blockquote name="385d" class="graf graf--blockquote graf-after--p">Here was a man who, if he wanted, could spend every waking moment in self-pity, feeling his body for decay, counting his breaths. So many people with far smaller problems are so self-absorbed, their eyes glaze over if you speak for more than thirty seconds.</blockquote><p name="8d11" class="graf graf--p graf-after--blockquote">Morrie believed in being fully present</p><blockquote name="cfb1" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“That means you should be with the person you’re with. When I’m talking to you now, Mitch, I try to keep focused only on what is going on between us. I am not thinking about something we said last week.”</blockquote><h3 name="5fc5" class="graf graf--h3 graf-after--blockquote">10th Tuesday – Marriage</h3><p name="d8e0" class="graf graf--p graf-after--h3">Morrie mentions that there are a few rules that are true about love and marriage:</p><blockquote name="b370" class="graf graf--blockquote graf-after--p">If you don’t respect the other person, you’re gonna have a lot of trouble. If you don’t know how to compromise, you’re gonna have a lot of trouble. If you can’t talk openly about what goes on between you, you’re gonna have a lot of trouble. And if you don’t have a common set of values in life, you’re gonna have a lot of trouble. Your values must be alike.</blockquote><h3 name="6b66" class="graf graf--h3 graf-after--blockquote">11th Tuesday – the World</h3><p name="a116" class="graf graf--p graf-after--h3">Mitch met Morrie this Tuesday, he found that Morrie needed smacking his back to get the green poison fluid out of his lungs, to keep it from solidifying in his lungs. Mitch thought, as he witnessed pale Morrie,</p><blockquote name="8088" class="graf graf--blockquote graf-after--p">how much time we spend trying to shape our bodies, lifting weights, crunching sit-ups, and in the end, nature takes it away from us anyhow.</blockquote><p name="7b3d" class="graf graf--p graf-after--blockquote">Morrie believed in inherent good of the people but he also saw would could they become</p><blockquote name="8863" class="graf graf--blockquote graf-after--p">People are only mean when they’re threatened. That’s what our culture does. That’s what our economy does. Even people who have jobs in our economy are threatened, because they worry about losing them. And when you get threatened, you start looking out only for yourself. You start making money a god. It is all part of this culture.”</blockquote><h3 name="4049" class="graf graf--h3 graf-after--blockquote">12th Tuesday – Forgiveness</h3><p name="ee6b" class="graf graf--p graf-after--h3">Morrie had a friend name Norman who had sculpted a bronze Morrie for him. Once Morrie’s wife got sick and needed surgery, but Norman did not reach out to them in these tough times. Morrie did not forgive, even when Norman reconciled over few years. Norman had died recently few years back, and Morrie never got a chance to see him. Morrie wished if had forgiven him.</p><p name="61e5" class="graf graf--p graf-after--p">Morrie also says that we should forgive ourselves.</p><blockquote name="3ed2" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“For all the things we didn’t do. All the things we should have done. You can’t get stuck on the regrets of what should have happened. That doesn’t help you when you get to where I am.”</blockquote><blockquote name="2ea3" class="graf graf--blockquote graf-after--blockquote">I always wished I had done more with my work; I wished I had written more books. I used to beat myself up over it. Now I see that never did any good. Make peace. You need to make peace with yourself and everyone around you.</blockquote><h3 name="817c" class="graf graf--h3 graf-after--blockquote">13th Tuesday – The Perfect Day</h3><p name="fd4c" class="graf graf--p graf-after--h3">This is Morrie describing his perfect day</p><blockquote name="9b7b" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“I’d get up in the morning, do my exercises, have a lovely breakfast of sweet rolls and tea, go for a swim, then have my friends come over for a nice lunch. I’d have them come one or two at a time so we could talk about their families, their issues, talk about how much we mean to each other.</blockquote><blockquote name="18b3" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--blockquote">“Then I’d like to go for a walk, in a garden with some trees, watch their colors, watch the birds, take in the nature that I haven’t seen in so long now.</blockquote><blockquote name="492a" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--blockquote">“In the evening, we’d all go together to a restaurant with some great pasta, maybe some duck – I love duck – and then we’d dance the rest of the night. I’d dance with all the wonderful dance partners out there, until I was exhausted. And then I’d go home and have a deep, wonderful sleep.”</blockquote><h3 name="7c56" class="graf graf--h3 graf-after--blockquote is-selected">14th Tuesday – Goodbye</h3><p name="ffc7" class="graf graf--p graf-after--h3">Morrie was struggling for breath. He was trying to force one word after another. This Tuesday made Mitch cry.</p><h3 name="78b8" class="graf graf--h3 graf-after--p">Graduation</h3><p name="f562" class="graf graf--p graf-after--h3">Mitch says,</p><blockquote name="1788" class="graf graf--blockquote graf-after--p">Professor Morris Schwartz taught me anything at all, it was this: there is no such thing as “too late” in life. He was changing until the day he said good-bye.</blockquote><blockquote name="b73a" class="graf graf--blockquote graf-after--blockquote graf--trailing"><strong class="markup--strong markup--blockquote-strong">The last class of my old professor’s life took place once a week, in his home, by a window in his study where he could watch a small hibiscus plant shed its pink flowers. The class met on Tuesdays. No books were required. The subject was the meaning of life. It was taught from experience. The teaching goes on.</strong></blockquote></div></div></section>
* [ext[bookpickings|https://bookpickings.brainpickings.org/]]
* [ext[GatesNotes|https://www.gatesnotes.com/Books]] - Bill Gate's Blog
* The thing about writing a story in real life and on paper, is that half the effort is just figuring out what the story is going to be, sitting in front of blank whiteboard waiting for the ideas to come.
* Don't be afraid if the life turns out to be magical by just taking a few risks
*
Algorithmic solutions from Computer science applied in Real Life
!! Main Ideas
* Look then Leap Approach - Deciding the % of time to be invested in a task for exploration before committing. - Answer ''37%''.
** Looking for a parking space - look for first 37% of the area if you cannot find the closest parking to the store, find the first parking spot after exploring for 37%
** Looking for a life partner - 18 to 40 years - Explore for partners for first 37% of lifetime i.e. 26.1 years - then pick the next best partner that was better than whom you had spent time till 18 - to 26 years
* Explore then Exploit Approach - Never pick the first solution/answer no matter how promising it may seem, since you don't have the benchmark to compare it with.
** America's got talent - don't say yes to a lot of participants on the first day. First few days used more as a warm up to judge the participants
* Prioritization
** Goal is the have least items
Coffee Can Investing is a book by [[Saurabh Mukherjea]] for investing using fundamentals in India Stock Market. The crux of this book is building a [[Coffee Can Portfolio]] and staying invested for as long as 10 years without losing sleep
<<tabs
"
[[Coffee Can Investing - 01]]
[[Coffee Can Investing - 02]]
[[Coffee Can Investing - 03]]
[[Coffee Can Investing - 04]]
"
"[[Coffee Can Investing - 01]] "
"$:/state/strollhometabs" "tc-vertical">>
Data doesn't speak for itself. It needs a story-teller. This book by [[Nancy Duarte]] is about communicating data which requires ''tailoring your message for those who require it''.
!! Main Ideas
''1. Need for explainability''
* Model Validation - why it made that output. Was it biased?
* Model Debugging - model should not be sensitive
* Knowledge Discovery - gain scientific knowledge and provide causal relations
''2. Interpretability vs Exploitability''
* Models that are explainable are interpretable, but not vice versa
* Interpretability deals with making sense of what is already present and evident while Explainability is a theory that deals with unobserved facts towards a global theory.
* Boiling water case study
''3. XAI Flow''
:<img src='https://media.springernature.com/original/springer-static/image/chp%3A10.1007%2F978-3-030-68640-6_1/MediaObjects/502929_1_En_1_Fig16_HTML.png' width=500>
''4. Correlation & Linear Regression Weight''
[[Linear Regression]] weight is a specific case of [[Correlation]] where $$M = \rho\frac{\sigma_Y}{\sigma_X}$$
''5. Lasso Regression''
Can use [[Lasso Regression]] as a tool to select features one by one. By changing the alpha we get variable weights, and only the most important variables are used and unimportant variables are reduced to zero. Using this recursively, we can come up with feature importance starting with $$\alpha$$ value which leads to only 1 variable remaining.
<hr>
!! Summary
[[Ray Dalio: Principles]]
The Brain by [[David Eagleman]] attempts to bridge the gap between academic literature and the lives that we leads as brain owners. The journey of ''inner cosmos''
<<tabs "[[The Brain - Chapter 1]] [[The Brain - Chapter 2]] [[The Brain - Chapter 3]] [[The Brain - Chapter 4]] [[The Brain - Chapter 5]] [[The Brain - Chapter 6]] " "[[The Brain - Chapter 1]]" "$:/state/strollhometabs" "tc-vertical">>
A book by [[Oliver Sacks]] Is about 4 different categories of [[Brain]] disorders - describing cases and what was observed and what was overlooked.
The idea in this book is to look beyond the path & history of disease and while considering historical identity of the person, as for the diseased are animals as well. This study is encompassed in the discipline called - [[Neurology]] of Identity
* Book by Frank Luntz
!! Summary
* It matters how your words are perceived and not the dictionary definition
* ''Key pillars to get your point across''
** Use ''simple words and short sentences'' to make your point clear
** [[Humanization]] - say something that everyone can relate to
*** like [[Martin Luther King Jr]]'s //I have a dream// speech. Hollywood writers live by the rule that their words should stir up emotions in viewers. They know that when language touches a person’s feelings, it leaves a lasting impression in her memory
** Employ language that ''grabs your imagination'' - can be triggered by the usage of the word ''imagine''
** Utilize ''musical qualities of words''
*** Words that sound similar makes them more memorable - the repetition of letter I in ''Intel Inside'' makes the slogan stick
** ''Pose a question'' to the audience - asking questions triggers a thought process and leads them to a conclusion
* ''Avoid these pitfalls'' - strike a balance between these two
** Boring them with old information
** Overwhelming them with new ideas
* ''Know your audience''
** Should know your audience and be aware about major misconceptions about them
** How words used frequently are being perceived by the audience
* [[Deep Learning with Python - François Chollet]]
* [[Deep Learning with Python - Jason Brownlee]]
,,Tags: [[AI/ML/DL Resources]],,
* HBR Guide to Persuasive Presentations by Nancy Duarte
* Presentation Zen: Simple Ideas on Presentation Design and Delivery by Garr Reynolds
* slide:ology: The Art and Science of Creating Great Presentations by [[Nancy Duarte]]
* Talk Like TED: The 9 Public-Speaking Secrets of the World's Top Minds by Carmine Gallo
* Resonate: present visual stories that transform audiences by [[Nancy Duarte]]
* [[DataStory: Explain Data and Inspire Action Through Story]] by [[Nancy Duarte]]
* [[Bargaining with the Devil: When to Negotiate, When to fight]]
Boosting is an ensembling technique in which the models are made sequentially. The logic is that the subsequent predictors learn from the mistakes of previous predictors. So the observations are not chosen based on the prediction error
* Can lead to [[Overfitting]]
* Reduces error by reducing bias
* Boosting can be sensitive to [[Outlier]]s because if the dependent variable has lot of outliers, and when the boosting occurs, unnecessary attention is focused on outlier cases. With respect to input variables, outlier may not be a problem, because of where they are split. So the choice of [[Loss Function]] is important here - [[see this blog for reference|https://stats.stackexchange.com/questions/140215/why-boosting-method-is-sensitive-to-outliers]]
<img src='https://i.stack.imgur.com/q6PUJ.png' width=400>
!! 1. Background
*[[Boosting: Foundations and Algorithms|https://doc.lagout.org/science/0_Computer%20Science/2_Algorithms/Boosting_%20Foundations%20and%20Algorithms%20%5BSchapire%20%26%20Freund%202012-05-18%5D.pdf]]
* Types of Error = [[Bias]] + [[Variance]] + Noise
* [[Ensembling]] methods for model predictions
* Variance reduction techniques
** [[Bagging]]
* Bias reduction techniques
** [[Boosting]]
!! 2. How boosting works?
!! 3. Boosting Methods & Timeline
An infographic that covers boosting methods history along with improvements made over the previous iteration using [[Evolution of Boosting Algorithms|https://arxiv.org/pdf/1403.1452.pdf]]
* 1990 - Schapire developed first simple Boosting framework
* 1995 - Freund proposed [[Boost by Majority]] improved over Schapire simple boosting method by combining many weak learns simultaneously
* 1998 - Leo Breiman - [[AdaBoost]] was first successful [[Boosting]] [[Algorithm]]
* 1999 - Jerome Friedman - [[Gradient Boosting Machines (GBM)]] - [[GBM Paper|https://jerryfriedman.su.domains/ftp/trebst.pdf]] - Improved stability from [[AdaBoost]] for handling [[Outlier]]s
Remaining algorithms from [[Comprehensive Evolution and Evaluation ofBoosting|http://ijcte.org/papers/266-G801.pdf]] published in 2010
* 2000 - [[AT&T Labs]] - [[BrownBoost]] - Handles noisy datasets. Improved over [[Adaboost]] which was susceptible to noise
* [[LogitBoost]]
* [[LPBoost]]
* [[MADABoost]]
* Full timeline available in [[this paper - Boosting methods for multi‑class imbalanced data classifcation: an experimental review|https://journalofbigdata.springeropen.com/track/pdf/10.1186/s40537-020-00349-y.pdf]] - but for [[Multiclass Classification]] and [[Imbalanced Classification]]. ''Conclusion'' of this paper is that CatBoost and LogitBoost algorithms are superior to other boosting algorithms on multi-class imbalanced conventional and big datasets, respectively.
!! 4. Advanced Boosting methods and Deep Dive
* [[XGBoost]], [[AXGBoost]]
* [[LightGBM]]
* [[CatBoost]]
* [[UGBoost]]
* [[NGBoost]]
!! 5. Practical insights for implementation
* Codes
* Tips and Tricks
!! 7. Limitations
* Improving explain ability through [[Explainable AI]] methods
!! 6. Novel methods and upcoming research and further exploration
* [[SGB-ELM|https://downloads.hindawi.com/journals/cin/2018/4058403.pdf]]
* [[MediBoost|https://www.nature.com/articles/srep37854.pdf]]
* [[BoostLR: A Boosting-Based Learning Ensemble for Label Ranking Tasks|https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9205798]]
* [[KTBoost: Combined Kernel and Tree Boosting|https://link.springer.com/content/pdf/10.1007/s11063-021-10434-9.pdf]]
* [[LIUBoost]] from [[LIUBoost : Locality Informed Underboosting forImbalanced Data Classification|https://arxiv.org/pdf/1711.05365.pdf]]
*[[Multi-resolution boosting for classification and regression problems|https://link.springer.com/content/pdf/10.1007/s10115-010-0358-0.pdf]]
* [[Gradient Boosting Neural Networks: GrowNet|https://link.springer.com/content/pdf/10.1007/s10115-010-0358-0.pdf]]
* [[A novel confidence-based multiclass boosting algorithm for mobile physical activity monitoring|https://link.springer.com/content/pdf/10.1007/s00779-014-0816-x.pdf]]
* [[OKVAR-Boost: a novel boosting algorithm to infer nonlinear dynamics and interactions in gene regulatory networks|https://watermark.silverchair.com/btt167.pdf?token=AQECAHi208BE49Ooan9kkhW_Ercy7Dm3ZL_9Cf3qfKAc485ysgAAAt8wggLbBgkqhkiG9w0BBwagggLMMIICyAIBADCCAsEGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMHY3tIvsmyqStrV-kAgEQgIICkmVJQR76YmUxoa5aq4KVjy5r6Ic0zzdXn0k52jeGd1gWa4dfg1Pmbkcl2PvskctJWGH6U5uHNn1dR82Sg2BEG-YBo6NLFdin7V5jc1X2fCYM2VFAbYFbXKy9XYA5boObfIElRHI1k7WLpnVRwJgpXs4GKXHcMzDUBmGiHoWqEm22ab1S11R4t7-TFsmRoHSkvCIhiK_aUpvPt9eRpyshfzKuoUAGQSM6X3Tu_oRo9hvK7N46Ft8EMxQKZRJcnn7rcqoq3szhaAz8e7NwiZ8v8eOZbTqgtPgYz2pJ-sUf1kjcmhprdhN8_L8aCtpTrUIaFzOfk07QqFAFyjwLYkN4sI-bNBFpxThPqDq5UFbgtrqt9J-nIuJ6VXMiUDNC19SaZ_r3OZzb2kGQrwEoOOhA6Drv7ENlG3Jn4O167HRsVStcxcD-JA4KQWk0r4NXySN433YEehViDx1IDVbywzn7qCqm2L2H18NadU6o5rSuJJVKTKO--0hVZ0L7paK8E_aJR5uKFmjIGl6YN6Nw-kfswQ5chkjvZ8k6_1JP7Uvxl-dknuEox0VQqTr6d9Kg1g5PXjHpJSOq_koyXqJGEk0GyZNOfX2ZUSGYQetoy_xpKbhfCU4NouWqxJJ4wU2YONtl3mNjrfIClIpjVnj8dqEhq9EhJGUeY_J1lQEB1AKE-7XJWpOuoL-KjywLrX-RWvD9hquXU9Vm6Dxx5iQRBps854mkAnbZRR3DEMezLBRznq5HmABdzKn4g8PDq-9TjOz2Tt7jkHG70gkjUJDkzzSJLBs7zkdJQebBMrg5-rjUP7U1meR8QRk8o5s7l22SV-6Kp6q9FXAtYWE73JxRa_GTyXcL4oXoH95ZdSkkHKOOjs0m6Ho]]
* [[RUSBoost]]
* [[SMOTEBoost]]
<hr>
!! References
* [[Boosting on Wikipedia|https://en.wikipedia.org/wiki/Boosting_(machine_learning)]]
[[19 April 2022]] | [[20 April 2022]]
* Most lethal toxin on the planet - Botulinum toxin
* Commonly marketed under brand name Botox
* Ingesting a few drops of this [[Neurotoxin]]
** your brain could no longer command your muscles to contract
** You would die from paralysis (specifically your [[Diaphragm]] would no longer be able to move and you'll suffocate.
* Injecting in facial muscles paralyzes them and thereby reduces wrinkling.
* Transform variable $$y$$ using $$y^x$$
!!! Process
# Determine a range of exponents to test
# Apply transformation to each value in the feature
# Use a criteria to determine which exponent yields best distribution
#* Use [[QQ plots]] - a perfect distribution would mean all of the plots in this point would end up in a straight line from the bottom left to the top right
#* Use [[Histogram]] with a [[Normal Distribution]] curve overlaid - with the mean and [[Standard Deviation]] of the actual data
#* Test of Normality can also be applied - dependent on sample size, can be avoided
!!!
!!! reference
[[Feature Transformation|https://www.linkedin.com/learning-login/share?account=82999986&forceAccount=false&redirect=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fapplied-machine-learning-feature-engineering%2Ftransform-skewed-features%3Ftrk%3Dshare_video_url%26shareId%3D4%252BJ%252BLps7REmzJS3BI81gmg%253D%253D]]
Being able to [[Focus]] help us succeed. Too many people think they need to work harder when they struggle to focus. This strategy is likely to backfire. Use [[Emotional Intelligence]] to focus
!! [[self-awareness]] to notice lack of [[Focus]]
* ''Why you feel [[Stress]] or [[Anxiety]]?'' - List out all your sources of stress and categorize them in [[Circle of Control]] and outside of control. Change your attitude toward for the later
* ''How you lose your ability to focus''
* ''How you feel when you can't focus'' - e.g. you can recall information, and that inability to concentrate causes more stress
* ''When you lose your ability to focus'' - dangerous situations could be driving
!! Strategies to keep you focussed
* [[Digital Detox]] - Keep away from notifications ([[Email]]s, [[Social Media]]) etc. ''Constant checking induces more stress''
* ''Rest your [[Brain]]'' - Commit to recommended 7-8 hours of [[Sleep]] each night
* ''Practice [[Mindfulness]] '' - this decreases tendency to jump to conclusions and have knee-jerk reactions. It is the key to building [[Emotional Resilience]]
* Shift your focus to others - Solving others' problems can calm us down and strengthen our resilience and also reap benefits of doing something for someone you care about
[[HBR]] | [[03 September 2022]] |
It is a 300-year old principle of [[Physics]] which had been interpreted to mean that no surface could reflect light near perfectly at every angle. [[Andy Ouderkirk]] defied this by applying breadth based knowledge from biology to stack thin sheets of polymer layers each refracting light at different angles. This technology is cheap to manufacture and enables energy efficient emission of light
,,[[David Epstein: Range]],,
Consider a model that predicts the likelihood of people going to movies tonight. Regardless of your confidence in the model, if you happen to know that a particular person has a broken leg, you probably know better than the model that they might go
,,[[01 May 2022]],,
* Adaptive version of [[Boost by Majority]] [[Algorithm]]
* Formulated in 2000
!! Reference
<embed src='https://cseweb.ucsd.edu/~yfreund/papers/brownboost.pdf' width=700 height=400>
[[20 April 2022]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/Z6KZ3cTGBWw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Any [[Stock Market]] transaction that involves buying or selling of at least 0.5 per cent of the number of listed shares of a company is a bulk deal.
<iframe width="560" height="315" src="https://www.youtube.com/embed/MLuJ249WnkE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,[[06 December 2021]],,
Bharat pe generates an app agnostic QR code (interoperable) for customers to transact. however they don't make any money by charging processing fees for transactions, it is free. Their main model is to provide credit to merchants at cheap interest rates and their payment recovery rate is as high as 96%.
# Company buys back it’s own shares to invest in itself.
# Decreases the amount of outstanding shares in the market
# Sends a message to the stockholders that the company is confident about its growth
# Usually positive for the share price
!! From Video Lectures
* Hyperspherical Variational Auto-Encoders (Davidson, Falorsi, De Cao, Kipf, and Tomczak, 2018): https://www.researchgate.net/figure/Latent-space-visualization-of-the-10-MNIST-digits-in-2-dimensions-of-both-N-VAE-left_fig2_324182043
* Analyzing and Improving the Image Quality of StyleGAN (Karras et al., 2020): https://arxiv.org/abs/1912.04958
*Semantic Image Synthesis with Spatially-Adaptive Normalization (Park, Liu, Wang, and Zhu, 2019): https://arxiv.org/abs/1903.07291
* Few-shot Adversarial Learning of Realistic Neural Talking Head Models (Zakharov, Shysheya, Burkov, and Lempitsky, 2019): https://arxiv.org/abs/1905.08233
* Learning a Probabilistic Latent Space of Object Shapes via 3D Generative-Adversarial Modeling (Wu, Zhang, Xue, Freeman, and Tenenbaum, 2017): https://arxiv.org/abs/1610.07584
*These Cats Do Not Exist (Glover and Mott, 2019): http://thesecatsdonotexist.com/
!! From Notebooks
* Large Scale GAN Training for High Fidelity Natural Image Synthesis (Brock, Donahue, and Simonyan, 2019): https://arxiv.org/abs/1809.11096
*PyTorch Documentation: https://pytorch.org/docs/stable/index.html#pytorch-documentation
*MNIST Database: http://yann.lecun.com/exdb/mnist/
[[Notes here|https://www.coursera.org/learn/classification-vector-spaces-in-nlp/supplement/afcaR/optional-logistic-regression-gradient]]
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
!!! [[Supervised Learning]] (training)
<img src='https://marcossilva.github.io/assets/2020-06-28-15-20-37.png' width=500>
* Input features $$X$$
* Labels $$Y$$
* For accurate predictions, minimize error/cost
* Using $$X$$, run prediction function which takes parameters $$\theta$$ and outputs labels $$\hat{Y}$$.
* Cost function compares $$\hat{Y}$$ and $$Y$$
* update the parameters until your cost is minimized
!!! [[Sentiment Analysis]]
*Tweet (I am happy because I am learning NLP) $$\rightarrow \bigg[ X \rightarrow Train LR \rightarrow Classify \bigg] \rightarrow$$ Positive:1
* How to extract features X from tweets are discussed in [[C1W102: Vocabulary & Feature Extraction]]
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
!! Feature Extraction
* Convert text to vector, you need to first build vocabulary.
* Given a tweet, or some text, you can represent it as a vector of dimension $$V$$, where $$V$$ corresponds to your vocabulary size. If you had the tweet //"I am happy because I am learning NLP"//, then you would put a $$1$$ in the corresponding index for any word in the tweet, and a $$0$$ otherwise.
:<img src='https://lh3.googleusercontent.com/Y0571Ys1YeI4pJtFCmqpuUoD5jmSEnIFUL2SM4vp70V4pUffjeHKDRCXcqbXAY4RHPNdpr4U5k3D-uruJI38PGYWROhXfpo7R3hS67mLm9eLNvjMog4B9sEqSZfZQSzA2e7gfvVxQUuU8kZRLf__qU3lHijxI0s8Chl_cXhe1NsoeABZvE0yF8HG_bDhAyOiyXwyBerEhHrIMOBSYVD37X2YGpHQUsQis35yoQ09enWlDO9pRXWt93Aq2EDu3Om8QpxbkPZrnAACX5Du8UOHyvTX_b4LKh_vvDf3qh2tg73kws8aLhRfdD-IjZxfeyqw0KeqzRLFpvlchl7wIwaKlEDNYolcobU4KxNzAiYR9u8f2kzX9JQz33lWlUdUpPZ8xeP6hWp5t2nq1zJmqzATxQ4_TNW2Wxs-ofHtBraPGsM1kOM52-86U8j4huccZMiTCRfUKjGSIyYUcGUzhK5VM7XW9ZL0TPGz5cgtqhyLL_chEw9Rgzn7Hwnf2W-5GLokwSOtn6MkeA7yCUUoTqUGksrKCaoGe_bUDcE0k_soYnTsR6-xV42ZpbObFjItXC8oqMgUVoUbjTsVO5FxBHpsobk3egqX5CtZ35VewQRkCmwgO-OJiZiO2dFb9rA9WevPtaeHNXSwn-wHD0dvgYjWpBqowT9FaZ12zb8LUs5i1ugREVIT_AVOmDQM8p201VRg6YokvolEi1AgXJbGB30P371yXw=w1920-h707-no?authuser=0' width=600>
!! Problem with Sparse Representation
* The vector representation is sparse, this means there are a lot of zeros for every word in the sentence. The training dataset will be number of instances $$\times$$ number of parameters $$(\theta)$$
* The [[Logistic Regression]] model would have to learn $$n+1$$ parameters (one additional for bias term), equal to the size of vocabulary leading to excessive training and prediction time
How to identify the problems with larger vocabulary spaces is discussed in [[C1W103: Negative and Positive Frequencies]]
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
* Corpus of tweets $$\rightarrow$$ generate vocabulary
* For [[Sentiment Classification]], divide the corpus into positive and negative classes
:<img src=
'https://lh3.googleusercontent.com/B7MlkY7H_R8F1wpWeYRw8bu2ly2FQbiNBk8f6ye3nQ7eFFCvzfoWTI1IxyWEcveidIojbz8t7QZtk2OscezwLVxyrt0gwgnJjlZRRlYFE3qlaOT4fKnGYmi97F3AcJWEEVIybAiUPP_-hvA5xlYgMG7jKMAS4Tdd3-GdZjRHgOmUvncw9T5-n7izJrRB-5Yy6C4_QUJ3llQoX7xY2p3D0_hJacm_MSgoIA5nlhwuZhg2HTKc28Io-5evSpSDHQuuA4xyxrJr--dPb-ZoPz_7fKnANAd21P6X3fwwWxDGuHx6dp5kozPeNT3MitnBow5UrV4D27Xn1zNK1xWV7Z6Pk-ujOA6fyJ6oLpManvo5o9CBhjCZtChjPOOVNButZDwVWJlFrk07wme9aSipUOAZaIHxIotTXO9Kc_uI72CXjf4_BNaq-Z9vBSRLZgovPAYU510GEcql3Ad-yMLsjiDp4A36iIuEkxCPxEJwEdcXbY3FtrlrFGqH9myjbS1Gqj426c0ov2ExODrjxbvuVp8UZzqmvFWi40bEsmOiZbbWJAqivzHBh1JO_qSEjLKjL9R2b7WsqBoAP8mVUI5OzB2H8qpSBP9xafUjrmWzPgepYSjVWxd-zyxqmVTpvFsBf7j_nglE48qTSYh9AlIGhNFO835k497McJaB3P4t-hmNAPxnGLUQijblBiMAmFjdP03BucfwZF3YJ1LuF_76Ea_hA5DRFA=w1920-h356-no?authuser=0' width=500>
*Generate word count to use it as features
** Positive Frequency - Count the number of times the word in the vocabulary shows up in the positive tweet class
** Negative Frequency - Count the number of times it shows up in the negative class
::<img src='https://lh3.googleusercontent.com/VAJsZG8k_dKAV7gV-XTziJYWT2sVK6DdWMCxne7J5iXTNi9aKS7qKuXXeY-JSUG6d3XKcb8abKfJdJk7cC8Z7IERlaXx-Iw9ML0qAlMafjabzTOwmwFBwSQaGiKnfMnvTL3D6ymfMPzGbIqhi7b9LnUm4tEqqIB7UhUdQW6nJCEAoBWnrArBQIIaWpvusUWUptT-m2QXFxUNodSHFnFFUWo2zWYCleKgVIMoqBAbVrZX936beRcaFnBSBy8-fn4nDABx-p8A6KdCoHppEU2F1G7oCbzzBG3-jvQf98bI98QZPf5KgCGtJ2S1pHk-0Ir0vx81MCOz1sqbJR8zCPfKE0Jamdej16XRMjjnwyyKNveShtT_Rd1XYQveIloRRfDchIIXRje5rZWE0ANqipwLWT1gr3dELbe-264KZ5jqvk1yiwIAtG7AcJBAjFLyEEjJUYoyLgVdSewt2su0baCPAFwuiR6qD6rIOGUqr6g7kUZbYp3B3V53TZRyiwMyFgFL5UogMiuQWvMYvSS3wHQId-da69uJsN5o6GR9-rfNsfk1SDKrvxKF7lHCwuLy1eddpSuSiTM_TM6KATP6T3noXSvZjRQhEZzaJVa6rYEckEFhguzsy_pC6nJ-OivcXbFOUdrC4ztDryb9MyvHe-duClCSGOM0jxaVBpdfiW9bD6Whw13DIJDix9yfUWS6zNmUsYAuEKleXLDwyfFUuR7zY0ByQA=w1920-h734-no?authuser=0' width=500>
* For each tweet, there are only 3 features learned instead of $$V$$ features - where freqs is a dictionary mapping from $$ { word, class \rightarrow Freq}$$
** the second feature is the sum of positive frequncies
** third features is the sum of negative frequencies
$$
X_m = [1, \sum_w freqs(w,1), \sum_w freqs(w, 0)]
$$
!!Example
for a sentence, the positive and negative frequency features can be computed as. Hence you end up getting the following feature vector $$[1,8,11]$$. $$1$$ corresponds to the bias, $$8$$ the positive feature, and $$11$$ the negative feature.
''Positive Frequency''
<img src='https://lh3.googleusercontent.com/ajMKk24NpVRmKjQCQWNTTVzHRDM305-M07lVN86GCD-uvPtRTp924ieYkCeZNi74X8OdhjDUAvuoQcYXZpD8tFszVqUlHkckuY6fw9Qvm9Qvo1Cfwdfjr5MA3EZLAegfxLnLeRT0_OSJu5wBxTqMNHrCLtt76FdcX3jj7fJPkULfiitTxYnRt-tf1_5m-NiEx3abg0rcZj9YjFjKoD8ZhJLqRQywrVLe3u5UeZKsHx-YYezR2xCXlZu6OOea1DVfS2RTLdS4u_8jj6ZwrUCA8y1fk4p_mCiIxaIs0s9fqYVuVegJ-0EFbbGoYXovj_GukPEx1TakI3DLVklkacWrdIR3MjyJmGT2sf6mJGRC1hqRAvX-ZLjlEoo4Fo7bBGOfNQebFPOxj_a00WwsSy0ga3yuhySE2LFkD_n_lGxw2iJINqgjEm9O6iS44REtCIZp6Ls0d4SbvKtuDnX1xaq3R2KuD_otWgm6krTz9XTvYYpP9W5V9dIhXIjCk5nulg6b6j6QwpRNT_XM7GIo4m6iwLVr_-PTQgMYwYTB5_Cjxp_NwG8EsLfxCybBd_jvRZkljmdlnossuLZ2O7nehKNC6agK5INf4EBfjM6AolEgMkbf9gYYDJ71d-qlaT4cGRTC9wCeEwBbpGWR5OSf6LKuLGCf5Z-PHeUkyFdvjrtZu8HUMokkJvqpsdNEYWjSwSSw2BD4h6ULl588bG8HA5D2CyR1Ew=w1920-h737-no?authuser=0' width=500>
''Negative Frequency''
<img src='https://lh3.googleusercontent.com/kUPeJ4OfZq1Md-WBRX9vS_PKS_xMPexlOeFtpKWYbB7NEO8KH3rObKy6KlinSNfga_9SrUqy0ebWwZwK8e-iMPqXqC5ZZ8IsqyXuvzloL6jEm5pVrGdABDQivPqirmeI2Yow_4aTnxCkW_N5OOEwfhslJMEIbW8Ysm9BkM2oGWjZ9MCNl4SWYBrShLGBzJYV6Fo3b3Q_MSdBvnse41kWjraf4hXRFdFAd3L8P1uJqA4ryXvIZMpzj2HpW2CjhJdpUSFfTtfIvm9zynOZuZuPNYSTM4yMOQRxDGMS-VUGDANYirjensJErLpI3nO5OK0xVDDQiGkJQC3vwGtpLFr2hCKF6qj45ER0dIkCuY8zFyLtCXasvCvyXwzEMatjGhqb3TamFMu7ySa8huwb4ypgbOUA7QgttzNovp9UGqzxPSURVKwVby8KWer-lcUEVjVwC7fc_LKp3W8nO2r6zYy12lvHH0NVz0GYTMij4Xvfaf06v66nkOND_8jQ5h5fkTnFkSW0rW_sQK6VITrXUEwdWwDnc1CpkhjW9TpaPCB6SsyWb5jP0uevcaa9Vh0SEDaRvCi3_ezKmLKY8XrjmUDqQR0vnH6fOFTBxYNbKLi1io-wPuN1jYDkjm3cfoB9X0PB54kIdVSI_jkEZ5nyY4wj5xL74piKudKC_BtvhGb9sidB9m5N6NfW2u6O8XP3ReC8mDAnDpAgZd-JVav6c_GjnSi61w=w1920-h730-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
* Learn about [[Stemming]] and [[Stopwords]]
* Using the example to illustrate each preprocessing step
!!! `@YMourri and @AndrewYNg are tuning a GREAT AI model at https://deeplearning.ai!!!`
# Eliminate handles and URLs - `and are tuning a GREAT AI model at !!!`
# Tokenize the string into words
# Remove stop words like "and, is, a, on, etc." - `tuning GREAT AI model!!!`
# Remove punctuation like dot, comma, exclamation marks etc. - `tuning GREAT AI model` - In some cases, it would be important to not remove these punctuations for context
# [[Stemming]] or convert every word to its stem. Like dancer, dancing, danced, becomes 'danc'. You can use [[Porter Stemmer|https://tartarus.org/martin/PorterStemmer/]] to take care of this. - `tun GREAT AI model`
#Convert all your words to lower case - `[tun, great, ai, model]`
#:<img src='https://lh3.googleusercontent.com/QtMieVcsHa5A_GZLCnMAeFrZTp4tbAYOl9SqziSPWKujSiiszQcafLWiWoYQEinoTEkixwQODsYxUF1VMJShVF83x_wOuKyfUUhtVBsPcnYXp1tLSoYaBWLNVWfTTLtLfVjfCx83YxpBs0bR_zt0sGmazpejJtIIBnwCU1LAfdZV--LQHGwDAz3YlrntytsLArzjZC2-SKXYITl71qrsLmBs-K16VUcLG5IPfcLhW7v30itT9UzpdFjgWBUpj6PNRJkLDa2f9yujosdsq3xfwZlfO9oG045qaU0CYyHH3qugTtZivGychxwxa5NlmxVHwl7MQ1cEpg2TmXmVh95ZLK878gXyDZIfQd3mRAGSncse2N0aLLLHJx8ekNv_aMfASaghS4nx3-gcx7R6G0LprFBeSeyTop_PhqRsl7zBYXZ_vkSWxKHgaIkwLk_CrLTYZCtm0w8Wjgc7jgBg-lI4PzMb4MXbcPSgCulgzcu9EsImc-VIOB_aVXZuXW1VB2J5uXusFDAko1s4NUBVP3j_89mxyY37kD333hnaySwC7J371KnNfwGQ-y82Pwu_O9-kBJ8S2ygSVV6eLFtSYAnGUGkPcLL3z0_iWD0Vt2tJhwO60ow9LgBQ3BT4oQlu9eiB-nq89ptTG8jFiUNoJ9ebdG94oB_S8PK3NXVCy_VqHUhz5X9-mswYFLTaNF0IwbulsDYaR2D9Vmn1qunDB3ctNEBMsg=w1920-h737-no?authuser=0' width=400>
[[Course 1: NLP with Classification and Vector Spaces]]
!! Sentiment Classification Process
# Collection of $$m$$ tweets
# Preprocess tweets to get list of tokens
# Extract Features (Positive and Negative frequencies)
# create a matrix of size $$m \times 3$$ with 3 features and m training examples - this matrix will be input to [[Logistic Regression]]
#:<img src='https://lh3.googleusercontent.com/go4yWZXqLnoMHfbo8Vd0uYrHgE7xhLfyTvadVlqy0N2tJOvsfEZx2dYfMxpNfhrHs9Dc8DZvYwh7AkTXhDrijPhGJ9-epjKwHIQW1JkjKrDP_UA6lUd3qeDlzUSGbtJ0s4dG_2dXE8bZzECkQsopK-gFJW-ywfln10LGjB7V6fz6IaumHuZkb2tZgj67aKACk9fmqkHTdisQ7C_j_Z_5IbZ0OO45s9YIokDuvNZN72XEkT9WbfNLCWTo5QBt3pKIEk-tE0l44_hlwGzwlmXPOKY0NqD71aV6lpiQ0jYsr9gNHnbaycnse2pwRp5BLLn2CItKwhACUFxofHyNdKlPiRmBfxSrOtWPbpiOIhBXoB20kEJtD4tBJxe3qfhV7iTInfhlMjh_ib2QvPHyaXQEXX0dJmyJIOlrsGNpvEIJxdYzRsltCzCLqyM5XFljgA3cx_fV21TtkmxWGzio9uBQLxZS-lwsbTorH9XQkzxmyNULX7EKPAQmC6p9-bD8An0R6ToN_atpWVm6XLJyDB4jB0sSiy0QfKM501VQNEMOLKVVNQ6CkEBwgdvl4pxwuKNZoBrnvlCATp0CYg3lJuQBbUm8qxFwhxw-5tSJDJ-MH3rjdYMDeHKvs6lDB8n3Xb6ShZ5kkTAHK1xAynghVwoDchy_fVkp2ghm3H1E5Yy9xKoOn_S8eP2XLAiOzp_2Q7uKJyVQvwNgOmjp2tS1ENW8sE6OTw=w1576-h710-no?authuser=0' width=500>
!! In code
```python
freqs = build_freqs(tweets, labels) #build frequencies dictionary
X = np.zeros((m,3)) # Initialize X matrix
for i in range(m):
p_tweet = process_tweet(tweets[i])
X[i, :] = extract_features(p_tweet, freqs)
```
In the last step, extracted features as rows in $$X$$ matrix and $$m$$ of these examples are being stored.
$$X = \begin{bmatrix}1 & X_1^{(1)} & X_2^{(1)} \\ 1 & X_1^{(2)} & X_2^{(2)} \\ ... & ... & ... \\ 1 & X_1^{(m)} & X_2^{(m)} \end{bmatrix}$$
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
[[Logistic Regression]] makes use of the [[Sigmoid]] function which outputs a probability between 0 and 1. The sigmoid function with some weight parameter $$\theta$$ and some input $$x^{(i)}$$ is defined as follows.
<img src='https://lh3.googleusercontent.com/HwI77U3Co3R2AGVNTCDZaVp_r50MCNS2z4hHT2DS3EpJSs3b6QQRmxMizX9CuQK4tgUimUWawIcRS7yo8FrTRdO__J7-gu4zPwUFN0ZeoQ9S4oPJuMLyVxjY4DLpRrl6Jy3zeJzFAMWF8zR0cyYS6271HRN5tVienS6SHGBdvn2GxjCewYhEi7nsOZv2F6VwZYKEbvwjXyhUURuCiNoxpg75tzMGcZ6c3lqXj8PWwRhU66Imjs3HE9owf0VX7NZEoRIpj1bZeT71oA30yxDV-GP2781CL10b0fCsM5vYVtgCS1Pty0BtIGruk65fAvZdLtM4Fe-KqII63WNlgB9961qD1hrmNjcB7pVQ0rsmf-25Kbw1qg7suNU8kKdVn89fnkrvzUKtmRpxabnp5FrQbN4uZpAipIZQoXqwbYKPgUH6SOh7Dl-yAZrqjJGLHhfZDLXRajE7uXwU7aNuD-MmYg_3DTKsBAK52-gjFbDfhUTPDopVij0ltIftZG1A2lSNEs64rtIK8PVYwjxmIZ7Lw60Q1eMIQaBRJXiP5U8eWBomYu0pcCwUbN8OTjVEjJFuFEYAB0rxmgj8Eyo3Ov9TtRarN-o_MYu0mw1LNE7Zp2MEzcutVTjIjE0HYO67-ebEG0Rthf1UlYhEtFRy6DfmVbRxBE0Vj9q-NXgGaOT67gonbnmMuDXuW8FIJRmv6FpjwtWoKKd9WEhK1MM2KMtjbXsioQ=w1920-h870-no?authuser=0' width=600>
Note that as
* $$\theta^\mathsf{T}x^{(i)}$$ gets closer and closer to $$-\infty$$ the denominator of the sigmoid function gets larger and larger and as a result, the sigmoid gets closer to $$0$$.
* as $$\theta^Tx^{(i)}$$ gets closer and closer to $$\infty$$ the denominator of the sigmoid function gets closer to 1 and as a result the sigmoid also gets closer to $$1$$.
Now given a tweet, you can transform it into a vector and run it through your sigmoid function to get a prediction as follows:
<img src='https://lh3.googleusercontent.com/9tz-bwhR7j9kvLCLlv6O7y0Tu_3Rcx7sKuy3h96qLsGeyKpLPtYu4S1SBqIfLA-6PCUD30j26S_OVvamclAjXQosC_GteentS4FaCvp-LMI-sqe9vrz2zC1wmlw3GSxLAvDp0Rg4S0QpzKtYb3iGC4t3jY6pjfN2VZGJhYKiiIIJOf0uBSHKFOy1RE3WEeE8GzGPj0mqx7_b4RLVHOwnUgEZ4AcgeI0BSF3WkyiStJUDh1PrsxFayILjc6VdwzdHlrRrkDSRgX_DrIKvRBk6sJoMTP1DjKTujuAA4fhJtWLW3xLXAgjhAqkUXv5K5MiVoeSBdYFuD6pgPoHIlIAVXwFsq8kddckGai4ZOqs1nKRM6WuJ2qLYtuNtY6CBUzx02ZpKN8qpCgHtLeaOEhv5eap4vE-xFRhFi_uMSNNxkC2ZYeaEmt1B9BEn7jBkLHR72X2WIqckgbRyxTdZ0sbH9xbMMlHZrz9HxDcMlE0m38RdC_i3Z_CPcJvk59PI7735HqVhbOE5X9odAfyjbqXEHJ8BB4cI7xtgywWT3HRj34h45MfkJr6TIiFbDVttaVVfjQZIo4lbJmaO-M6bU0lbQKFZj_FUgAtE6w9H5pTHm7K7dJ7NHMeWl89PlBViYd7Y0Eo5KEVtypRO41hoe5OZKAws51M6ZZ2evIvWx9z263BNpwkW5qLWi-CQiEaQHxXCncg4XjOKMtSVzs_XpMZnRCwK1Q=w1920-h841-no?authuser=0' width=600>
[[Course 1: NLP with Classification and Vector Spaces]]
To train your logistic regression function, you will do the following:
# Initialize $$\theta$$
# Use in sigmoid to classify/predict
# Compute gradient
# update the parameters
# Compute cost
# cycle through 2-5 until cost is good enough
Usually you keep training until the cost converges. If you were to plot the number of iterations versus the cost, you should see something like this:
<img src='https://lh3.googleusercontent.com/C6-M0AnIzYT0BHvQowGMuRtISjA1VMuIqL2RMLXtXJg_eWxWtkL475Wl3bn6a6IQaX3dGlBT-TeLd5i6eKgIOKoLcYyAvffHRKm4N3JeiBGkdJhJ0F1p5oXRpOLyRkpU7a1UGW4uD1DxJg-YCqXzdmpQDmcSXfggtHo26DGPw6qLKeTELCqHHA_BpH6PHZIfbF7XtjMS4_s1xxbNl2dPZpH83x_ZKFl86FDxWzcmIlBWpdW7iFbe2Yh09SMbddeiRqPPecZqLcfHN3lT-qPKI4lZnMtpViKgaA7sNztH6iGHOf76J67DXyHtGHXZKXJSEM-62GO3EJnPjL7Cy53FMV9u4KUMGJcRFCoIqGOZdR3xIJ98YsNfU8nctxBUmvx-Bc2mPFZw_J1T3Hv0Iqb-bOxKf9g_Em7gNCRb652iPjL2EyodmWX0tUiGVoR6xKk_tZw2TA-pM25oHuGWluGNO98pzH2CZpIRkSPuWScnZbd5wq_Vb8AvkVISdNyug0w1fKvnSkffUI_hbvY5DiN2z3Kk2CHbSkPM8a1eke3F4aeGhQw8r3ba7VmpFJR3Uf_wYQSXKe5kCJI3AJV09sPHFEm9DfMDTcU_KRDq5beaiU7usAPfNGDLuL9uzzlkQRl8yQqcfKgbKJryHMq_hICQBaWsbse7bTq__YydSg0Sl3zc_SJl1QDpfI8XcP18T_idd7SRAM5xXLRRZWj3teqwTKYbeg=w1410-h904-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]]
,,
* Testing on data set aside - Validation Dataset
* Prediction output >= 0.5 then 1 else 0
* Compute accuracy using the prediction output and actual y of testing data
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
$$
J(\theta) = - \frac{1}{m} \sum_{i=1}^m \bigg[ y^{(i)} \log h(x^{(i)}, \theta) + (1-y^{(i)})\log(1- h(x^{(i)},\theta)) \bigg]
$$
Explanation is similar to [[WEEK108: Binary Cross Entropy Loss Function]]
<img src='https://lh3.googleusercontent.com/NXkxmCom8ERfPGT8_0S4ixmcNgr1xHaT8mRb8WJTWQhUcnO6KH8RBT3Zm1Z9V5XS1XAyJZCBydL85phS8L3mq9JLErKeSx4cG_zIbusH3Qjq4b983kW7zUwBOINy42ZzXUyWjoL9ZJhraL9VlJOpRAflqn_1Gng0jZY_CMWV1umGMB0wYleMommLy3SHzOMQm_JHEKzN74ppoSya6-T36GlSNefB7zgYEl4I6S1c3W6SZEYrr45JvouyKgGAJ-0UBp38hAC76Q_NnFTrKVbFkg935G59P2ErKmPW21gk87lvNa7SS6l2DGj2Ia7uZab6k5Z83jU73HcVxAwf2bPuzs2pgDwLAMqEDxQp_WLCeoimWfgGGcQrt6AQm5pXtuEODeriBVTJurDHpSeENFxITpZjv9AxDIR_7V4FOmU2jXPyZbHGKlbz6X5hprJratDhRl5wvJZqIWheAlCMkWiX6Nj9GY3FTQg13sSBx-untQMW5gmtZmrVBESGB5CVl_pbnW2dtNVuV4BwVj85X5vBopFYTrIf8Y-7zuPrXNlPUzTSvRdRUBF0HSTybkYrtvu0hWjMAlHMqezX_xm-LZ1yYlDmchl84xR-fLjozfelPKJ0nRM7pcYwNYT9JRH0Qrf8hx9yJpoGfXbhaFErvoBh657OctKSbblfjCKQ6gne9awvUy_V5WkU4Gf2-sTioq-L-OaDKKM86McQvVFm576Yi5AwPw=w1920-h731-no?authuser=0' width=600>
!! Math Derivation
Math Derivation
To show you why the cost function is designed that way, let us take a step back and write up a function that compresses the two cases into one case.
$$P(y | x^{(i)}, \theta ) = h(x^{(i)}, \theta)^{y^{(i)}} (1-h(x^{(i)}, \theta)^{(1-y^{(i)})}$$
From the above, you can see that when
* $$y = 1$$, you get $$h( x^{(i)}, \theta)$$
* $$y = 0$$, you get $$(1-h( x^{(i)}, \theta))$$,
which makes sense, since the two probabilities equal to 1. In either case, you want to maximize the function $$h( x^{(i)}, \theta)$$ by making it as close to $$1$$ as possible. When $$y=0$$, you want $$(1-h( x^{(i)}, \theta))$$ to be $$0$$, and therefore $$h( x^{(i)}, \theta)$$ close to $$1$$. When $$y=1$$, you want $$h( x^{(i)}, \theta)=1$$
Now we want to find a way to model the entire data set and not just one example. To do so, we will define the likelihood as follows:
$$L(\theta) = \prod_{i=1}^m h(\theta, x^{(i)})^{y^{(i)}} (1-h(\theta, x^{(i)}))^{(1-y^{(i)})}$$
The $$\prod$$ symbol tells you that you are multiplying the terms together and not adding them. Note that if we mess up the classification of one example, we end up messing up the overall likelihood score, which is exactly what we intended. We want to fit a model to the entire dataset where all data points are related. One issue is that as $$m$$ gets larger, what happens to $$L(\theta)$$? It goes close to zero, because both numbers $$h(x^{(i)}, \theta)$$ and $$(1-h(x^{(i)}, \theta))$$ are bounded between $$0$$ and $$1$$. Since we are trying to maximize $$h(\theta, x^{(i)})$$ in $$L(\theta)$$, we can introduce the log and just maximize the log of the function. (We are maximizing the same function just in a different space). Introducing the $$\log$$, allows us to write the $$\log$$ of a product as the sum of each $$\log$$. Here are two identities that will come in handy:
$$\log a*b*c = \log a + \log b + \log c $$
$$\log a^b = b \log a $$
Given the two identities above, we can rewrite the equation as follows:
$$\max_{h(x^{(i)}, \theta )} \log L(\theta) = \log \prod_{i=1}^m h(x^{(i)}, \theta)^{y^{(i)}} (1-h(x^{(i)}, \theta)^{(1-y^{(i)})} $$
$$= \sum_{i=1}^m \log h(x^{(i)}, \theta)^{y^{(i)}} (1-h(x^{(i)}, \theta)^{(1-y^{(i)})}$$
$$ = \sum_{i=1}^m \log h(x^{(i)}, \theta)^{y^{(i)}} + \log (1-h(x^{(i)}, \theta)^{(1-y^{(i)})} $$
$$= \sum_{i=1}^m y^{(i)} \log h(x^{(i)}, \theta)+ (1-y^{(i)}) \log (1-h(x^{(i)}, \theta))$$
Hence, we now divide by $$m$$, because we want to see the average cost.
$$\frac {1}{m} \sum_{i=1}^m y^{(i)} \log h(x^{(i)}, \theta) + (1-y^{(i)}) \log (1- h(x^{(i)}, \theta))$$
Remember that we were maximizing $$h(\theta, x^{(i)})$$ in the equation above. It turns out that maximizing an equation is the same as minimizing its negative. Think of $$x^2$$, feel free to plot it to see that for you yourself. Hence we add a negative sign and we end up minimizing the cost function as follows.
$$J(\theta)=-\frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log h\left(x^{(i)}, \theta\right)+\left(1-y^{(i)}\right) \log \left(1-h\left(x^{(i)}, \theta\right)\right)\right]$$
A vectorized implementation is:
$$h=g(Xθ)$$
$$J(θ)=\frac{1}{m}.(−y^{\mathsf{T}}\log(h)−(1−y)^{\mathsf{T}}\log(1−h))$$
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
!! [[Chris Manning]]
<img src='https://nlp.stanford.edu/manning/images/Christopher_Manning_027_1154x1154.jpg' width=250>
* Most highly cited [[Natural Language Processing (NLP)]] researcher in the world
* Professor of [[Computer Science]] and Linguistics at [[Stanford]] University
* Director [[Stanford AI Lab]]
* Worked on [[GloVe]], [[Sentiment Analysis]], [[Neural Network Dependency Parsing]], [[Tree Recursive Neural Networks]]
!!! How did you end up in [[AI]]?
* Undergrad Computer Science, Majors in Linguistics
* Wanted to understand how do humans learn linguistics at the very young age.
* In Linguistics, in 20th century, [[Noam Chomsky]] - had viewpoint that - People can not just be learning language from data alone, there should be some sort of machinery in people's brain to learn lagnguages.
* Started with [[Machine Learning]] in 1980s - almost no one worked in at that time.
* Dominant way of doing NLP at that time was to hand engineer features
!!! [[Neural Machine Translation]]
* Laid the foundations of the modern [[Transformer Network]]
* Built [[Machine Translation]] models for decade
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[03 September 2021]],,
!! Probability
* Corpus of Tweets = 20
* Labelled Positive = 13
* Probability of Positive - $$P(Positive)$$ = 13/20 = 0.65
* Probability of Negative - $$P(Negative) = 1 - P(Positive)$$ = 1 - 0.65 = 0.35
* Tweets containing word happy and labelled Positive = $$P(Happy \ \cap \ Positive) = P(A,B)$$ = 3/20 = 0.15
:<img src='https://lh3.googleusercontent.com/bA4krtqf2ZfuyGBpNFxhgrwovKoYNVfaFt-UcCdKdtL7vaj8y-EDjrQYt8iBL1JrZ37-alPk3M0Lc_LImecb01MrWg7YUZX6ogiIXjKVMkVR4HO-Zbe_U7eqn66XaYuD_s4nbHDTKbaNsuX4jmr14rD8K1AhXWCXDWYsdIAkoou1E98sUs9BBuZxo0984OLh_Vo-IDdZxFoOHtc7Tr8LBzcanny0LDynIHMInZypS-CPIzifIJioSrvjfXtGnwP6K2TYN2q0p-jKWfS1kN1Nt5TbM7L5u1vwdU1ei3kC0T_4S_Sjm3kFqNjQ2KVqd5qh8UJR7T0y4Zn_-YN_wfoEx6HgItCOABRbJPwt1geqHLyMw_E8d217NcIDyGvLfc1YXf7wpEdowV6DOoKhLeEswlqLzSU46yyr89JWND8zznfAdBTSV8cv_0NQ1G-VwBmyIO-ijLhtiOKV3q8SQFEaTOek17SxEW5nYUZ0PhvPkCRpw_KoK2t0McsiHLAPKKG2uzO3hIAL75wQTuxMLK3AksP9ppyC-c6i694TTY3RxCGcNxI3wB1ICcMEazgIoQUeo-Pef71quji-WIu8KGjiTIWwADjG4aKatJtWroWdYw9HEI7aH_36kb_i4jB5joaEzxprjcxAaWEF0htJvs-5qSX-xhFVxQTOG2_VOxDYHCFHUP0Ee9a1Z3G9iXRSGVWJri0VNyme77nIJNQ4UPQLgz0dQw=w1920-h667-no?authuser=0' width=400>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! [[Bayes' Rule]]
Conditional probabilities help us reduce the sample search space
$$
P(Positive| "happy") = \frac{P(Positive \cap "happy")}{P("happy")}
$$
$$
P("happy"|Positive) = \frac{P(Positive \cap "happy")}{P(Positive)}
$$
$$
P(Positive| "happy") = P("happy"|Positive) \times \frac{P(Positive)}{P("happy")}
$$
In simple terms
$$
P(X∣Y)= P(Y) \times \frac{P(Y∣X)}{P(X)}
$$
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04
September 2021]],,
* [[Naive Bayes Classifier]] - Quick and Dirty baseline for any [[Text Classification]] task
* [[Naive Bayes]] is a [[Supervised Learning]] method and shares many similarities with [[Logistic Regression]]
* called Naive because it assumes that the features used for classification are all independent, which in reality is rarely the case
!! Classifier
# Start with two corpora - Positive and Negative Classes
# Create a vocabulary from both corpora combined
# Count the number of times each word appears in the positive and negative class
#: <img src='https://lh3.googleusercontent.com/YmXkKnpkdvReNhQvoNSUtBlCw6DwBZ4AkyxrLDYQ2wfgr4SZV7XwNh6ckLOjkzPIPDHEZRVuJFv96GWdHibUYEc9Kj7ag05vbK56BPo2sQWUGn-_rFSYDimllnzfsMxH8ZworSdeZorQFczertbGtSdFZ460sBoHpU4_QjL1jFvK4Wuz2pvO0Jv178rcUSlXQbVMsrMxYK_HI4pOMhe5Jv91ISgFRfbs8ICu5HMKvboN876uEVdrQ_FOTOcKOFbNvyTgQE5nEyZgNEqnNhvPK4vfZLwH8BEyQjHvzZL2ngR8O4dOD7OSzi-Xyk2AGoDbWLbKplT2wC8HczY2k1qsz_qEsgESa-15ZDHIjWaW7_rZHzd85Vhe8hJ-paOrQ2sojPPUqzW7U9UOWnWnezpC47bErEC-GPWPybMDFzkPUpPcC16a6L-7ZY2aSYjfCCet4TlZ6S43FZicjw89yNL1c8nrq1GbqwPHaPd8cydKRiYLbQMjNTF5cFcfAY5mshjouflxn5ylcvm9z1JxDkhVZazjYyydciizLs-rej1xVVmmHJ-pG9ycWdVFMtjAKjS46iBMk3xy9GtkJFkeQE7VESJtGU1G_K2JbyAWetVJZU5A93zCSDv3G5YvjE0TIV9PIck34ykJ6tW0BcOn1vhMp4EwQ67wautuKYH1AdkiPaWphyapBNbdK9sA_uYx9tKv7LA_8S74zni66vr8HSPKcAFutQ=w1920-h863-no?authuser=0' width=500>
# Next compute the conditional probability of each word in the positive class by dividing the count of that word in positive class by sum of positive class. $$P(w_i|class)$$
#* Gray highlighted words are nearly identical conditional probabilities, like - //I, am, learning, NLP//. These don't add anything to the sentiment
#* Words like //happy, sad, not// - have significant difference between their probabilities - these are power words, tending to express one sentiment or the other and carry a lot of weight in determining the tweet sentiment
#* The word - //because// - only appears in the positive sentiment and so it's conditional prob for the negative class is ZERO. When this happens, you have no way of comparing between the two corpora, which become problems for calculations. To avoid this, ''you will smooth your probability function'' (?)
#: <img src='https://lh3.googleusercontent.com/UUGXkxlnI4QnKOMmkL48qIzys0RFDfy2PRVFwR3q2wMHx3fYqtig-vlzbbs7WIstohpKiKnmBtSJx5z0PkqwccuERPr0gAHIb7AXC-xZW_T0SU-7HyLLFOugaXgbMiL867j8zF75I3rQaKu2Cio5VwZA0e4JuL2rMjXYMP3WhcVoT0Pmxms16-umAv2XQp_YDy9vJiaWX8k2Sn5VET-vuKxNxTcK1uTr4QYkzSw4-mr_tYqhGUBhwQ9dfgvpaNlnTX8Ii-r9YaPM5ERSr0G9vHzUwUbkhKoPwysPGJ-Ya_1pzrIN-DwIypdXjG6UBRHcHFwmzPDSsee7IYYWL08SWLakuVBsVvwF16sU82mpag1nksQOQtLZNembRO5ZYZ9DcynsVyr6lVGRzqG3iLSqtxoq9xRdUMCZRZBTC7E4pa7Y28neXSBCBm_3K45cNt2ykcA3KKYwUWC7XXgN-db30SD1YAbL_EATc2Szbk0Np6EGWbXt982fNWAOXkxQ0yBMQqJy2mRt1Voi6WnIqsM7bpRYighUMpj8ZvHDUulj_npe_P7GybMtxQPdOUDEkPDPlxF55dxd9W8nSN0SK6CwiiVEZaE6pIIs2p8FKjpojpvFU1ffCj9HJXKoBU-jFtZcwtcWiHjW0HU4jX2ji4cSO1rappTjDofpfpRkeP1kATaMJGLjMq1lV_mKf5SO-A_Pz7CIGHY8bFa71XCz4gaInCCZwQ=w1920-h756-no?authuser=0' width=500>
#Naive Bayes
#* Tweet - `I am happy today; I am learning`
#* use the table of Probabilities to predict the sentiment of the tweet
#* ''Naive Bayes' inference condition rule for Binary Classification'' - take the product across all of the words in your tweets of the probability for each word in the positive class divided by the probability in the negative class
$$
\prod_{i=1}^m \frac{P(w_i|pos)}{P(w_i|neg)}
$$
For this tweet, product of conditional probabilities for the ''words appearing in the vocabulary'' will be taken. Neutral words cancel out and the renaming words express sentiment. Here the ratio is > 1, that means this has a positive sentiment.
: <img src='https://lh3.googleusercontent.com/jpencC1WL9aIAAbuw7f5JsjsXyJT9u9HM96WFgl7GtImPCqPAG4mnzm9abnLpjlIMd7hxJOOMcp3eXHVYibuBnDdeUU290eh1dQJrIfX4MAWlyrvweR7zhEmJyxwf_r7AaW7KYxs4nJjGifR7z-AKyMmDC_iMIs1uMCvYBxAaUzorr0Y6RYIfVdWSZi8I0rvfRhGNyMDJqyO2Q8jMok-pyzAAQT9UhN-wb32McP2zLweJ7uoV_eji6p2BxjHg6Z4teTJWV6qW0eTXzhsUHrJl0Un-vahOaFGJGbqY9Z6-er38O-NCHKgC29MLxeuRt5B-8xWdoYYgDbn3GmIlc-OdOkc2wxs5FNj3xzA6azDp1nq2jki6DQZ3Z2XlW-n3K0dirNUhny7CdYZCpGNEsLW_teiFStFIb8c0lsm3gnKTOpaxSUeSuF3lc692tUsSuxV6Ia-Ew9VG1P-251fmDUTSd1LzaEhN4QklZWt_7hLZ6396fIpeALDpH0kchzx6B5Zc3W76ZnYlzkKBSXJbaI6W10EAm9vaWjzdouL0D0hL5OXQCh3VIhC40mbLwRNXNr9NpubKtwBTgfcoeLjgdAuH7looYZdwSGzGap7a1BBCTcjkC0PYSWnyCXOA7Aqe2-eavGXpn3HxswTOHzdtLElF9xCnSDTPR3XaMymYV1iNF6rOzAoQXmiK5J_9odlMeskyzBvpLEBXwqyj5CPgVf7H4VW9Q=w1920-h727-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
[[Laplacian Smoothing]] is the technique use to avoid the probabilities being zero
$$P(w_i|class) = freq(w_i, class) / N_{class}$$
* where $$class \in \lbrace Positive, Negative \rbrace $$
* and $$N_{class}$$ = frequency of all words in class
''With Smoothing''
$$P(w_i|class) = (freq(w_i, class) + 1) / (N_{class} + V)$$
* where $$V$$ is the number of unique words in the voabulary
* $$ + 1$$ in the numerator avoids the prob being zero, but adds a new term that is not correctly normalized by $$N_{class}$$, hence need to add $$V$$ to the denominator to account for extra term
* The probabilities now in each column with sum to 1
This process is called ''Laplacian Smoothing''
<img src='https://lh3.googleusercontent.com/I03eKUJA9GZHZgkBtp9kVuNwkj7iu7I8TviL2IyNqfWfBADLTF4SRyVdX4GIgmSB2yfyDMrpYmjKdE7Kcau7vY-OTYJCZUMemGx8P89WtTq89I_rlSXkn6_FQewKC1gtD0rkY3tZxPAaNg-TJs6OrSKaMsP67nrvgOHxYu3eb-HDWu0F7KPIg3SSZe1wr11LWmwYHl4_UHpXHDXrcz5o-tjphF_U5yacWDzm8hTHXtM_UrZm8oMqoHceGWHLtvCXXnH-QEtHP3gNTDQaZhQropjHOJ_KTtZZflhqqfvFAuuzzAhHMG6niHce5sZW0Fg3Q0KGaE-JFYQBfgAW_lwspDlZ36dS-yrfFq1MXN8Ra9o4iX1PJiZ0mZZWK_dkjuwP0LIY4Bf8d2zRHwUnJkDpmLwd6rVkm75vwZi8R-wZP-6vy_3HY8xiB9X4_yKEvYDYbb9mHzAZJTj0NCgr8Q8aV1Dlo_n4p1w0Kricc5hKy6z2Zeb_DugLbtPPAWd8qvDDZiv_JIhA72I9jhlAOnOUU7rKpyNLflVRpW-DLxb9a4YKKjpzjhbHz2yhodg_-g7a7uYM_prky4muT6qOAYHD54YMi9bkeo-7Difox8gBu_JivjmpEhxqyEB2WMGugrwYFfMAj7ytvOkNgLEuhFP2gC3BkAU1oOS1cwr_tO4jWNysi0Yek_yH0a45I4aKz2cqsKJS5xDQ9sMwPgiKWQMsOb8oew=w1726-h865-no?authuser=0' width=500>
Note that the word because now does not have 0 probability, and probabilities in each column sum to 1.
<img src='https://lh3.googleusercontent.com/FWx5EjQj0WApY1GTKBO6wmZIidZW-K1ajJFOPYGBslJ_NY98Q-6nE7UqR-2fIrjE2BnsfiyIc7BktNUCZkleVhG0vBCYpjU6uXYf1-zB9pV2EGS3n_bHTWvPb-sXQsiNC-QLeIq4kuTEdM-bRKsQBTxcK-E6ljfzsRmYWxfi4Uum3b0QKTTazABZ_1fm6lJ8gJQgAXFcRcPtUnbVt-4zfJF_XQBHFrhP32UCSe6AkOuhPew8cjgoP1jyuh26KuK9JoKnj0Di0CMotzjbNCf4o0o0Py7wpryN1HpDf5Ao2xx89vb3VTc8-hnvtCgZdw09AfZ1q_sxfP7lmiVhOWA6aT-wWRbo4mxxtH8g1Yw5xtMij--b_J28VAlNF5yNKAJaMc83waIYe2m6BjPArmz2bkHCAJuzOEgpx-nunSdRyhBd9rzu94sr_3yTuM5zOWPgkZ2L4AiQEVtuQzpwPLEE2wi63fm1wxK-dwxT_1cds4tntlBb1Lkjbd0rnb0REolUa2M2oy2Rq82f22lEGYH4vOo_ia8ekdA_CYR5-6FdMSMw8U3n2QoDdmVRzDFKMioT-b6nwjvxfSFEG2OUPU7nnCzWMn5C0AkOh-QHkyhOBpFqjsRuBioZ_ZTi8JJ9WrnEexis1fw8Jp-1YxQaurV5MB89-2U8_tX83mtAshSLOIiOAEIVq8iJatkHDKfk151oN3CGrfJKfJ8XMC58MgFuD6ESDw=w600-h737-no?authuser=0' width=200>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! Ratio of Probabilities
For the purposes of Sentiment Classification they words are classified as positive, neutral and negative sentiments.
$$ratio(w_i) = \frac{P(w_i|Pos)}{P(w_i|Neg)}$$
* Neutral words have ratio =1
* positive words have ratio > 1. Larger the ratio, the more positive the word
* Negative words have ratio < 1. Smaller the value, the more negative the word
<img src='https://lh3.googleusercontent.com/ighSdPxbMLNiT6THF5PeI4T8cXOFMIqpSswyUxPJUAV5hGQoE6aASK1byDNYAJtqCj7IYJJVy4f7Rfv4sM0stIDQvFXtY8kWif2JLftuAvPU5IML-CPwdzwkHwcSLhpyhVt2OUwOagdApt8us0h5rDtvgdtbi7qxdK_6FTLDMRylZ2O4708mMb0DV4RBD3q0NYcvgz1SVgNxvUhvWZVIfuF4qlSzf1Ebhs5v9Oncw2cX_ci4aRigI--LUeod__gFXem8EFvOhpkyfwq2c_fFHhQ53BqWWLIyrcHRq14zsPNGzzW1O1MGdNPNoEcaNNZHkGcXgZeJ9t546RV-1NtnnQOh1siLWokdztMRxLyHYpGFQQJ0efau-LpFnKI9bfM6DZSly0e_ZHXHULgKmcF0KLp7BZ68PQJazyr8ewuYD2CawcQTyGqoqEuyE3MmeMjh_y49tMNz5HuJ7vVFzMmvfAsw1F_kTwsDTCI782PMAW97geMI6e8w4oFPrL4dsdf9iupPrwh06FzZjN2pE6gqnmbAbTmKchV9mPSXvJE8IRM_5MU6MOk4MRodsdKRgtXC38HqJ9GB_yeASEKdu6Z7hulIgeewT_CoT8rdv8m50OSqQ0deUNe_7YEQheJC4mlRJSL9hty-N8Mnhq3nvtJMFQaM-RWz2waiBTVy8bqXrdvSLiOvRqjG9WzH8EzWmALqkUXPISzPEQEoC_ksdEW6_7bdEQ=w1848-h716-no?authuser=0' width=500>
These ratios are essential for [[Naive Bayes Classifier]] - because these are used in the expression
$$
\frac{P(pos)}{P(neg)}\prod_{i=1}^m \frac{P(w_i|pos)}{P(w_i|neg)}$$
* if this expression > 1 then positive
* < 1 then negative
* =1 neutral
* $$\frac{P(pos)}{P(neg)}$$ is the ''prior ratio'' becomes irrelevant when there are exactly the same number of positive and negative tweets. It is relevant when the classes are imbalanced, which is usually the case in real world dataset
!! Implementation Considerations
* product of these ratios are prone to [[Numerical Underflow]], where these numbers become too small to be stored in memory
* $$log(a*b) = log(a) + log(b)$$ using this trick to use the log of the score instead of the raw score to prevent numerical underflow
$$
\frac{P(pos)}{P(neg)}\prod_{i=1}^m \frac{P(w_i|pos)}{P(w_i|neg)} \Rightarrow \frac{P(pos)}{P(neg)} + \sum_{i=1}^m log \frac{P(w_i|pos)}{P(w_i|neg)} \Leftarrow log \ prior + log \ likelihood $$
!! Using this method to classify tweets
* log(score) = $$\lambda(w)$$
<img src='https://lh3.googleusercontent.com/0W6aTvUfD68kCQtXpSxF0BKVjKESJbGhlRZK0btuvffkYl9mWoTX47AvBvg6_nbNXoSNjyUCdCy5GQU_C1yQHKf7OftANSCq2krripcnInBn2rP3T1axZY0srBiGK1InZoXUzZOBElGfdQ63UCspT7yRPOW_Y8bVrywC62cJuDGby5u7psC0qm3VFnMGksDfAagAxAxae6vcNpCaLFfQ7XUZd2QUG8OUFtQelA3qKE-WYffkDRovI46ty0OOAU7oveOS28-MnPRmDZv4dWMUhGuvjEg74gikA7a4ivJ4dUafPJudBtfy7RPDZsKGMjH4NcPVsiW7SeZLMuNY4m9hLskpxk7_oPQHrUYTm-ZEBApFWqHGKXpUvr_kPJKS9P5t_orZFt4Y8lfyRHZP7NkbOxJ-14nKrfmJxvRrAE-mkTSxDsr8jWbdH4N7rv0AhsQ8nQxlA82YfgCiO36IokQjItVcYAazXslv03GGzU1h51ylONohxoKEpzMOecImDI7LQyVJDrZTyUV_AV-_TWOy2lG8kzmPGk_4Cj-Kvb5VLS-0QbeUGSJ6x1_7yjV2vrkV6NJPRbEayzIcKgyNUUvmdtV5YCnpHr1QydxNyg4DmPe4u3vHrv6DGbHtTGyCbzPH4ugkxhqT3cI1phu5ScE0H2upTYsWq5G6C7G1zkLYmE6iQYvRh9p66Jbu8uaCR6TeOn8a1bMFLrXZM8poJ2rIuCQzeg=w1920-h738-no?authuser=0' width=500>
!! Log Likelihood
Tweet Sentiment
$$\log\prod_{i=1}^m ratio(w_i) = \sum_{i=1}^m \lambda(w_i)$$
<img src='https://lh3.googleusercontent.com/sZeXkWaRNWCrQQkTDOwt6hp8mUGXct-hABSKMBDjhXLYltw4M9pDqUvvMe58nmE4jBnN9eP8t3sCoo3BuUyUzvMgoH1ANyS7sAf4Rrp5CcatpNse9w1Hi2lHZe6ks2SBgHf1T2OislCApKgrHE6_NhF_m2Xj2E2522XxkSebqzg79xGsx-3lOWAhcaNF01SiLH56zwoDoMjgcu0O26oj5ahq6DH5EWl7M731hDA1WImkevw1UjDDDIo_92UcpBjxvdWrUpIjgBmRfGarH24FVFsM2FEZz-tbc9oL9eSFA4ddrtNTzgeXGlrpeoZku87LOoqjlf5KrwAY23k_xjF4aQ0DJKabH6x-4zw4bcR6I_beoCyKQoSkeyHTTPpqqqNyJlivpGgTlw6jo-eEngeveve-CQmRfDsw_c1dj2Vm10t7AVNEDBfadLlfLUv3NYL9ZwXr_M3iiWpYzj11seJ_obTYfLFEc2jX1CkhYvNLlE4B0Ue64Qejzv-nKrgiP8_3294puomWXn6DpgkjBOzAOztOHyhyvm1W8Isa2MI_9tN9S-bLXOx8luvGc_AwVdE_-c0g-v3TaeujG32pgZF6ah2ELssi3DVmIHrTVLLssxXrauZIop-XEwFyJO_pSVFcehqT5ZNgiRmYRcH2o99OGUw9fb13H2EBU9DzuACyWqz_MXQLmIdWLEdvfbScrjg92z17vliLPc6AYaQj0wKnoUV0kg=w1920-h755-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! Training Naïve Bayes
Training in this context is different from [[Logistic Regression]], as there is no [[Gradient Descent]] - we are simply counting the frequencies of words in a corpus
# Collect and annotate corpus - and divide it into two groups (Positive, Negative)
# Preprocess tweet $$\rightarrow [w_1, w_2, ...]$$
#* Lowercase
#* Remove punctuation, urls and handles
#* Remove [[Stopwords]]
#* Stemming
#* Tokenize sentences
# Compute the Positive and Negative frequency for each word in the vocabulary and generate ''Table of Frequencies'' - $$freq(w, class)$$
#: <img src='https://lh3.googleusercontent.com/ZZ-qHIWbV58JBspy0TaB9glgjuhaK8kISZdV6f883DBwyWRpz4-TLQ3HQMVTQsuwvsgiUPe86BIqsoFWK_Qe0RFK694K91TDfVcsihdbQoiImbPaCdRvBywd37otJR0WDc0Ukvx6g2QrLWcST5ddikOTCuqbXQlpUPCB5jKqFL2TukChpaAGp2lWsUNGuEyoQNcGT65javwB1nutY4WWXHI7rlv685OjlUc20vUbxSXlpDfirHgV5F3jCUjFdhlABkJhULHipMtktKY9S4aMJ2G5O0vAWLVj7pzvK9Flbk4JM1aQndyt0_DV_OJ7PDHB40SpTZWzQPnNhhm-goG6rgLfrCENWKDcrLaLVQJshVuHObvuzeGkYKdBtSLVMpLZe0WYYsQ2UVd5UxSi1oJW6jpUMlL6lrqJd_xgwi1wEjYLPeyFYyRsCYf1FrAKuWc_t55ufHs59EfImt0icZbNL16UP9ftw6oexATYy-LmHV9VRkYgBK8g-OT3ZS93VZxl2bLpgKIXiK__G5xwnBFr9_uKPwfpANXlABOlTiU4WMZtXKMxNZlCnQyiZ9f6vpCnq9PQLKd0nf3AgyWXgGUzYdEX6vr0jhgF_B75ltbNRTtJoczGCTHZUw1aEAnQGHjAkFXYaA4GTVWIbQYqviUbuRF_XpwftaINh27ORalVvV3KpWa4ci1fYFoyvStdYrTnZ-P6C5Nts9R_fc84-pcyT6qziQ=w1920-h777-no?authuser=0' width=500>
# Get conditional probabilities using Table of Frequencies with [[Laplacian Smoothing]] $$
P(w|class) = \frac{freq(w, class) + 1}{N_{class} + V}$$
# Get Lambda for score - which is the log of ratio of conditional probabilities - $$
\lambda(w)=log \frac{P(w∣neg)}{P(w∣pos)}$$
# Get the log prior. Count the number of positive and negative tweets and get $$
logprior = log \frac{D_{pos}}{D_{neg}}$$. When the class is balanced, i.e. $$D_{pos} = D_{neg}$$ the logprior is 0.
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! Prediction for single example
The example above shows how you can make a prediction given your \lambdaλ dictionary. In this example the $$logprior$$ is 0 because we have the same amount of positive and negative documents (i.e. $$\log 1 = 0$$).
* log-likelihood dictionary $$\lambda(w) = log \frac{P(w|pos)}{P(w|neg)}$$
* logprior = $$ log \frac{D_{pos}}{D_{neg}} = 0$$
* Tweet: //I, pass, the, NLP, interview//
* Score = -0.01 + 0.05 - 0.01 + 0 + logprior = 0.48
* pred = score > 0
<img src='https://lh3.googleusercontent.com/nHX5OOJo0vVbe_mz6CyXVjWKnH4t2sKs5fQ8OI0QH_zGIochWltFRdJP-j-v4GBzjPC6TRYx_NpdN5Ir4xh4P2RxlSvMgaYtvI03vTR2t1Q96eq29pQk2WL5TjgmW_hCaI-NHC2kaNVhuMjL-J2qhVD4E-aGeBrqVj5QlAKTDL8bl2CkSANi9jUaHrZ8b4SedPp4j88fdnX7blJNPch26JRELMlRnjeJemFkDae91CvM04eWP5zJDU1FJ7B4e6Coo7HdizxfI0WeDdvjBSZffIcv8mUAo_DUdvQTF8iQJ3-Q3MAywUZ2ciyTmlpz8DwSmCy1l7RBfuhxHTB7C6DFFi49YfWgIqISA97x_jJrDlv5iO4_xvCso7WGbk1wC-2sNgP4_c08WDIKkXcEjF-TEnG6aySwNad-Yg6nRSxv4dTWK7WYjkOOn9njmmGEIC1A1ZJW420z7ju4qmqJvqMJMWSf8g68BJTxxEIQWYOQGF4OUO4OjYjYodLq3FOC235DrJdfRqvLBzqLu3NeFOJ7OyZbgQrXnc633SaSJUOJ3qT6D2Xj_i3mIBv-m6AYwuBbu28WHl72C1tVNliDY3Q7wERKJvRLmzs3e9jG1S7BRZTtnI5I_vd0fSWXfOfzr2TAi3nO1MrLTqXZkJjjaAEdFyXPdN3IflpC-UR2ToorgTt4rfNcGIW1sgzB-xRWmSWnO34ss_iDvvTZ-qrbrY96EA5QVA=w1920-h787-no?authuser=0' width=500>
!! For full dataset
* $$X_{val}, y_{val}, \lambda, logprior$$
* $$score = predict(X_{val}, \lambda, logprior)$$
* $$pred = score > 0$$
* $$ Accuracy = \frac{1}{m} \sum_{i=1}^m(pred_i == Y_{val_i})$$
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! Applications
* [[Author identification]]
** two large corpora, each written by two different authors. Given a new document, you can recognize it was used by one or the other
** This method also allows you to determine author identity
* [[Spam filtering]]
** Using information like sender, subject and content
* [[Information Retrieval]]
** one of the earliest use case was to identify relevant and irrelevant documents in the database
** $$P(document_k|query) \propto \prod_{i=0}^{|query|} P(query_i|document_k)$$
** Retrieve a document if, $$P(document_k|query) > threshold$$ or first n results
* [[Word Disambiguation]]
** this means breaking down words for contextual clarity
** For example, want to know if //bank// refers to river bank or financial institution. To disambiguate your word, compute the score of your document, $$\frac{P(river|text)}{P(money|text)}$$. If this ratio is > 1, then it refers to river bank than financial institution.
This method is usually used as a simple baseline. It also really fast.
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
[[Naive Bayes]] is referred as Naive because it makes assumptions about the data
* ''Independence'' between the predictors/features associated with each class
** In the image, below, sunny and hot may go together and words are not independent. While predicting for a new sentence, like //It's always cold and snowy in -------- //, it might give equal probabilities to spring, summer, fall and winter, which should not be the case.
*: <img src='https://lh3.googleusercontent.com/ZuWBDpCJO89NF2qSgNmBKPqsYzWwfmOq4aP2YkidR4HhBj9bJluTpiojkSOmc_Kopbw6UBTLNdv5WaPloMdkhnqgsQ6htog3Eztt3Ot3keb-CUUaIJHtr7AywOuc_L-dl4IEtaqUZ5hjzrUu9EvSYiGqDjwelOmrHZgZCdp0CIqmyM8ge2feYDcItiQlXhK4pqglVmF3NSjbA5l5vyeA9we3gwiwTPsGXLcPxXWK8BTxjdj1mBx3yLUhsa2VtaDfwh5vvxF9B3DEdI6USsX3myOlht-k_x1NtwngZ-gIwPVi3cWy3_o1OvBkj1vqro17ehDGcdZD5G0glPOquC_ehDHbzgnu6kgkJcX3gnvSv4GbTuTG-M2CWskI3_1HtFrlUyH-Ke7Tyx9VUgj07pOaeGE7osRITO9g-NvXfD26rljEKFdk5L9t2tViCU1Fw075EcDyrrp2ICM02vHBfAIiV1SwfU1HNabR1wzhUyNNTR9OLuoape3QAoI_DJcD7ePiBS75A-sK-RcKltD-M9HiL1VjOFuLu_VbhZFCqT2JrdyZ5xVEBGE00yi1syz7tQum3ewmCmzOcM8fnMwrlTVka9qilvVOUeiF_XLf3jytrpSFD2l2sHtPXfRXJnzMCz2Dg3zZ5lzQIEgA7dflXhHBZ6ce3V21VOYF1uOanThziqg46qHqV7osus-K0Gf2xIeEpkAiD3cLMyyYhE5vxOChyFfoCQ=w844-h219-no?authuser=0' width=500>
* ''validation set'' - Relative frequency of corpus
** Naive bayes relies on the distribution of training dataset. A good dataset would contain the same proportion of positive and negative tweets as a random sample would. However, most of the available annotated corpora are artificially balanced. In real tweet stream, positive occurs more frequently than negative - on reason could be that bad content could be restricted by the platform and muted by the user - ''This could result in very optimistic or pessimistic model''
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! Errors in model prediction
* ''Lost semantic meaning''
** ''Removing Punctuation'': The tweet may reverse the context if the punctuation is removed. For example,//My beloved grandmother :(// $$ \rightarrow $$ `['belov', 'grandmoth']`. The sad emoji was important for the context of tweer
** ''Removing Words'': For example, //This is not good, because your attitude is not even close to being nice// $$\rightarrow$$ `['good','attitude','close','nice']`
*:Always check whether the tokens after preprocessing retains semantic strucutres
* ''Word order''
**//I am happy because I did ''not ''go//
** //I am ''not ''happy because I did go//
: The not is important for prediction, but it gets missed by Naive Bayes Classifier
* ''Adversarial Attacks''
** Common language phenomenon such as //Sarcasm, Irony and Euphemisms// are picked up by humans quickly, but not by algorithms
** For example, //This is a ridiculously powerful movie. The plot was gripping and I cried right through until the ending// - is a positive sentiment but when naive bayes predicts this using just the tokens after preprocessing - `[ridicul, power, movi, plot, grip, cry, end]` - this would predict negatively
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[04 September 2021]],,
!! Why learn [[Vector Space Model]]s?
* Allow you to represent words in documents as vectors
* Representation captures relative meaning - Vector space models can be used to identify similarity between two sentences with same meaning, but they do not share the same words or differences when they do. Similiraties can be used for question-answering, paraphrasing and summarization
* Vector space models will also allow you to capture dependencies between words
<img src='https://lh3.googleusercontent.com/F46VM2Jpw2T6be9wpfGRnAKQ3v7eSOQr4LRLYhRIdLChxXxN1iC0YMHvnPIrI4-7li6kJeCGjdPmdiZnqP_wcdKIVR39gomILJppGPUTDUc8T4UbA0Ie5bm4CnWCQ3_Be5gLnq6NJKOwLvQKZCk1LyAn_r8GuNIyg5toXYWS3nrAlC6pdAPQRM53kgVbACQ0WdQkBPpQbZkWY4W9MJDrSNIx7f-mTzfv_pDB7d6QiFkcOXRcp7yXiuBJcQoWMFys8CrNND-nmnV5Tr3wu_wXK4NKp7p0SDhJ_1EW231lX0zwNtL2shvmFjYPrq56RdQnmipCwgjGjhUS6BxTRS6U0R8A-gW-92ljIALCmJxnqs51eZw1lKlsvaZqiKbBTPHUD_BNXtHibAUMRzJ2jpA1CvzcMS9iIoVgjwaXs5_TSe8CGE3Pp_YRbfXFi06oDbFs8LpMx1sagfb5rFWLSusG9NBj0rhNW5UuKjpSOwYh17eU1_LlGkYGwKR_5cmAqvNfvXDKiXxhFfn0o1AAukdfjypQJutUaMiQ05T85ftiVUxoF8TSQJY3kUPIg9D3QYxk5isLRn-wdfGMo--liioZs3V_GY8JEKnq8FXZNXe7t7RZJXvv2JNMtQJ1Eil_U7ieSyKCqypk8_XYhecsanW5Gv2Zxxwr2rEjHyjExOxE8_VkYrZkY4RLJRpuHFX3l_UMz4Jth45TC52k7d71UYHAzXAxHQ=w1920-h762-no?authuser=0' width=500>
The famous quote by Firth says, ''"You shall know a word by the company it keeps"''. When learning these vectors, you usually make use of the neighboring words to extract meaning and information about the center word. If you were to cluster these vectors together, as you will see later in this specialization, you will see that adjectives, nouns, verbs, etc. tend to be near one another. Another cool fact, is that synonyms and antonyms are also very close to one another. This is because you can easily interchange them in a sentence and they tend to have similar neighboring words!
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
* Construct vectors based on co-occurrence matrix
* For word by word design $$\rightarrow$$ co-occurrence matrix $$\rightarrow$$ Vector Representation for the words in the corpus. Follow similar approach for Word-by-Document design
''Co-occurrence'' between two words can be defined as the number of times they occur together within a certain distance $$k$$.
!! Word by Word Design
Given two sentences
* I like simple data
* I prefer simple raw data
For each word in the vocabulary we will compute the co-occurrence of of word with other word in certain distance $$k$$. To represent the word //data// in vector space of vocabulary of words with distance between words being $$k=2$$
$$\begin{matrix} \ & simple & raw & like & I \\ data & 2 & 1 & 1 & 0 \end{matrix}$$.
You can represent the word data with vector $$v = [2,1,1,0]$$
!! Word by Document Design
* Apply the same approach as Word-by-Word.
* Rows correspond to words
* Columns correspond to category of documents
Count the number of times the word appears in the document category
$$\begin{matrix} \ & Entertainment & Economy & Machine \ Learning \\ data & 500 & 6620 & 9320 \\ film & 7000 & 4000 & 1000\end{matrix}$$.
* you can represent the entertainment category with the vector $$v= [500,7000]$$.
* You can also compare the categories by plotting these vectors. can use the angle between vectors to measure ''similarity''
<img src='https://lh3.googleusercontent.com/6y_kSKwwb71Y0fWKQwVMCvyvqNhyywPtrbjhvb9dgwyyEHuEHxzRbqdz2O1KjEODBcGPPpYK3KFJneGHWMbEOBWEVbVHh8I58tuCfc0t0HgDO-kDucsjAtGSSJcgB-dMB0g_hidQ0nE0g9Of39G6gjEwzAsxZwV2QwYQbVxKHzEPje5Yhh3x0YAAo-RwefLsKZSMDx0Pylu1BCGz5XzyLxWIbtqBvt_T7T9PQDeGSbLQmCdl5F9kl1T_ttuP49fLqoFXj-GhLpAH8pxUAAAP_gycPqYwO0eznfi0JNUuYmXQ9aQkGs5S27dBFFijrasA_Dl7IHoaroe_qhoX70dSofpE8zgGBKVblK_Z6Su0DFqfjGcSkeUIv9eB2ieXm4u0-eqhbd44UFnAjomTIKT9KQsbjoBdEsn6tgzNVYEVlrn1EnUcCHKWqleWn3c4WzmEpGzQ3VIr8pabzh-ptAT0vDKSOY8CapItjuSPhxwcj6AKLG5bDl7PrgW9U2madb0tfCcj7jKOFglaSvwJqA0XTQL7xWoNjsMv4OafXXaZmqBdkbZHHZJxT75_yKYlI1-iOedMJStPuAwaDrCz8FWr2eVxk7BkTfGcgssnLd6f_uvTj3Nk_Q5HsJltMmxiAxzLp4dtMwvEicE36aO1753EDXKoF4gwikWK8XQAWd4Gdn4g1vPWz5PySKYWK_in5QKyAcnQTjZBrkKDYKFVCM942svZHg=w1920-h716-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
!! Euclidean distance
* Similarity metric
* Allows you to compute - how far apart two vectors are from each other
* It is the length of the straight line that connects two vectors
* It is the norm of the difference between two vectors
!! Euclidean Distance between Two points
for two vectors $$A$$ and $$B$$ the [[Euclidean Distance]] can be computed as
$$ d(B,A) =\sqrt{((B_1 - A_1)^2+(B_2 - A_2)^2)}
$$
<img src='https://lh3.googleusercontent.com/vAMNKCoHVx8S35gyRscIZN4w9kUXJwlsaKJ44-YAPjvxd-bjyCziOt4P5t4A1j7_aAJc-npZ2TmJmlmNPTHwnNSvm5jLrAFYTNZZYHFGiXhcT6wgSFtFjb17sAAdDnOxLK0XTFFfwVraC2TPMAZ6I_RYXojepccEFZ6WY4YHCDMTKOnr-m_Rlx0vhBEBHNU8-ZQijYhy9u0FA0em0SpvkWadn5XpZs3xEhItKX11GkWz5kb02gtbc3VBbsxqlV3hTKKQD3mWws4ahKsAgjDmUp7Hy2unlJnFBLW49XWpIWu_gVP5Gl2GE7AXzvxunQI81ih-AyrXTV4lChDSDVVHtoFLoSHcDbxcy3VqcnLbclRkSXaCXHR9-Uu0WYHi4W5hqeR66nBJmdFxclxujtnqQ67NJYRsxSR1OAvZuGAzSth3cnXcuKfcQAdQ2QKaVCrddQj8ACV2rcSVy_7aXoMVlqdeKHV8XEpKuIPRFGpp1bR0gVIiHA6xMlYHCTHT_JN9LeGKEVMHoQIODEcnkAGsio0wRe6Or1XQBSOltGJ8sXkwdzP8GglpwNHgw5Bd4Yp-uI4141kUuhD0AS2Ch-apNAU9h28BM-PMcOXGTXia89fURN7dyrg2tfsFLf7tzYmV0lNcuxge1kJKj0aR_k_H8S2f3NfFpos-Bth7eVFNs2z6oL0OygH2Hm4Aup8lAY8uScj_LsfeQasVA0hbtwQxvn2cAA=w1080-h556-no?authuser=0' width=500>
!! Euclidean Distance for n-dimensional vector space
* It is the generalization of above formula
* For two vectors $$\vec{v}, \vec{w}$$, the distance $$d(\vec{v}, \vec{w})$$ can be computed as
$$ d(\vec{v}, \vec{w}) = \sqrt{ \sum_{i=1}^{n} (v_i - w_i)^2}
$$
!!! Python implementation
```python
import numpy as np
v = np.array([-1, 0, 1, 2])
w = np.array([-1, 3, 5, 6])
d = np.linalg.norm(v-w)
```
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
!! [[Cosine Similarity]]
* Computes the angle between two vectors and computes similarity
* Unlike [[Euclidean Distance]], this metric is not biased in terms of size of representation. For example, comparing large documents with smaller ones
For example,
* The distance between food and agriculture corpus is higher than agriculture and history corpus - hence [[Euclidean Distance]] not a good similarity metric for this
* The angles between Food and agriculture corpus is smaller than agriculture and history corpus - i.e. [[Cosine Similarity]] is a better proxy for similarity in this case.
<img src='https://lh3.googleusercontent.com/ZIZsbW1yC6ctEKVkI5f4RwKX3G7tFiWq0PwoR2S9mau95WApEaioMjpMG1ULgQobevcVSfafxsx8HG3LBLOUjXTgsLlpUhD6JnHjc0ABgFB8aSOnN3awr7VJhG5T276pywbsXYuCkGGuLcV49YaoEblC4R089AL7Qt3dlz-LDAsmz_9KNVAznfhgebMfchy-UejMgOs5XwNUfVqEYMUUV7MtTj3GruaZnq1AzIYDeAj3fmYhZimgs2_JYVm2_I9rUzfgqNjgGeT-89dRQ2_mI4P5fRx52gmMfFSsbmZwiHR-o5iLK4_hwj32G0fQt87EVE9YXKLZzChLdoTKXKlbrLun3qsshqCkZpJfBAf46xdstHQ9nnnGJjZbsToGn63NqsUmUPGlnfkiajdTC2QVmXsjJT-WTTzRHKYIDH4TGjyuVyhS9oMW2OBx0O9G9dcLMvWMkWR9QfU721QJwZsTJfLaS_mqGv4313PZ0HvfI8RyqP86_z9AFHrt-FjRaihazn2IiS69pI6HlbN6BzZzyZlohzfC7hVV3f1qP5K3c2Nu4WlPz5KjnoefJwymLaafwSDl1l5dJWgLhd404eXy0T0oiI8BGax5Zazycthmy_JMCL4UChnKaetEkWvhoCg6T4Zye5Xeff7qDUtewNiUwozB41QPgPcZVJWiYS0DVd2OPtU4ELxpHTCcXv0N4CpUHRyGsKooz4GUJbab6ggQprvfsw=w1920-h734-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
!!! Vector Norm
Sum of squares of each element of the vector
$$
||\vec{v}|| = \sqrt{\sum_{i=1}^n} v_i^2$$
!!! Dot Product
Is the sum of product between their elements in each dimension of the vector space
$$
\vec{v}.\vec{w} = \sum_{i=1}^n v_i.w_i
$$
!! Cosine Similarity
$$
\cos (\beta) = \frac{\hat v \cdot \hat w}{\| \hat v \| \| \hat w \|}
$$
<img src='https://lh3.googleusercontent.com/aWZgjwZBVpEC_SbJR7VLLwPc-bzGwTAJqm8N9SfkWVcaf4pDsHeX252ezPXWvmT_5jCwmqc-efPiv8BVK2G2PWIv5A22VZccbRNXxMAhmSHGT6c_srcmuzZ70EEgk_5IClgwdZ7i8ZajZCmoF2iVB178vwN-286SNit4qvtwHg1FmOWfYdKrNFAFxZ_wjzASmsGzft5brW-43-8p6ATMHtCqc-yYY9Mrjfjqr-bd_ZdUhnKg8VmmTH0--P4LbNfmVg8ju7bjU3-YqjghYzoW8LcKYMr6xXNlDHbs5Yx-wMfaDC2ODyEz1JWlh9AYSU5-yKVdyhtE4oI-roHC448FrW_ZyiMZoPkuHmAb7yDpLZXZ2PwubJOfeTR_eAvJ-Sb5JOfeed5LfzYcUlzoqhMTB8ltcHEGGMMu_T1H0-cXwhhIs4cSScJboMxSVOgGq3t2DOztPTeP8WNAHsx77FEEhJNiFvKzg8jz2ozrs8CRaU4HXWpe7vnzXVEr6DNINRlfH6MKHo3vu97gXj-fftHXo_D1VqQm6VbVY_JeGDHUP0JKuF_Xw6O3Fm8Vv5v8e7ZLxzh7cHYOJcmxD3hXyUu-2uV3OBeGUjPkG13G3huJIbpIybD14-59Nn-UlYzYO4FulJWNbNubDvzsuSp9-NzT4uEWbG5RcoG3tCmk76iVXuDlltnh-s9DgXleaqMgzhnIlSKLgP1j04L95xNwgPVylEw_Lw=w1920-h736-no?authuser=0' width=500>
* Gives values between 0 and 1
* If $$\hat{v}$$ and $$\hat{w}$$ are the same then you get the numerator to be equal to the denominator. Hence $$\beta = 0$$. On the other hand, the dot product of two orthogonal (perpendicular) vectors is $$0$$. That takes place when $$\beta = 90$$.
<img src='https://lh3.googleusercontent.com/L-5efHVxgmXBoCM4GW0VIkajKwP3HJvP5zBK7r7i1nLlyUqujdwOtk5e4RTQG5ZrZO0OBkwL_SLTVFLASCSj02l-Kre_IR_Bd5Zx-09_2f62lXqSrUgWcfGov211z4qa_TvYCM_i9KiK1ypg48Gl6loDLQhWUa1rxbhFWPtKe76d385zXPXr54Br5xBtr5-iVotDP4Nsuse4ygAvxUaMPpw4cxxgSf397T7wue2X3MEylrRtnP2n6pGYWHXD15A5YHcbUd285z6ZR1uzk5mNJlWAPJXNUJnE2z_ogkubbrdKLS7_uIWjGhrQ3KOyUEN87E6NA0-1rUOyEjwflnuuGgBv4npvbmFj0QCHbvpX8Db8em_qkyvATGYtUO-5zzmE2Y2yaQAl6IMG37iaKhUhtMGhejmULron2QUkNSS4zcoC7OVwL8ULnaPSwD1fz5zRmntwe-aFhtvF_0_aS1XRduekwuwMcSutD6WJy5XuEKa51Z8ixTmwQX14sxw9Zu_tbJL8r6hNYIQdQvPw0TU_io7GVqSg4kVQA_qPbE23yNMzUwvWWpLHOrwS-0FSKtyQM5TDAqvCD319TKY0w2KG9RTivwXQXMQUJZ7BtZLOP7s-VqEV0VKjdrlNKHxxjKxa6kni7WFG0LB7ElgBMN16cc0QAPIPbRHJldS2-V-jRLphMjzRLk1t2sNhN7d9smP7BOCbmoHIcmTHU6Pu3059Pq5Cww=w1920-h761-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
Manipulating vectors to infer unknown relationship between words by using the known relationship of others
For example,
* You want to find the capital of Russia, given that you know the capital of USA is Washington DC
* You need a vector space where you can represent Countries and their cities. You first compute the difference between vector values of USA and its capital Washington DC. You need to move 5 units in x direction and -1 unit in the y direction to get to the Capital. To get the capital of Russia, simply add the vector $$[5,-1] $$ to Russia to get it's capital $$[10,4]$$. But there are no cities with location 10,4. It means you need to find the nearest city using the cosine similarity and Moscow is the nearest city with the most cosine similarity
:<img src='https://lh3.googleusercontent.com/q5iPMOJUmI3bIjeMhd-hCK0AlU6RnCjHdNpPOsMWc9a_PmvptcR1uIavt7S70wftpMX_qOIvPLAoPCGy2jNavstgLEMvAAGI6LlhlqkM2qTW5HjhjrOsOyQwe4ak_mLAP_tGICf46rKcPYaRB5KuMZvP2QZLSm6UHWtKYj7X6v4FQaGmBYs44BMV6GfdDmorBqE09Q6TJ3bU5LmDgsZW_K3HQzl3VI9d1-poTMGPxyE_xypi-fyYhBOAqDgFKMn3rYeIRVLC2y6qbq_hIrzg-RhgbC870mdW73wIVgqZVBSqvynPd83WVBSZ2M8eoC0UJ1v270Md6G8gMlBAd7zdlK3talrS-IXTxxF65kWOMuzjj_IWogM7XGEZyvpnQbWRHAsXFaQLnfNxsrNx9ap2veqod8ePd2KdTvlpL1Oadys03yj_T7HS1d7iDkoSckV0EYenD1xQNC4hx9AZch7M-wNABGxZwwdfvw8yJ1VGHfdFYZDBywE3UmogyUN-mealqATRpk89m7-57-Y-7xD74udpc8KsBGFGyj8mz5oZCfjfj6jaroCX8trbTAPnG7ru3ogztt39VKGtDqKzkv90OMzyVkCrqW8qezABDFiAKwXrtn10dsE9VPOOERz-AdXyO5dGRyo88sQsX-Mv7rK8_nI1UdYcBD8vbBHp-1ZAy3E3sB6QhIPLnX0iqINANy1KYraVX_bpmbQkfaT6RKLfQatXjg=w1920-h754-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
* [[Principal Component Analysis]] is an [[Unsupervised learning]] algorithm which can be used to reduce the dimension of your data.
* As a result, it allows you to visualize your data.
* To do PCA you get uncorrelated features and project them on single dimension, retaining as much as information as possible
It tries to combine variances across features. Here is a concrete example of PCA:
<img src='https://lh3.googleusercontent.com/tT7pRGT6z_wgRYyubjGmNCFhxc0ELgV4wP8VakLxfaaswSB7nK7ZR_BNj7AHsGYIA--H4Rnk255n_X4fnwi5zXeAgt9vFm3cSVdOOraQBUuObgVSMqfRrsC8vDlKtoDTmQHsPeR2UgsbV7fLb3AUYGL0A0c7pmJ4K2OGT-c17riTpH08SLySPJbQt0vyPwU31OpkAqW4c3SMjwZ2uROV1ZKJzf5L5nzDldlIfzwWdXGxOnPxCyacFncVRfgUgX_1wg3m4kGLik00KbuOPVcBbOYo_6BcxQDrYTnH0yT8ILvIAh0p0VPcs9tYBRIgdihNDq334Jbh6qc8qVJg1EsdMSYajGGcZVdYe74LjQYXysZktn6hOuPmIlNq7ZNOwStmC16olAg3NDES7D1vNphBVg5vtEAgiKderSW2iwhgPPqcH4MRJYYrlIRzaJFku1TJbAHePpXc1BFiTYR-3d1iItz7z0nOoSI_ZGwZq5AuobH8OAy_JZp906h_L2UNS2m7arZnrH7n1sSbcnuxc-jyvFY1pxDaHJxkOvCoTKTSodP0dzO4Z3QVdZqQ3JPhfwshmMOxR2YisWjNP01uupQ4USDIYx82EC15x6l-hBdvyrbkEoFtoU_KXjJoCBY-IWYuQEh50cmzk1rBEYv69TRgW8iXrUIdPuuJUJUxKvbISTsTGZ2fakhTXDIh2mZdV2dE--1YgXvoZ4R1tztf-Q9NJUuz8g=w1920-h850-no?authuser=0' width=500>
Note that when doing PCA on this data, you will see that oil & gas are close to one another and town & city are also close to one another. To plot the data you can use PCA to go from $$d>2$$ dimensions to $$d=2$$
<img src='https://lh3.googleusercontent.com/A8MkHjGgP7X6DZsGhwWm1HMHs9aNqRRqO-l1UVtW3JQLiw-e9ed663Xu9qv1zlJNtsKqsTohqxE3AsslNobb7fufMw3sTJfc4WDOt1FWZ0Rz5aZ4-izsCw6pvclS_kIKxRmYSwXmHFxqaqj2gctv8EqdE5F_PgrKn1YpYAr72ggsDHJ0jgmcRW7r7QZ6KZFiFeMqwYJCD13ZxUZMhublKd3RZI5D4Lhf5fuzGzi1AzFYXcnJG-msVaE-hhxx5uQiGkGbTHpsZKzTHLEP_0Xp6QA9QjP-MWwnoQ7bMvEsaFv0M6857fiCMDi0Ye9TKk0f7yuACRpUYIdO6rtHgsxfdoc5JvCD3RUgy3dH45Rx1ylbHHt5kg_FZBwCorDcwnfcFHYPfLGkiImKdJx2zEyZ1PNOcRWSUycDiHbpIXqLfKgNqGeXduvvXqvB6YphX3K5AyR2hrdwsXQ16n-FYvXtVvGQU9m8_EtN6wxrOug29pHzXD6_VSEPwC-5M0Ag1AgIzYXkDaa2yJ5jcxbrR9GoxyfLzIHBKDk6cZNAXh8Ic4XdXm-sUnZD0x1XUP-ncdWI_YmrDQ_s8NF0bwWi1m0hE10zW2SqCUrOfDbtCX9LW34LJoijf86DCLGQCQqyMgNmXJ-thjrY2q8r2YdQia91YTF00NzAPD8TTkWKLx70EvIgCNtJyIcXPKH8bF6bTR2wIsuNPKNW2YaPNEqNR2S_U51mPw=w1920-h723-no?authuser=0' width=400>
Those are the results of plotting a couple of vectors in two dimensions. Note that words with similar [[Part of speech (POS)]] tags are next to one another. This is because many of the training algorithms learn words by identifying the neighboring words. Thus, words with similar POS tags tend to be found in similar locations. An interesting insight is that synonyms and antonyms tend to be found next to each other in the plot. Why is that the case?
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
[[Principal Component Analysis]] is commonly used to reduce the dimension of your data. Intuitively the model collapses the data across principal components. You can think of the first principal component (in a 2D dataset) as the line where there is the most amount of variance. You can then collapse the data points on that line. Hence you went from 2D to 1D. You can generalize this intuition to several dimensions.
<img src='https://lh3.googleusercontent.com/8ESP2TDxfmSynudkaxhXDiM8ruog0WA-YhgAwug5rzNo7IxuhQiyssDPtU939rfMCidJDfNZZW4xa4dQHCPTK_-QuTyvt2OrDOSaUYxnK7G1dX2FPHUNI-tmTGaLhd3NVsym_Xy06t9XnSb2J1kwt0rVzVukLy8PnbGRLFpkmB-zQoxzJ0klAQ0BzvInhARYJhOSc0zavdefkOvACD540zgpwMIwedyIDFDmjCgFHu3vPIJyLnRzV7UdN2Z8SiQZ0BBCas1VjFZCYxiwutAA1oWurPLcPSq1PtKcOL6IYTm5W8q2GJE5pDVAz9o5w4v7bdqu3LQz-oy3oFT7g6bKiAJXZlIdV0hE11MxBZtX9vhdHtGKOD2IPuzpXXG5WRHU8owRZu4w067n9jRfEB1Nc2JDS--sZ1f5zYa8KogepDS2_bveptqD7P9Zny7JEo8jL7nxPW1hnCr5TIHSWmbjzfrBwMWncyhbVKR0JPTWIKQ3dXpGYgupsBXjexSLeetUppdF1WGQIq_Qy7yvBTsQ5AZl2BsCG9HwrtSBzvpBfF2ss20EujZPVGQuuOnW3jZtXlGZ4jgW4tStsjKpdLJaE-HANwq8wZ-t7QpC5R85EVDLXsVqAkDUROmeRutzJg2so7ZlCzE8apgIQitI7-EYqjQi6c1M9y1b_3Psd6H_D1AJxvbDxReAH02fhVGBkJ0vht0fkJPxywvXSYVxYKeFQQtzVQ=w1907-h912-no?authuser=0' width=500>
!!! How to get uncorrelated features
* [[Eigenvector]]s from the covariance matrix of data give directions of uncorrelated features
* [[Eigenvalue]]s are the variance of the dataset - the amount of information retained by each feature. You can think of it as the variance in the eigenvector. Also each eigenvalue has a corresponding eigenvector. The eigenvalue tells you how much variance there is in the eigenvector.
* The dot product between [[Word Embeddings]] and the matrix of [[Eigenvector]]s will project data on a new vector space of the dimension you chose.
!! Steps to Compute PCA
<img src='https://lh3.googleusercontent.com/4A3TaD7jBG-MvmMJDDDRQ-anN74V2vIFXALvemC1mcQfupORzfiHwIkq7O4IatZy8BN82eNr-VNiUkPfKYgyTSiOLRynxDmYceGqCdO2Rc7oMVZKnTzQ3t-LzFGIVq46Prf56j_z7ga-WXMrv2QjJMlQ05n8Mb4w2wsBYkSEzUcAhOpcOk5lb1sj-JFyEYg1V0naakCu6Yq5383DCfoc7daqrSmtyVU9JPWU_wMfUidWr1Mf-uJw78_foH4XHN2o0A7NpIdWI61WKLH34cb7t316ggn70zehVdJv0aFVQ0o2n7sl7KZtkPqymt6e0zhpNtCtFLqozCK4kxRb27BsjIeaMCGTeLgaP_HbLxDdlXQHcWZVBtIv7MbdW8rpel0nxLALrNoZYFndD9pONSI_Jq-FxHcJ6u_Ea2zO5yX-NI3ZU7C0DJ98d99ricvxLuxmXpH5IJHIRqIykBeA_jbAYWOaxLXVKwelhXnQf_nifZx4i__A5JL8WF2kgXZBoUF5I8DONTQyn4Rd1JQcMEH6IP1LpCDSeBMCAWu2obM2RcwJzTymxW_qmfVfhZS-4PhFQwRo-XQ_hewMMNXnFSo5-hO2NkzJc5AgLg-BHGuCh-ajPWiMOfFMaq5i6R6YzIuQUmOlW35FBFi-HgrtsknycZjABJ-ypBT9rMGvQvpET3RwG7XWRXCoa8uo_UUDOgRdOOz3QO2WNcQHdnViZgBIU3nNlw=w1848-h912-no?authuser=0' width=500>
* Mean normalize your data $$x_i = \frac{x_i -\mu_{x_i}}{\sigma_{x_i}}$$
* Compute the covariance matrix
* Compute [[Singular Value Decomposition (SVD)]] on your covariance matrix. This returns $$[U S V] = svd(\Sigma)$$. The three matrices $$U, S, V$$ are drawn above. $$U$$ is labelled with eigenvectors, and $$S$$ is labelled with eigenvalues.
* You can then use the first n columns of vector $$U$$, to get your new data by multiplying $$XU[:, 0:n]$$.
* Percentage of retained variance = $$\frac{\sum_{i=0}^1S_{ii}}{\sum_{j=0}^dS_{jj}}$$
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
* [[Machine Translation]] - English to French Translation - From //Hello// to //Bonjour!//
* [[Document Search]] - Given a document with a sentence - //Can I get a refund?//, search for similar sentence in documents like //what's your return policy//, //May I get my money back?//
!! Learning Objectives
* transform a vector
* Learn to implement [[k-Nearest Neighbors]] - way of searching for similar items
* hash tables - helps assigning word vectors to subsets
* learn to divide vector space into regions
* Implement [[Locality Sensitive Hashing]] which helps you perform [[Approximated nearest neighbors]]
* [[Approximated nearest neighbors]] - an efficient way of searching for similar word vectors
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
!! English to French Translation
* Create a list of English and French words
* Calculate [[Word Embeddings]] associated with English and French
* Retrieve the English word embedding of a particular English word
* Find a way to transform the English Word Embedding into word embedding in French vector space (using a matrix)
* Take transformed word embedding and search for French word in the French word vector space for that embedding
!! Transforming Vectors
* Define the matrix $$R$$
* Define the vector $$\vec{x}$$
* Multiply $$x$$ and $$R$$ using dot product
```python
R = np.array([[2, 0],
[0, -2]])
x = np.array([[1, 1]])
np.dot(x,R) # Result = array([[2, -2]])
```
!! Align word Vectors
* Initialize Transformation matrix R with random numbers
* Identify how it performs while multiply it with the English matrix and check performance with the French word matrix
* Train a model on a subset of vocabulary, need not train on entire vocabulary
!! Find a good matrix R
* $$Loss$$ is a measure how far apart are the actual translations from the attempt to translation
* Gradually improve the matrix R in a loop
* Compute the gradient by taking the derivative of Loss function w.r.t. matrix R
* Update the matrix R by subtracting the gradient, weighted by the learning rate $$\alpha$$
!!!`for` loop
:$$Loss =|| XR - Y ||_F$$
:$$g = \frac{d}{dR} Loss$$
:$$R = R - \alpha g$$
!! [[Frobenius Norm]]
This measure the magnitude or the norm of the matrix
!!! Calculation
$$A = \begin{bmatrix} 2 & 2 \\ 2 & 2 \end{bmatrix}$$
* Number of rows = Number of words in the vocabulary = 2
* number of columns = number of dimensions in the [[Word Embeddings]] = 2
* $$X, R, Y $$ & $$A$$ are all $$2 \times 2$$ matrices
* Norm = $$ ||A_F|| = \sqrt{(2^2 + 2^2 + 2^2 + 2^2)} = 4$$
!!! Generalized Formula
$$
||A||_F = \sqrt{\sum_{i=1}^{m} \sum_{j=1}^n |a_{ij}|^2}
$$
!!! In Code
```python
A = np.array([[2,2],[2,2]])
A_squared = np.square(A) # array([[4,4],[4,4]])
A_F = np.sqrt(np.sum(A_squared)) # 4.0
```
In practice, it is easier to minimize the square of Frobenius norm
!!! Gradient
$$Loss = ||XR - Y||_F^2$$
$$g = \frac{d}{dR}Loss = \frac{2}{m}(X^T(XR - Y))$$
where $$m$$ is the number of rows or words in the subset we are using for training.
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
The transformed word vector $$XR$$ is going to be in the French vector space, but it is not going to be identical to any word in the French vector space. Need to find the French word that is similar to the meaning of the transformed word
!! How do you find similar word vectors?
Answer this by answering a related questions, ''how do you find your friends nearby?''
* Suppose you are visiting San Francisco
* For all friends in your list, you check their location and find the distance between San Francisco and their location
* If you have a lot of friends, this is tedious, so you need not look for all friends in your friend list but a subset of geographic region of United States.
* Dividing dataset into buckets would be helpful. Similar to buckets are [[Hash tables]] that is a useful tool to increase the look up speed.
,,[[Course 1: NLP with Classification and Vector Spaces]]| [[05 September 2021]],,
* [[Hash tables]] allows you to cluster similar values together in buckets
* Hash tables store data of arbitrary sizes and maps it to fixed value - these fixed values are ''Hash Values''
* Uses a ''Hash Function'' to map data to values
:$$Hash \ Function (Vector) \rightarrow hash \ value$$
Example in the image below shows a hash function that assigns the vector of digits to hash tables based on remainder function
<img src='https://lh3.googleusercontent.com/E106qUB4oslKR_yvQvAbmY1ybAagKExAIIJVJQJejJqS15zlMLENftU3IWK0hR9E-8GMT65TDdxUAWJ28NZSR5ob9EQiIGiXrT_CzAV_2mfilJ9_KZpIv2hjQ02Zu56QD_24iWdfY-bBMsHs_7oefiNCoSii3CBb_bsJx9pDdO21HbImVlMscAT9ITTCIMfwBwRQCFoGr6jZua-bUNUHnjtznxi6EQ23nuXv9DRK76boy-r5KVleJrVe6ZPSwFnmilQHiqF3rnxdYn2QSiIFyICjYF3GQY7lVCp6jux8BzVWS--2MuaHDKMe1_rY_4DMQ2rM47wn1xxIMcraEqF9Ca2cNO9mauyAFz_KDkapaaT4FY1jGV4SsatSrJKhbrZjQSLKNJWcMwybqb9MT-brlIshtRvZce6vN-inSM8P8QpC9IET6jlM-Q1tIpD1dZvTTZ6r1JLqs4XG7HzTkYF-6MOaJDSwAK0wMQ1x6LjQP6lxmT11UBjD_GJMONp0Aj2KEgpfzJ5FV6e4zDTnb-nuEwXs-5bVkIRWTnn-tdwThesGYbQmsG5e91hfnnlb38fMrt9V5IzbD0nYczA6TqaX6OoJWe4pbdvNg6c3tL1M5Hb1YTQBB-XoJ_aMNEqhIiHM0H6MpxUglJCVPvu61C6WB-M46Eb_IiQtyDCRU6WP3DWdUXqI6UWGeUrxz8HTao51YrdCrfUg-yFrkhP1OZyXeUJR5A=w1920-h764-no?authuser=0' width=500>
!!! [[Python]] Code
```python
def basic_hash_table(value_l, n_buckets):
def hash_function(value_l, n_buckets):
return int(value_l) % n_buckets
hash_table = {i:[] for i in range(n_buckets)} # initialize hash table to be of dimension n_buckets
for value in value_l:
hash_value = hash_function(value, n_buckets)
hash_table[hash_value].append(value) # append to corresponding bucket
return hash_table
```
hash function takes in list of values to be hashed.
When hashing you sometimes want ''similar words or similar numbers to be hashed to the same bucket''. To do this, you will use [[Locality Sensitive Hashing]]. Locality is another word for “location”. So locality sensitive hashing is a hashing method that cares very deeply about assigning items based on where they’re located in vector space.
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[05 September 2021]],,
* Improves the computational speed for [[k-Nearest Neighbors]]
* This technique that allows you to hash similar inputs into the same buckets with high probability
!! Intuition
* Consider the following image
* The vectors are represented as points
* The lines represent the planes dividing the vector space. Notice the blue plane keeps the blue points on one side of the plane and soo does the gray plane
:<img src='https://lh3.googleusercontent.com/rLPKXX4owjB9DARJagdfcJMXsfGU8yAIYJ9fcIL9Gs2WMMZABn8GUSo-2UmmxjhQ57QwmH2EW9cYMIV-322Ow3pD6Hv_ragBV7z873xXzjFdC-jeNJj5gvIc90p1ELfyqDqYlA2Rdzqa7VU7zJieYpTmm429yziAFcChaB2QHIhL-XljWb6YDqlPo-M5tbVD3w90tAuppzorulsI9afLIhAO33rEXuzyDVbfNreB7J72fCRiErWL72fFByePQ4xY7nN6yox8AqQBbPjyYdgQiJwD7oKWLEX6IOyctQQdu_Da-JdhtD5dxNn8uukoCW2qFiquOivw-eZ2Goz9DbVHFjWVoCVgFCbQMO1CjKxwZ-Q2VgkBf6nChLfo92qwfrtiFGx3tibb5FXJINy_eXG7eJXczlYcILqeJpdn0LrfBmRErENa60H4BaRy9W_MahbDOhbzOo7yU9zLCmQ6n5vF28itRJNyt6QG4S-CK0iDsRjKFP2njD2KX7oFVvMqOH5ZnV0kg7qq5LRapRroJrxkvH77kZ4jKiJssD1HSVygf_Ywol0wLbNSxwspqklSPIoyFihcCrrot7Z716UPE-X9h0uaBod8zht66ehQ1TKFPMYxPGhLHlZKEPrAg39Wpognaul6wR8PD1lPFwpUWWs0sWiR-88dwe6GQhrcuA7cGEIT8475ui9CE0qqwP96GwPWDQRIof00EEZUsg2YmxXIuDumnw=w1921-h648-no?authuser=0' width=500>
!! How do you determine which direction are the blue points relative to the plane?
:<img src='https://lh3.googleusercontent.com/5zDwUd7JvoLsmewr3CNhqcUmBJWS3K38E7BsQm2dWOPpYU6wrgjX2i_0NsrJJhXrBHgK8wI8vt05z22E1uSdwzfdEF7PgfTzIxO-1TMuqf5zqHSrMK5zR1sG6BC6ceji7-9bkybFn0LOPzMTOq9IvLfKIe6Pj9LNaXZrURnv48bj7fl2aJWQ2BTNqiMKRLU3kz1ira_X9Ee3y2WRvs9YxOW_1Fg1PbWK8ug4ofQyXNYBoZ8IElb7PQIwqD5h3EfuPAmk3KwofNntijNR5a2HBC0hrjZtw2eAJPtbGxAHxXPZQPBM4HtELRDYfKRTjH9AbN9FBNYOUpBumIs5Xp1t20uUlycHH6L5WRjs2Vv7hjJl98KtcIOXKkLMRAtDKZVNk6_08VEasjWIjOp0b3iwK_ph1PSmj72h90nZiX3of7YpAgsmcAxItHRvxiPIeAsbSlxQUmCr2tukdw0kjMn07nGKuyo432aTSAY_peGNezXeeCq29oC9zNOeoepd6n6pjV1XLKrTvois3FVTnOMR6Z2POX9wjMDk4MrSKsvWP0RFNQwsnfUADZPKZ9VEuCCHdO_QWwOzDXcCP-eCpYShCAnQ173zipk67p-YmB1uprrTEAq5CG_-UGZiaVVPl-IVIuKps8W-kecpjmdOaNBDtHPYnhMgLy95KxXoKc8XpVWh2IbAepPhMXRbnxTNM6SY-Ks6mnWq3DpSrsQ9_mKyX4kxYg=w1920-h750-no?authuser=0' width=500>
* for a plane, $$\vec{P}$$ is perpendicular to the plane. Consider the magenta line as sheet of paper and vector P as pencil perpendicular to the plane
* Given 3 vectors, $$V_1 =(1,2), V_2 =(−1,1), V_3=(−2,−1)$$, taking the dot product with P, gives $$3, 0, -3$$, i.e.
** Negative sign shows that the $$V_3$$ is on the other side of the plane
** Positive sign shows that it is on the same side of the plane
** 0 indicates the vector lies on the plane
!! What does dot product do?
Dot product is the project of a vector $$V$$ on to the perpendicular $$P$$
<img src='https://lh3.googleusercontent.com/AWtu9cLQZ2fkD6r8HSFbJQZnfvLuWjwmnh8br4GR6ECPbuZRkZU3bRE-2gjU7vUAUaGCa-g5IVoi3VbRI3mrHoee40VhhE--ZZiuC0weiaT_TDF_co59OK7umSldnnTJMxpAN9PYowjOyNgNn4-PkSuWujxS_OG94UF_2jsTjCVOTDlucN78FNE12ECQDpV1frdQ1uFSl9SrKfVi0NRfkK6QmSGJElBt582KzR8fcIIXm1L0CZnZ5h9OtpN6GbN9fnXCi4gZKlbfc_rFjHiE_DUxQrFmqZgZ-uZZvfSsjGb8GUaB_GPIsIRKrlfIHD1NwpjrEt2FTLeFicOhL5_IjKX4KgG1yfyRqw8LKs_cx201qF_LZbCeU5JTGJvwGgY5QBSAM4a9akev84q82hGYpeddFiRHrS8CRFxPXWFlZiu5oH6LukuDay4qj9a-8JHoc3AXc6d0ldmBMx62h6zE2iQr8Eh8WsHLHXvar_AHGmMAwl5eCTXq9e-powLMz8mPgGcaADUK-0eW6-DP1Id7FDYFddXAT2Pq-4FoWBboR8FW9FB48m19mJoqc9t-FSdr_mY5X8nKs4ysW09m1Plkcxs5nyZpNF7e3iNALk3n8sy9xIc0_0AZ-lkQ3092zn9ISL3La7U3Z2R__pWhttEqznthvOqESvWz2i2CBfG6YkZaLjP0OL78HW61KD-cv4dO_TuKCOZLL9IjGwT0uxB5Sfi0Pw=w1920-h803-no?authuser=0' width=500>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[06 September 2021]],,
* Combining information from multiple planes into single hash value
* Dot product between normal vector representing your plane and the vector representing your data can get positive relative to that plane
* Using more than one plane to divide region into manageable planes
* for each plane you get mutiple signals, using those to combine into single hash value, which defines a particular region in the vector space
:<img src='https://lh3.googleusercontent.com/CL-VkfevwnpDTqcM5B1BZuu4-4BIyiolXhcBxqoUKlNP432ma3SqFfZDyUHq5e83eJO1gZj-JbFYASM6f9apO2ZBLR5YLxgT1PVYt1NakEWxut1r_ibN77pkFkFrSstq9YZ1GSrMgRzO1oE5EN7vrAV-wwgq4B7e0I2qU-4HbcKGr2rJ51vVIPaeh-pauSvkclhlacNavS7jbLrM9T5THFoUcp4m-S_zrV-2GMzL9FAfQ9H9YsvFWte_0xTiYTiC7GfYdKjOvgQxau7atMxWBkyfo43vyHkeNRQpn_JMUzjCHcwWwsoxiAzxKAi_I6naeSVoqAV5pu2JrQirvIQkkhFPkm4tVhtU0B0eKRUi3bAsnNShkhn-GlFZOVHJWyZKZLmHb4Gv0xu6koM7qfLsG7XpkdcdSZ11mSNAeUKLAqm5-tvwVp-fWZR-UvpTx4CQdXQxhPe-sYklm-K8F8gJ75rJi-ZsKESOp_uP7OosGOw1EOZ9_Q94luruiNfbuu6SRGXSCuG-ozYnjPq3MFGYlUlF9oQA10t8MgfE9kExgp3AH1qQvEE4l1Uy7VoyKDxYor8QI1-Kv_go7EL5wF2TteXjPmpRj0M5L6iaAsR9SjDKA2D_8gtHhXI-c0CdbCSajg2hKKce_pig6JK-f81Jr5w-HmNMNzzZI0rziZnfwLUQZraR57n_PRKofSqrdRNJaGLbX2vqQ3zNc9Z5uv2FpShOEA=w1920-h742-no?authuser=0' width=500>
Given some point denoted by $$v$$, you can run it through several projections $$P_1, P_2, P_3$$ to get one hash value. If you compute
* $$P_1v^T$$ you get a positive number, so you set $$h_1 =1$$.
* $$P_2v^T$$ gives you a positive number so you get $$h_2 = 1$$.
* $$P_3v^T$$ is a negative number so you set $$h_3 =0 $$
You can then compute the hash value as follows.
$$hash = 2^0 \times h_1 + 2^1 \times h_2 + 2^2 \times h_3 \\ = 1\times 1 + 2 \times 1+ 4 \times 0 \\ = 3$$
Another way to think of it, is at each time you are asking the plane to which side will you find the point (i.e. 1 or 0) until you find your point bounded by the surrounding planes. The hash value is then defined as:
$$hash \ value = \sum_i^H 2^i \times h_i$$
!! In code
```python
def has_multiple_plane(P_l, v):
hash_value = 0
# for each plane calculate the sign of the dot product
for i, P in enumerate(P_l):
sign = side_of_plane(P,v)
hash_i = 1 if sign >= 0 else 0 # set intermediate hash value
hash_value += 2**i * hash_i
return hash_value
```
`P_l` is the list of planes. You initialize the value to 0, and then you iterate over all the planes (P), and you keep track of the index. You get the sign by finding the sign of the dot product between $$v$$ and your plane $$P$$. If it is positive you set it equal to 1, otherwise you set it equal to 0. You then add the score for the ith plane to the hash value by computing $$2^i \times h_i$$.
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[06 September 2021]],,
* Using [[Locality Sensitive Hashing]] to run [[k-Nearest Neighbors]] which runs much faster than brute-search
* You Can't know for sure which is the best way to divide up the vector space - create multiple sets of random plans, that creates multiple independent sets of hash tables - analogy: Multiple copies of universe - [[Multiverse]]
* Suppose the magenta is the French translation of the English word that you are looking for. Using multiple sets of random planes, you identify that
** All green dots belong the same hash bucket in 1st set of random planes as the magenta dot
** All blue dots + magenta dot appear in the same hash bucket for 2nd set of random planes
** All orange dots + magenta dot are in the same hash bucket for 3rd set of random planes.
* Using multiple sets of random planes for [[Locality Sensitive Hashing]], have a more robust way of searching the vector space for a set of possible candidates to be nearest neighbors. This is called [[Approximated nearest neighbors]]
* You sacrifice some precision to gain efficiency in the search process
!! make set of random planes in code
```python
num_dimensions = 2
num_planes = 3
random_plane_matrix = np.random.normal(size=(num_planes, num_dimensions))
v = np.array([[2,2]])
def side_of_plane_matrix(P,v):
dot_product = np.dot(P, v.T)
sign_of_dot_product = np.sign(dot_product)
return sign_of_dot_product
side_of_plane_matrix(random_plane_matrix, v)
```
<img src='https://lh3.googleusercontent.com/HH4H6Ou0_mbM2qkAP__wu-qXbs-KOtqvpfkXltj0they7jY_qEaDWmVOAU0rAgP8Mj3V09lepCEK5lf38p4mYji4_x0GmPM-bIP2FhM8AbeQwy6Vqub50a49teSH3x7sGO4pdl8_bWiH0Hdtb8Qar20pixqbzcrdXAkb1s4zC7DMUMaeGBxQuQMnExOQzzqUliS1RJzJxF8t8ycawCG3W7H-vMdoxMhlskc-aBPe7FDjc2V8zOnBXxuz-psXQDVwR7r6kyTo_qz3B6W7IshDpztBUm26Jk5SihbORNX9iHnwwTL_TyX5tsMjZPh41FVoA5whSIygS8P5vSlQ50coF6wKlH3gJvGL3Hg8CJWtpaGtDIAbgeS_lo91vqDJ-ZIPfqcaf5m09k_IPNyT2gyxIvnXZU0bew-nSegVgFdSsV0aeYQkf0LQlgccqO_vkZT9JoYfIqXWyd7oQr-4-JJtssw7BwD2MrZ779ZDJ96PwgzcMmj2sFb-vRaFzbP1oOcoRtq1fhCb39RNqVTncBEwg7Bzl55DnGQaErfVadaUZlmWm3XXqfKII1u_VMmdUgMbYkXis8yQD8gm6L6esM0InHoKPL2omYf83RUL7pR1FX-9Gyyjfm3oZW5ti9ojASaytxeJb5nr4XgLPN-fM8qE7iSX6jHXhZfohCkCGhNwYDhzhEn9qodRP9maVbFkhxdWgSL3PC9J_d5NtCO_N2mSjX-xTQ=w1920-h560-no?authuser=0'>
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[07 September 2021]],,
For document search, think about representing document as vectors, instead of just words as vectors.
For example, //I love learning!// is a document, to represent this document simply add the word vectors of individual words to get the document vector, and then apply [[Document Search]] using [[k-Nearest Neighbors]]
$$
\begin{matrix}
I & [1 & 0 & 1]\\
\ & \ &+ \\
love & [-1 & 0 & 1]\\
\ & \ &+ \\
learning & [1 & 0 & 1] \\
\ & \ &= \\
I \ love \ Learning! & [1 & 0 & 3] \\
\end{matrix}
$$
!! Code
# Create a mini-dict for [[Word Embeddings]]
# Create of List of words in the document
# Initialize the document embedding as an array of zeros
# For each word in the document, get the word vector if it exists in the dictionary else ZERO
# Add up all word vectors and return document embedding
```python
word_embedding = {"I" : np.array([1, 0, 1]),
"love": np.array([-1, 0, 1]),
"learning": np.array([1, 0, 1])}
words_in_document = ["I", "love", "learning"]
document_embedding = np.array([0,0,0])
for word in words_in_document:
document_embedding += word_embedding.get(word,0)
print(document_embedding)
```
,,[[Course 1: NLP with Classification and Vector Spaces]] | [[07 September 2021]],,
* What is Auto-correct?
* Key concepts to auto-correct and build a model
* Quantify how far apart the two strings are and ask how many letters you need to change from one string to another - meausre [[Minimum Edit Distance]]
* [[Dynamic Programming]] to implement minimum distance to solve for Minimum Edit Distance (frequently comes up in interviews as well)
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
! Transaction Mechanics
!! How do transactions work?
A transaction starts from an end-user's [[Externally Owned Account (EOA)]], and can interact with a large number of [[dApps]] before completing
!! Atomicity
A contract is said to be atomic when it a fails, the contract reverses to its original state. IT is critical because funds can move between contracts with the security that it will revert to original state and the money never leaves
Unlike a [[Wire Transfer]], say from US - France - HK, the money gets stuck if transaction fails
!! [[Gas]]
* It is transaction fee
* Gas depends on complexity of transaction and thus computing power.
** Low gas for simple transaction
** High gas for complex transaction
** If not enough gas, the transaction can fail, money reverts to original state - but no gas refund
** If gas is enough, transaction goes through, additional gas refunded
* Fees is set competitively in an auction
* Higher fees means higher demand
* Can be decreased by decreasing computing power
!! [[MemPool]]
* when a transaction is proposed, it goes to holding area - called memory pool - before being added to the block
** Gas prices looked at first by the miner
** If gas is uncompetitive - miners can defer it to future block
!! [[Miner Extractable Value (MEV)]]
* If in CeFi, a large transaction is to go through (purchase of stock in bulk), if somebody has inside information, one can do [[Front Running]] - purchase the stock ahead of that bulk transaction. This is illegal in CeFi
* In DeFi, if the same big transaction is to go through, but all the miners can see it, because it is open, so miner can chose to front run with the risk that the miner may not even win the block. This is legal front running. It is another source of revenue for miners
* MEV is an issue with [[Proof-of-work]], much less in [[Proof-of-stake]]
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[04 June 2022]],,
!! What is Autocorrect?
Autocorrect is an application that changes misspelled words into the correct ones
* learn to correct only misspelled words and not contextually correct the words even if the spelling is incorrect
!! How it works?
# Identify an incorrect word
# Find strings n edit distances away - a string 1 edit distance away is more similar to string that is 2 edit distance away.
# Filter Candidates - filter the strings for real words that are spelled correctly
# Calculate word probabilities for each word and how likely it is to appear in this context and choose the most likely candidate to be the replacement
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
! Fungible Tokens
!! [[ERC 20]]
* ERC stands for [[Ethereum]] Request for Comment
* Most popular protocol
* Fungible means every single token is identical in value
* Can be used by anyone to create a token
** Max 20 lines of code, need to set basic parameters - visibility, #tokens
* [[ERC 20]] can interact with other ERC 20 tokens
* Interface
```python
totalSupply()
balanceOf(address)
transferFrom(from, to)
approve(owner, spender, amount)
```
!! Three types of tokens
!!! Equity Token
* Ownership or equity in a pool or some underlying
** Example; Token named ''TKN'', with 10000 tokens representing 100ETH. Exchange rate is 100 TKN = 1ETH
* In some cases, pool can also appreciate in value
** Example: 100TKN = 1ETH + 5% appreciation or perpetual cash flow.
* Market can use this information to correctly price TKN
* They can also become more complicated like
** Compound - Variable interest rate pools
** [[Uniswap]] - Contract that owns multiple assets with complex fee structure
* [[Set Protocol]] - An algorithmic trading both can be written as part of smart contract for maintaining static or dynamic holdings in the shared equity pool
!!! Utility Token
* ''Token required to utilize a functionality of a particular contract''. It provides utility that is needed to run the contract
* Value is determined by how useful the contract is
* Examples can include
** Token used as collateral
** can be used for reputation or staking
** [[Stablecoins]]
** Can be used to pay for application specific fees
* [[Stablecoins]]
** Can be dollar collateralized - Relies on centralized institutions like [[Coinbase]] that ensures 1USD = 1USDC
** Can be crypto collateralized - Relies on transparent system where the currency is backed by a ratio of crypto, where ratio of collateralization is > 1
!!! [[Governance Token]]
* Similar to [[Equity Token]]
* here ownership is the voting rights on changes or enhancements to the protocol instead of assets
** If the changes suggested by using the governance token is unfavorable to the user, somebody can fork the code and edit and to set up a new platform or token
* Any form of admin-controlled functionality is not truly DeFi
** Currently developers retain the majority of governance tokens - but it is for short term. Losing access can be scheduled
* Governance token can be distributed as an incentive. Example, where a person borrows money, that person can earn governance token on monthly payments and can reduce the effective interest rate
* Governance tokens can be
** Static in value
** inflationary in value - [[DAI]]
** Deflationary in value - [[COMP]]
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[07 June 2022]],,
!! 1. Identify a missplelled word
When you encounter a misspelled word, how do you know it is misspelled?
* If it is spelled correctly, then you will find it in a dictionary else misspelled
```python
if word not in vocabulary:
misspelled = True
```
!! 2. Find strings that are n edit distance away
* Edit is a type of operation performed on a string to change it into another string
* Edit distance - counts the number of these operations
* Using 4 types of edit operations you can modify any string and find the list of all possible strings that are n edits away. n is usually 1-3 edits distances
** Input - add a word in the end, middle or front
** Delete - remove a letter from front, middle or end
** Switch - swap two adjacent letters
** Replace - replace the letter with another letter
:<img src='https://lh3.googleusercontent.com/dHZWJvoY96jH_e9VcZ7d3cgA6kKgaAkfLOMvlCic19xXhSV_XdtzL2BxN4LOgh_cCbdFmASXdcUVggMQ3sDSV_b_GtHSBYk0VcoKrXsIawbXTeaUH9ohlGI2TKrvjWBT8GzmrjT-dFfsh9bw_p6QCQOH4KIuOCp1YS3Jcv3zUPwjLg0ZWt7XyBEOLgxUf9PNXZy6w2RbkGfCV8PBCjvXa0pvZEEUuj3RLrlT1u-xf1OyHP8_7m-6b1VR2HOIjcySVTtOCnGaKDgbzQEcB0-4swTxuKH885O8eEG3rBMFYQWuC26TXWhNkeGJQ2C6tz1B1ccSGPr6TiaGQxymriCrekS_u2winCpYFzY3_icvOsbsLVTN2QIY_wjmMFq3FsgZaRweD0GhfKltlLQ8aF-FFrTqolGotYY01h0MXIae7_yGhrN4bB_9hQF4nH2psFmV9zC-p-rl5E8olfm-E2aTtQlvYVRZpmx-5UticTELCpQJi2-Xz5CaCkt9SI3g7AWDWmIIMH_zpqnnrZseReUAa926Tv8Ny0waEeZeWeg4GXbX_bhhp6qB6RtajnuKUpti7OPSCa84w9dxbjr3asSdZGYbMHKTWFTs-_H0Z_QMOgsf2usxvekweCFX1IW3tEh_KIgHWPg3aaHDAlOI_KXZpmY1mZ5TSJR7Ej74uAEAkZCmSnJwShzhoevJ9LEXVQS3YqldOwIsbllOm68pBkbu-MiTQQ=w958-h276-no?authuser=0' width=500>
!! 3. Filter candidates
* Filter the candidates of strings identified that do not look like actual words by comparing it with the vocabulary
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
* [[ERC 721]] defines non-fungible standard
* In [[NFT]]s, every token is different in value
* ''Deed'' is an alternative term used to describe NFTs because, deeds are not equal in value
* NFTs can represent ownership of piece of art or any other collectible
* Fair lottery can be run using NFTs - where winner is a random number, only few tokens have significant value and remaining are worth less, and the gets prize money via [[Smart Contract]]
* Untapped potential in the [[Gaming]] industry
!! [[ERC 1155]]
* [[ERC 20]] and [[ERC 721]] require individual contracts and addresses to be deployed on [[Blockchain]]
* These settings could be cumbersome for a system with multiple tokens. ERC 1155 allows you to have a mixture of fungible and [[NFT]]s. This is a [[Multi-token model]]
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[18 June 2022]],,
!! 4. Calculate Word Probabilities
Calculate word probabilities for the words identified in step 3 and find the most likely candidates
* compute word frequencies for each word in the vocabulary
* Probability $$P(w) = \frac{C(w)}{V}$$
** $$P(w)$$ is the probability of the word
**$$C(w)$$ is number of times the word appears in the corpus
** $$V$$ is total size of the corpus
:<img src='https://lh3.googleusercontent.com/NinIADn0GYMeymvCE-azh5GYbzcKuejP8_SFNrln_n49lctNnr2t0TlwGVyzri3RWJy12IRqcbV2UA-i6MqiwawctqRjprr-anLDviBDyPwiRy4d-Dp9VVtLSht3oFQxmETfyOSQUHgjnCZ3J_RfmLJM1Al0ED0QgaRadfzj5f03qV6TsAS_fpeE2Z4v9RZamhpVBqRmfvQo5HQ_0lAvttYO9oGrpmMl3Y8ews5gIhA74X6umnUHIsaWoTtNLsMgxYgNfrVR7iEOnoxel-GLnWtGKfWN54TOsJrVlWbrdL0VHQ2lprpNjd7tSbvTEcadOEJTriNFC87ZMJgRXXaX-MqzoKKvKrul8_IQleJsifgZOwRaG4mB-vnf_Df3eq_XkA2lHonZMY2RzrC6exY86M8MR5FHRWWV2lwrDzYivt9OVuu48hG8Oi2Q3nbfhSnrPhKeoOxtJyAYLxzIl3zPjml2giJSArj2xSzTZGE441xAz0aeB3bdVTwM7c4Bc9ZJMLXkE0Iw3y1aqNT6qN24f_t5KAOUpxSH2seLDoCbql5LrqHoYd11vXLwKowDzI16o96hVaUBuEj8f1QEFfzitQD2p4AK85vpAqqhDYQzCDjFY2-KbzXzQf9rn3ovyWfXtSO5y89z4f9asrlaVvybCAYIsxtIey3JtwC9jzsnQ3HBM1bjpIIYsb0TOCBSygZnLtOpiEo6Z2PSIibB45sW83D52Q=w958-h378-no?authuser=0' width=500>
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
!! Minimum Edit Distance
* Want to evaluate strings or whole documents to evaluate how similar they are?
** Can use [[Minimum Edit Distance]]. given two strings, the minimum edit distance is the lowest number of operations needed to transform one string to another
* Applications
** Spelling Correction
** Document Similarity
** [[Machine Translation]]
** Computational Biology
** [[DNA Sequencing]]
!! Computing Minimum Edit Distances
* Use three types of edit operations - insert, delete and replace
* Compute the number of edits required to change on string to another
* Use the cost table to identify the distance accounting for cost of edit
* Objective is to minimize the ''total edit cost'' - sum of all edit costs for the edits that were made. Replace costs higher because it is an operation that requires deleting followed by insertion
* Computationally intensive for larger strings
<img src='https://lh3.googleusercontent.com/gU26zluVOXa1nLju81xuzWKooCYbYL_L4HxkNj_YLCNGz4qfO30-AMSDNaAzU1eygZrwPr6Hb9O7BBI9CLo6qVU8Ty6vYsM3cAoiwzGI6gjK6bUa0JJoB2VtqpX2nbgk5hv23eJW7YlGpFjzXclL_dUiaxbWKAVqQGxUKPqXvo_ERiD5n06Q33a1XJg4DG1iAlKi3znxsEnvtMysZu5kRsKEV7e1Nt1-dv_h4ZV-PpcFlu--q_96i3JLkmCI3jQBd8ZdwM7dpfo6BinaK0F27LhoDNm7o44QQ1FwUse1KP_tRGuT_oAafQao8rwiWBy-Mr7EDlc5TZ3hHzmsc5gftcaAbY8oAgbRQENqOfhyZJcYf9nWlRQ0n-8Xf5msIbNsovzGL1gmNLpBrTbZr2MtMz9YVs58f8mMv6Wm4_eha1HMCfodf90zZnNv-b8_CbAoNff_MjguDvhAUabzJBteOoGLLv8WHb86gzTakmBYyTHTmzcfgXpyCrtXXPii4dgzNf9hVYQfQ6x5CgIR0c4DAvDK14Z21ZyHySOWCXVSgZ49DIl0CtRB3miQOGf8YHgoVm9hr3wIogs-qecApUspivIawZRNU_ufDMDCm4Ez9Rm37DST2QlyqJ26MHhUPe7LckSMQEVmhLzV3_PzW-mS_9oFHUBNHOLwVGx_wJEzZ39mQ_4xp-PoaxuU2ipveofsv0xmdHYH72O44gHtlxT_f6BDew=w958-h442-no?authuser=0' width=500>
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
!! Minimum Edit Distance
* Source word - play - down the left column
* Target word - stay - along the top row
* empty string place holder (#)
* ''Goal'': is to fill out the distance matrix D such that the D[2,3] element determines the minimum edit distance required to edit the string 'pl' to 'sta'. More generally,
:D[i,j] = source[:i] $$\rightarrow$$ target[:j]
:D[m,n] = Minimum edit distance from source to target
* Cost for each edit:
** insert - 1
** Delete - 1
** Replace - 2
[[Dynamic Programming]] - build on sub problems by combining solutions previously computed
!! filling the matrix
* # $$\rightarrow$$ # = 0 (from empty string to empty string -do nothing)
* p $$\rightarrow$$ # = 1 (from p to empty string - delete p or 1 delete operation with a cost of 1)
* s $$\rightarrow$$ # = 1 (from empty string to s - insert s or 1 insert operation with cost of 1)
* p $$\rightarrow$$ s - Three paths
** insert + delete : p $$\rightarrow$$ ps $$\rightarrow$$ s : Cost = 2
** delete + insert : p $$\rightarrow$$ # $$\rightarrow$$ s : Cost = 2
** replace : p $$\rightarrow$$ s : Cost = 2
** Minimum distance from p to s of all 3 paths is 2
:<img src='https://lh3.googleusercontent.com/JaPKkS_lC2t6kG84_TxgVlzjcicJRAdgdIDoo8rN2lEKjqVnKgvZ_cDb3OYRd7FUWX6t4C7rPpG8U1yiHYUgNW8JIXyshzaUcag3SxSV--QopmQOsHtP4HpKK3tUfoR-kbE934oZCyX0UhZcSFt2DUUMTKrn89uNwteNVVSzCxymyJ_MSqukAL1dRNBS8on0vHGLeOp5ktb4hT6D6IHOYpqNj0Gt_N5LS14RcECtMbZdfcf4C_KR8sPtuvs_lTCyNwIZs0BhZ3XhIYPcxYNHpsdIHTM0frok4dK6u6O-MtinJmTKjMhfr0cWsjnqeujixF4S4gXlTpm6vzmGwrxcYq4Tvvwf0XN1V7yd5ILD64A5pFLsZXSGpe0CwWvCk_U072ux2Ud1QPFgwLuHGNGe0HI89AiKnQydqhicZaS0JEW6sQJkX5pJkCpvLCtQthCaErjBVqNEFLbuqbOAYz2qTqVw-RkteLvNb-GbEl5qEceSIiUmiOutq9ByxU-q-hpm8laetlbf0nATmY2OAFKZA_KemNArVPyZB11o5Z_mRvoX8Kd7svHKD6MOSIe0jwwerMCI6xfbFZizx4yg20BcHwHTqaKTL-L0NTP_bOQ8VRcHQ0j9HiaOtSndmk2AukyRmR3-ZFY98vs1pdS6xbga9Qtkpx4bio9UKsY80RzGH4tbuf0ASiBLycJ7aSWbzvM4FVU_VWosX31IEf7fi8f6znt09Q=w957-h370-no?authuser=0' width=500>
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
!! Using Formulaic Approach to Fill distance matrix
* First fill out the remaining cells of left most column and top row
* From //play// $$\rightarrow$$ #
*# D[i,j] = D[i-1,j] + delete_cost
*# D[i,j] = D[i, j-1] + insert_cost
*# D[i,j] = D[i-1,j-1]
*#* + replace_cost; if source[i] = target[j]
*#* + 0; if source[i] $$\neq$$ target[j]
* Then take the minimum of these 3 paths to compute the min edit distance
<img src='https://lh3.googleusercontent.com/oi8CUxTvCIRpSLWTb0gxxQVR79WwpFDYEymAF8deaqHEVu1Vx8cNRyEr1EYrVBFEchuqWUbmPe_7Y6Iqeoidly3GCBVELP73zXgU4WLcDvT8hVJcAb999dy4U5pNUwgUPNamE_k66ah68PpJ808actXDgzyZTqT8uLBxTGuqmeoLpAwKETSk2m_s_biwUlb6-52_Kvm0LeeiR2NnITx0u6NK_4iyn_Q8kU_oJummU3kAXQfsI9iHwzsB1pHntJndBCUb2OKzgygljE9ymGZ3L9lt7gHlkCQzs7siS4TYKP-umIQYcZq7WT6QJVdF84mhf3WjkXP-tRwhjyCZv0-8rTli1RFMi9zR_bXwYOXOcUvIy8KHgxuGgqhIEh8S_u8vvQOHBelnoIOgfgUW7rttMLu-OZUnhAqgpn90usIedERk7OMV39_KUcBoabzGcgnbQtvAMVKwt2MeT6ulpHh4SOhMcn5ERjvhZDwHKPZkIfOpinDWxW6C-iXKHrelvmIzEBG9P8uaaMXEkgiB6BxTRFrYiZPV1E2rqFnXNLBG27SDCHZof34KC7ymhlbQvo9bRknRoIcniTK13PKZzCTvixLEwp6wG5yPnhnhif2QM0ACVFXRrJrayvjPF236wrxUU0QpkBGC3vT7Qu4ZgyBflKUrIHnk7S5Isbr_Rg4wE12SV3AT-L4cEbcWA6g258o14teJCgcPO0ywq068pKVdJh_yGQ=w966-h364-no?authuser=0' width=500>
Develop a heatmap and you'll see interesting patterns. The cost from play to stay stops changing from the middle square because two words have same suffix `ay`
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
!! Levenshtein distance
Measuring the edit distance by using the three edits: inserts, deletes, and replace with costs 1, 1, and 2 respectively is known as [[Levenshtein distance]]
!! Backtrace
Finding the minimum distance on its own sometimes doesn't solve the problem. You sometimes need to know how you got there too. Pointer in each cell letting you know path of minimum distance
!! 4Dynamic Programming
This tabular method of computation instead of Brute Force is called is a technique known as [[Dynamic Programming]]. This means solving the subproblem first, and then using the pre compute subproblem to solve the next biggest sub-problem, saving it again and reusing it again and so on.
,,[[Course 2: NLP with Probabilistic Models]] | [[11 September 2021]],,
!!! 1. DeFi transactions are atomic meaning that if there is a problem at any step in the transactions the initial money or data transferred is locked forever in the contract.
* True
* ''False''
!!! 2. Ethereum has externally owned accounts and contract accounts whereas bitcoin only has contract accounts.
* True
* ''False''
!!! 3. Higher gas fees occur when there is not much demand. The miners thus have lower revenue and need to raise gas prices to break even.
* True
* ''False''
!!! 4. Pending transactions are hidden in the mempool. We publicly see the transactions once they are approved by miners and show up in the Ethereum blockchain.
* True
* ''False''
!!! 5. Miner Extractable Value refers to the priority fees or tips that miners get for doing certain transactions before others.
* True
* ''False''
!!! 6. Equity tokens are ERC-20 tokens exclusively backed by stocks trading on world stock exchanges like NYSE, NASDAQ, etc.
* True
* ''False''
!!! 7. Which of the following are use cases for utility tokens: *More than one answer can be chosen.
* ''Collateral''
* ''Reputation or stake''
* ''Stablecoins ''
* ''Pay application-specific fees''.
!!! 8. Governance tokens represent the holder’s share of the asset ownership, very similar to TradFi stocks which represent share of company and voting rights.
* ''True''
* False
!!! 9. ERC-721 or non-fungible tokens (NFTs) represent the unique ownership of a unique asset.
* ''True''
* False
!!! 10. An ERC-721 token can be fractionalized within the ERC-721 standard so that, for example, many could share ownership of a valuable piece of art.
* ''True''
* False
[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[15 August 2022]]
!! Ability to Escrow
* Ability to escrow or custody the funds directly in a [[Smart Contract]] is an important primitive in DeFi
** This is different from the situation in ERC-20 when operators are approved to transfer a user's balance. IN that case the user still retains the custody of their funds which they could transfer at any time or revoke contract's approval
* In CeFi there is a bank/agent that is designated as escrow and we need to trust. In DeFi the escrow is built into the contract, which goes into the pool and you retain the share of that pool
* Ability to escrow can allow
** Retaining Fees or disbursing incentives
** Facilitate [[Token Swap]]s
** Market making of a [[Bonding Curve]]
** Collateralized Loans
** [[Auction]]s
** [[Insurance]] Funds
* It can become a risk when the contract does not have any mechanism encoded to release funds, so sending tokens to contract can become permanently custodied
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[06 July 2022]],,
!! Main Ideas
* [[Part of speech (POS)]] tagging is tagging a sentence with its lexical terms (noun, verbs, pronouns etc.)
* Applications include
** [[Named Entity Recognition]] - identifying nouns in the sentence
** [[Coreference Resolution]] - can Also capture semantics in the sentences like //Eifel Tower is in Paris. It is 324 meters high.// - can capture that ''It'' refers to Eifel Tower
** [[Speech Recognition]]
<hr>
!! Summary
Part of Speech Tagging (POS) is the process of assigning a part of speech to a word. By doing so, you will learn the following:
* [[Markov Chain]]s
* [[Hidden Markov Model]]s
* [[Viterbi algorithm]]
Here is a concrete example:
<img src='https://lh3.googleusercontent.com/Xc10weQqNzHQn3Say1HwXiSCzDU5CJzyRQU89DTVJU3GcBfM12L1vWoreJ1A9UsBhMYuPyG1soS-FcgKmiK9M98OG7NxYwa6-w0fvudJdLEHVS1UsxnVBWcPUFxrfFBBUmy2pqq-yLv_EXmhLvqVAIA8tX5pjDD3NMAPKulybIA88X7cjbtC6E3tgwLLvgc0_XfILiaYqkJYi_MolNch0YoW9_Y4VK5wzn8CJVpeZfO785JBpoNtpaft08ZW90MUCLKx1IFskrZ6TgNJIY_24WVM1iVaYF-TSogVufIYEfDta5C70ldGYiLZYncQEtCIZjleKGsBIoMQGhxawCAJonDHlsSXOPAuUCWyBQgIP3OZNDu_gyYoArqapA7zw86XhrwlWEZLQm-ADqh9zNu2mMpLSJGG221V4vLq7AdJh6u8jcl8BWwPoqOzlcMgpkNr5N31l7wN38B4GbBFbRUQsK52Dolr96z9eH114b6sw4cU2QPPzjTkrp7JdemYy16eEBv9aJTdUJoryJblpzBhR3AsnXSljJcvAa_WplNzmnCggYusfVtzmlTXO98Vw5yvGw7hNHnHEkQA2xYQFfRK7BCdUbvq0jffX_UxlvDr0jFPIxuzzRjoS4jMzcSFnTMEAumHz7vDx6rLO1A1UbRHjmX445_aCIChK89xhft_K7teOgvol4jIZBZg0aZi4crhfT_n0TXgMIxYAalnDND9fy4MAA=w958-h358-no?authuser=0' width=500>
You can use part of speech tagging for:
* Identifying named entities
* Speech recognition
* Coreference Resolution
You can use the probabilities of POS tags happening near one another to come up with the most reasonable output.
,,[[Course 2: NLP with Probabilistic Models]] |
[[18 September 2021]],,
!! Main Ideas
* [[Markov Chain]] is a [[stochastic]] model that describes a sequence of possible events. It can predict the next word in the sentence //Why not learn ...// whether it will be a verb or a noun
* Markov chains have states and can be represented as [[Directed Graph]]. The graph tells us the probability of next thing in sequence given the current state
* The state refers to certain condition at the present moment
<hr>
!! Summary
* Can use [[Markov Chain]]s to identify the probability of the next word.
* To model the probabilities, we need to identify the probabilities of the POS tags and for the words.
* The circles of the graph represent the states of your model. A state refers to a certain condition of the present moment. You can think of these as the POS tags of the current word.
* Q = set of all states
<img src='https://lh3.googleusercontent.com/RD3hBAcRe5Jqw3BCzG5qp7VkwQgNzqCFjBfVtZa8Tu2aGwBNkPvu5cHDJr0lwGfPLWFJM9hk1_VwTMw5-Mj0DpHW2HXOW1CpqdD_VB560wZ6QwhNB7lkapsqMOe_tdUg9AV8UqiNLNDTL-ujwVTSSsVghoWG9JdNguXWbMfR2ZZsWLUY-SFA7NB_WhUfdUuh7oZDliGDDWTFs6YoYVCvD2vfrxQxo-XVW1t5r2ACXi-VHGNwrKr5c_xxOkTRwGKdCfw4Wx-JKqtQ1g-qR2SoaVVwhjD9x43NqBFG4h1Zpib8gCnRUQiiEgJHq2h_2gQiRZKbyF4MbLTDJ-8ERE31u6I_QGJ9-buxWTyrLelHnh41zAeJjqpGwlxTFfogZ8c804aynUqFIetyISP7QRkBFWgb2jv4jpv98jLMPFuxN8b3qrBBjh_HFGIkCxo-q1wx0OrxGuVaEvd0u3Wtz-zvuyf5e88X8WG3tT4vzuEuB7KuWx04iWiJMvqJck6hAYgxw94CXm7RDUFKBdlF2_VDu5pqcmqgR1kFwHKQzbIpkRqRuW5f-a24iq0thh3m_oj3w2HOVLNb79YzixTU7F1HrONiiLZougzEiTkTaLDucpgg4_sN1_FG9-3jmWHFuCdWSci8cYlHHbdq5UYLW5M1juBL4_2yeWb_uNNg4eY24nFErZWv2xqb51m6S8tdZvMGdwY9Bx64iBRO8_AncqhkxvvY3w=w958-h373-no?authuser=0' width=500>
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
!! Burn
* Reducing supply or circulation in DeFi
* In CeFi, the worn out physical currency is burned and new ones are printed
* Burning can take two forms
** Send tokens to unowned address - no one has the private key
** More efficient is to create a [[Smart Contract]] that is incapable of spending them
*** This is more efficient because there could be ways in future to go from public key to private key while contracts cannot be modified
* Why burn in DeFi?
!!! Burning Mistake
* Sending a currency to an unowned address by mistake is a burning mistake
* [[Ethereum Improvement Protocol (EIP) 55]] - suggested by [[Vitalik]] - checksum to check whether the address is valid or not - transaction fails - transactions are atomic - resort to original state as nothing happened
!!! Why Burn?
* If you own 10% stake in a pool, say 100 ETH but you have one token for representation - while redeeming, you get 100ETH but the token sent to redeem is burned
* burning to increase value - less tokens - more value
* Penalize bad acting - bad transactions - stake or % of stake burned
!! Minting
* Increases the number of tokens in circulation
* No concept of accidental minting
* Rules of [[Inflation]] are known
* Can incentivize a user behavior
** Download the app - get 100 tokens
** Inflationary rewards has become a common practice to encourage actions such as supplying liquidity or using a particular platform
** Many users engage in [[Yield Farming]] - taking actions to seek highest possible rewards. Platforms can bootstrap their networks by issuing a token with an additional value proposition in their network
!! [[Bonding Curve]]
* An [[Algorithm]]ic representation of [[Pricing]] relationship between token supply and a corresponding asset used to purchase the token(s)
* Buy and sell of the bonding curve
!!! [[Linear Bonding Curve]]
* TKN = 1ETH
** 1:1 peg between token and Ether
** investors To support the project that they believe in - not to make a profit or loss
* m = slope, b = intercept
** 1st TKN = 1ETH; 2nd TKN = 2ETH and so on
** Monotonically increasing bonding curve rewards early investors - allows them to sell back against the curve at a higher price point
<img src='https://the7circles.uk/wp-content/uploads/2021/12/Linear-bonding-curve-300x227.jpg' width=300>
!!! [[Super-linear Bonding Curve]]
* TKN = S**2
* Quadratic curve - more extreme rewards for early investors
* Selling the token back results in burning
* It is not [[Trading]]
<img src='https://the7circles.uk/wp-content/uploads/2021/12/Super-linear-bonding-curve-300x218.jpg' width=300>
!!! [[Sigmoid Bonding Curves]] - [[Sigmoid]]
* Strong incentives early on
* More generally curves look like this
!!! Different Curves for Buying and Selling
* It is possible to have differing bonding curves for buying and selling
* Generally there would be a [[Spread]] - and the spread is kept by the contract
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[06 July 2022]],,
Two general types of Incentives
* ''Staked Incentives ''- Incentive to contributing to the liquidity pool
* ''Direct Incentives'' - Applies to user that might not be having an escrow balance so as to get people to actually use the system
!! Staking Reward
Some ways to implement this is
* Get a min balance to receive certain amount of reward
* Same or different token as liquidity pool ([[Governance Token]])
* Fixed or pro-rated
* For example, [[Compound Protocol]] issues staking rewards on user balances that are custodied in a borrowing or a lending position. Rewards in [[COMP]] funded by custodied supply of COMP, which has a fixed supply, and applied to all staked balances on a pro rata basis
* [[Synthetix Protocol]] issues staking rewards on staked SNX, its protocol token which has unlimited supply. The rewards are paid in SNX, funded by inflation and issued only if user meets a min-collateralized-ratio threshold
!! Slashing
[[Slashing]] is the removal of user's staked balance thereby creating a negative staked incentive
* occurs as a result of an undesirable event - violating collateralization ratio or malicious behavior, changes in market behaviors
* slashing is triggered by a slashing condition
!!! Ways of Slashing
* Complete slash
* Partial slash
* For example, One mechanism is to liquidate for collateralized loans
!! Direct Rewards
* Direct rewards are positive incentives that include payments or fees associated with user actions
* [[Ethereum]] transactions being with a transaction and all transactions begin with an [[Externally Owned Account (EOA)]]
* An EOA, whether controlled by human user or an off-chain bot, is off-chain
* This autonomous monitoring of marketing conditions is either expensive (costs gas) or technically infeasible
* As a result, no transaction happens automatically on [[Ethereum]] without being purposely set in motion
!!! [[Direct Rewards]] Example
* A transaction must be set in motion when a collateralized debt position becomes under-collateralized
* This use case does not automatically trigger [[Liquidation]]; the [[Externally Owned Account (EOA)]] must trigger [[Liquidation]]
* EOAs generally receive a direct incentive to trigger the contract
* The contract then evaluates the conditions and liquidates or updates if everything is expected
!! [[Keepers]]
* A keeper is a class of [[Externally Owned Account (EOA)]] incentivized to perform an action in a DeFi protocol or other dApp
* A keeper is rewarded by receiving a fee, either flat or percentage of the intended action
* Keeper rewards may also be structured as an auction to ensure competition and best-price. These are competitive because the information is public. They are rewarded for allowing the system to work as expected
!! Keeper Downside
* If [[Gas]] prices are too high, it may not make sense for keepers to work on smaller balances
* Keeper activity generates additional demand for transactions, which in turn increases the price of gas
!! Fees
* Flat or percentage based - funding mechanisms
* Fees are multi-dimensional (Means many different things)
* If the smart contract is open to any [[Ethereum]] account, the only way to guarantee off-chain enforcement or legal intervention is all debts to be backed by staked collateral. which is transparent and enforceable. Any other alternatives available in CeFi like reputaion are unsuitable in DeFi
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[06 July 2022]],,
!! Main Ideas
* [[Transition Probability]] is the probability of moving from one state to another. this can also be represented as [[Transition Matrix]] with dimension $$n\times n$$, where n are number of states
* [[Markov Chain]]s possess [[Markov Property]], i.e. the probability of next state is only dependent on the current state, which keeps the model simple
* For cases where no initial word or state is present, $$\pi$$ is introduced as initial state and the transition matrix is now $$(n+1) \times n$$ dimensional
* Sum for each row should add up to 1
!! Summary
To help identify the parts of speech for every word, you need to build a transition matrix that gives you the probabilities from one state to another.
<img src='https://lh3.googleusercontent.com/dWaP2zHZBUfur6-UuNpYramCpeeV4cundQr3qFSgC6Ib0nf5-yqsR9MpPKOslnCXDImvxzpemCD1_5dQsln0nfc2d_HFOT0EtIO_1kl9NiXCbWxbay_C0wueRMt5_ZRDowENauLA2Y9rxJecHFXEoOwmrXetye_AWypNczX8is4LFuXi0P4GPwGDfWUrZmnDDzL8qKcEdJqtlhxpPLiMo2vK24jdmZRB0ZuyEwpU887xiiO1u7PTc01FrAH3LexdFE551hm1Yl0KQZjAC3eOhY3afI1ZugAQPuNdJNoeqz9ULIwRkyql5j-Aj39Ip8Sv9MPrxfWrDcgvubPXXr8qM90AyRiA78HKlsyc3WWFBnODLdaS90RX_E4VV-dFU4s2KHwwUGnfAHnPHFR6vDs8iSqyHFVxlMkty-gjU6fhuuS0Dvh6iZHy_oFtVrVmOHCSLhRSUrT_y1dj-5gc601F7exZVrZCUlDm0gJGU95XO81bm_rJEnpiSGHOaXp5HkDapypQTQ8yYxdYpNscLr1b7w8AFpKZPAkGYXILnZzDkRJaCxoBWAh4BNrxPu7ccq1q0s0Prtzlb59ULdXLpIMoNBVK1K3BCsukZbGJDog3Ieb0N7KHZ55jfvpPgV7Vvmc9lSnyxNvflmEnTvaxz5ntkc0z5OESe0g4JxHO5O8_WGNHg04rZP6U2eup1QArVd9pBLAcev7-vguKeuuyYtWNmJgfrg=w958-h372-no?authuser=0' width=500>
In the diagram above, the blue circles correspond to the part of speech tags, and the arrows correspond to the transition probabilities from one part of speech to another. You can populate the table on the right from the diagram on the left. The first row in your A matrix corresponds to the initial distribution among all the states. According to the table, the sentence has a 40% chance to start as a noun, 10% chance to start with a verb, and a 50% chance to start with another part of speech tag.
In more general notation, you can write the transition matrix A, given some states Q, as follows:
''States''
$$Q = \lbrace q_1, ...,q_N\rbrace$$
''Transition Matrix''
$$A = \begin{pmatrix} a_{1,1} & \ldots & a_{1,N} \\ \vdots & \ddots & \vdots \\ a_{N+1,1} & \ldots & a_{N+1,N} \end{pmatrix}$$
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
!! Probability of a sequence
The probability of each successive word is the product of probabilities of all words that came before in the sequence. For instance, probability of sequence ABCD can be computed as
$$P(A,B,C,D) = P(A) \times P(B|A) \times P(C|A,B) \times P(D|A,B,C)$$
!! Sentences not in corpus
Since natural language is highly variable, the longer sentences are unlikely to appear in the training corpus. Use the approximation of bigrams.
For example,
* Sentence to calculate prob = `the teacher drinks tea`
* Instead of using
:$$P(tea|the \ teacher \ drinks) = C(the \ teacher \ drinks \ tea) / C(the \ teacher \ drinks)$$
:use
:$$P(tea|drinks) = C(tea) / C(drinks)$$
* Applying the [[Markov Model]] assumption reduces P(the teacher drinks tea) from
:$$P(the) \times P (teacher|the) \times P(drinks|the \ teacher) \times P(tea|the \ teacher \ drinks)$$
:to
:$$P(the) \times P(teacher|the) \times P(drinks|teacher) \times (tea|drinks)$$
!! Markov Assumption
* Only last N words matter
* Bigram = $$P(w_n|w_1^{n-1}) \approx P(w_n|w_{n-1})$$
* N-gram = $$P(w_n|w_1^{n-1}) \approx P(w_n|w_{n-N+1}^{n-1})$$
* $$P(w_1^n) \approx \prod_{i=1}^n P(w_i|w_{i-1} = P(w_1) P(w_2|w_1) P (w_n|w_{n-1})$$
,,[[Course 2: NLP with Probabilistic Models]] | [[24 October 2021]],,
!! Main Ideas
* [[Hidden Markov Model]]s model the probability of hidden states. They make use of [[Emission Probabilities]] - probability of moving from one state to another to a specific word
* This matrix is dimension $$N \times V$$
<hr>
!! Summary
Hidden markov model implies that the states are hidden and not directly observable. i.e. [[Part of speech (POS)]] tags are hidden and what is observable is the sequence of words
[[Emission Matrix]] - The emission matrix represents the probabilities for the transition of your n hidden states representing your parts of speech tags to the n words in your corpus
The transition probabilities allowed you to identify the transition probability from one POS to another. We will now explore hidden markov models. In hidden markov models you make use of emission probabilities that give you the probability to go from one state (POS tag) to a specific word.
<img src='https://lh3.googleusercontent.com/Z9NthLzrM_j8gJSdzqmSNaMqAsKn6mcZqjUuTiTHRCTkNlJpOrR0XjAzqbp0JjBldMC210fTZI8Lg1dc33SbVKRymAkm0psCz_BtPJ_9nLzLG6Jhd-Iu5EzeIYVFS21VJOUtV8Bbic65_FkgdMCNBT1xaxm719DCUbd55ptTbBZXJHcrBjf63hVBCkbmlr5RWs6ssOcF-6bFIdj7UQIPAVY5zjd4byE70k7ozLpawwBeJG7bATXzGBmpnpvLJSkU3IBWvlEKbNu1VFcwYS3OOWEsBOkwLWCezfcQPCg7pxtvhDjRfte-SGYstZB9w7dMkJ_mLV1uWJrowHmqHxm3DkYHXcQ5BArIFpaH0Ir2fgDo1Z5GXELjTbK9dT9NFZZhho3xtE1VSPnXuhS6b0870qc1C-xRdp2knUEItb8iTrIM_DfmB0ZdU8pawPXHJNhx44JugUdO5LpdPbPkUMnBiRyinzbMp3n-nFVKmEn5GEV0kLUdregqt2fg7Q-F6vF04ACcKNJcj132wGUF9YITZGM-fxQThHuAMvbdUVG2SfGTkw2DN7StpnkOfUDykeXgu6SI5IMvldIMwT74vqwl5tOV_V175Xvs5ODM1FkccTZEa5dg-5n_drVjrQ2qCn7KSfqpYZDaNvt_C1l9ghIKYyoz1MHAsIquJhKkWe1qqENseYvwH1l8cA_YLb-RZ9Y5Nau4EX2w4sgeyS4SLcpnGTRxjQ=w958-h317-no?authuser=0' width=600>
For example, given that you are in a verb state, you can go to other words with certain probabilities. This emission matrix B, will be used with your transition matrix A, to help you identify the part of speech of a word in a sentence. To populate your matrix B, you can just have a labelled dataset and compute the probabilities of going from a POS to each word in your vocabulary.
''States''
$$Q = \lbrace q_1, ...,q_N\rbrace$$
''Transition Matrix''
$$A = \begin{pmatrix} a_{1,1} & \ldots & a_{1,N} \\ \vdots & \ddots & \vdots \\ a_{N+1,1} & \ldots & a_{N+1,N} \end{pmatrix}$$
''Emission Matrix''
$$B = \begin{pmatrix} b_{1,1} & \ldots & b_{1,V} \\ \vdots & \ddots & \vdots \\ b_{N,1} & \ldots & b_{N,V} \end{pmatrix}$$ and $$\sum_{j=1}^V b_{i,j} = 1$$
Note that the sum of each row in your A and B matrix has to be 1
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
!! calculating Probabilities
* transition probabilities from states of Markov model - count all the occurrences of tag pairs in training corpus - $$C(t_{i-1}, t_i)$$
* Probability from moving to state $$t_{i}$$ given state $$t_{i-1}$$
:$$
P(t_{i}|t_{i-1}) = \frac{C(t_{i-1}, t_i)}{\sum_{j=1}^N C(t_{i-1}, t_j)} $$
!! Preparing Corpus
* Consider each sentence as new line
* Convert corpus to lower case - no need to remove punctuations
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
To populate the transition matrix you have to keep track of the number of times each tag shows up before another tag
<img src='https://lh3.googleusercontent.com/RqDIaj0rOz2dCe2UAoOm0kmZTNDNz247aJX5sK1GDqUXQ5Vtq8oLcJX3Vl3uUMBsLJWcSNZD3lXm9viB6qpUc5fi1Wq1W5qEVOCdaS4budPVwqW1GV8QA7yjoZ2FdgFDi1DU3E3dX650TsADEFNMyOBz8RY5Qm1PHnwxKg0QI17hE_-VzL87vO8MTMrj16Wf0cxCRmimvMpiUG1VenVYL3KBRQ5Q50dbMonQnJDSmDY_np8ZnVV7z563wdwEAKajdVjuv8lcDXYsOhd8QLReUTfYunvTDA-QgC4pbM3NFy4hRnsqgCPHwS21ujD2cdbKqNRJvLYyjl6srctoNLzFyrt1MpPpwQNWzm011pcWvBqD0v8JasC7n_BvDmwp25-cPQViISvw8gib-9PJem0NXKyLGFtA9UVfmLrzi2h5CVtyMOiQ-cDe_mWHbhTL3KtvZ8Qd6JVvs2JoaYPLCVWS-MNtij_YL2fir2dP20BrMmnvpSnkSzfLsnTeLcRZO6kzlgke-KeKqitdbvUNctFLL32HvyoePiA0Zcm2nXo9-suqEmLhY4zG7bUaPiA-IhDj6c_PzWszQoVZbSkb0ukmRh9WDtcXXBeJaVPZoWRtva8yukQgKNrX-Iv3jZr94I7O_NfJAwXLKMjf6iWL7beA-1YbhW59Dv1RKo6aFrkNFbI8p1kg8WO5mEcg2uTK3mwaVLXYSQtU34m-FNffYN3bi0T2Fw=w958-h273-no?authuser=0' width=600>
In the table above, you can see that green corresponds to nouns (NN), purple corresponds to verbs (VB), and blue corresponds to other (O). Orange ($$\pi$$) corresponds to the initial state. The numbers inside the matrix correspond to the number of times a part of speech tag shows up right after another one.
<img src='https://lh3.googleusercontent.com/x6QfqMIAWjjO0jEY1V3sbixETFJoSL9eVtS9BdSgCDoMn-Wsf81cJWUJVZVAIsgp3F-vChhK-CsizCCLtqTI5fq0nBwGzXDIqv5b6LfWmJ0GncXQq2dzyxKdCDi1toAq3OS3Llc9ygOuWnDKOda6K0SoIbYdrpoLWpf8ZSpZCPYwh9aL0fTcHXDvumxKnFk6t4_g2cI9KnBNz22oYQp23E06QqdL6wEV85xAoaRjLQvxKkLOQV7tTA7QO9XX4tJRO9aY2MTo3wnWbA7aw8W7UD4KF9YwvPKvbp1JLzrJUxry92DC6DDPSEVkiX27gAyr0e5vUL5MxpsQdloAN-ojsabCqMUj7zLpMpsE8BMzx709NFzx4fN7sKJOBXuxx3MlfjZo4REtPDtf9LBI6BZZ6eZRiq7qpcvM7wbeSMuvEProUiQAtMgiY08-n84uBvdwx-BDwij17VQthi-swUFCz-QuJ0jVmL8WYqWC95_e0ilRBKLBZhgVyTeQZBumZyfXqUmSOJfNT5g0Kljjg_xxHr7WfFTuMD4eVSSSc-kegNQdMsLvlO0e7WXXh0azIJzS1MV0QNaxuJuKiQmIjZ1Ydl4m9R_xqJbhbK17AChVe6dknlVdJiJgKXorv9wENYJMuqTCYHFzeh1FG8LeK7QobPmdGH7PGI2ZTnYfFzpBOsXRFiuM2ThLTJ8ehD_mefu9GO9JfM-ACXZYHdQ4g5ByZXS_ew=w958-h256-no?authuser=0' width=600>
To go from O to NN or in other words to calculate $$P(O|NN)$$ you have to compute the following:
To generalize:
$$
P\left(t_{i} \mid t_{i-1}\right)=\frac{C\left(t_{i-1}, t_{i}\right) + \epsilon}{\sum_{j=1}^{N} C\left(t_{i-1}, t_{j}\right) + N*\epsilon} $$
!! Smoothing
<img src='https://lh3.googleusercontent.com/pXwJTP7nj8SMsqsQccZHPBw3wZn8wxkhQVMjwlRwoiMBuURIsZDnytDayYgmf6drWd-iflN7BJCJVlaVj6k_Yia27tMQbkbzOGuy6o-xC1VuS2QmjD8c6RyIUK0mXFXnweXAerEalUBty-wmJf6Fh1K3NaVlYCwV3zgRpmAvdkKq1Nux4b42wyfQQEooN1f4ld7hh9akqkiYT2S4YfJkKroNX104mjdQ4CPnrgjxzbBkS5ONxdWNsXNAJZ7d7DhwEWGyv2-wgB5NTk6K17XVtWXcTblSd3_7TQr2TtU1IikDfuwqxGCm0CF17O4Ch7As9ELIkvWSM4NVY3eVjw2ydAD3E28rddedI-oZi0lVuuuCvfTmAd4ITNqetNGMvPk4ZsqK2aR59issLFKlDZey-38cwO3hyaOuFUp2uDgODnMyNrtUkxajIoTcvzLtw7HVu2UTEEDk6rpnqV8U5aIp_PaVeubinDnM7VQiNLm2f1vTL-FE-85mE3x4nAH5ZEcoXjTF8UllJUjTxYJkGaqoLYQY93FcvCV7TV1ZufVFwFXQTVqlLNc8tmDlue01ZP8C4JEMeIrsFwBi7E1V8rXPuZx9XqfWU6AIX967HrTz1oVsJJ_RZd5UbYg5VgbCAYFxDns3c_MBvVr9azGIq4zg-yH2OgEkXTcjfhWDhrFgSkJ34VykJRmqb_-xyQsiPZrxiLCTC9vrtwBtQD7cXS2B20LKAg=w958-h262-no?authuser=0' width=600>
Unfortunately, sometimes you might not see two POS tags in front each other. This will give you a probability of 0. To solve this issue, you will "smooth" it as follows:
The $$\epsilon$$ allows you to not have any two sequences showing up with 0 probability. - This is important so that the model generalizes well to other corpus where there might be non-zero probabilities.
Smoothing is not recommended for initial word, as you are allowing the sentence to start from any word including punctuation
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
!! Main Idea
Unlike transition probabilities, we count the number of co-occurrences of a [[Part of speech (POS)]] tag with a specific word. i.e. Count the number of words associated with each POS tag divided by the total number of words in that POS tag.
!! Summary
To populate the emission matrix, you have to keep track of the words associated with their parts of speech tags.
<img src='https://lh3.googleusercontent.com/pUWSvMVe9fW4Er4AnIIcud2buZErPLVS7kED-Hl1ZagR3L_wqH9RF96aUGQQi8-9U1qm3sS_HPo9rCuBvWmX3MYV-7q-Tl6z4QOsx1PLjVTPCuzhwMeo_74DkQ10b-KsBw8lvHQf9agIYwfspmjgGn2WJNr1gg7PMelJHdeNyCmK2JHEm86cJ1qnVVk7UI4yS0m0g5auTeqQAvWhALNUNIgjSQoWd8CJgN2vysK4WLk4EwEYosew5_TJ67oT7wW0kXPIF6-BHcrwtzFmPspO81uUjRfZGi9FX3I7De8A4AFFpb7xEoqs5VO0Dku140Tmm96TqwngaDbFMEX37xNgTkyKp2qUdhiz7aARSsqRfPELgADzC18L0sqGssH5oruj9L5WKA8DmRKfU1pxvwEzzwZmG4Rjs6rYe8XRbzMKdAR9CKZNTIiL2WRJc0HvHkREU-ytodpGcBHDbuQ6q7q2_AU2syG4tCPgEuPKuU5_HC2fpZqWgK0kuXH5PXJGR6iugjvow9syaLCPRE5LcCQdPCBCOp0qbssxwIIehdabmJ6-Pqd5Bi-eHPL8TDyy7_jZ_Gqj6woVx8BV1ixz_OS-HsAp8pcOgJnZtbPiBtqji3cVxwy_F9CZX4TSps8VZRy-LcwYEcLqLghJScMmq5ElGp-5Cmo95x7I8TQC1aqSU1Z-JFyB3WfUXQUnc3JiRkt9TATvfW8FCOLac2ikCRzZ8h4fdQ=w960-h257-no?authuser=0' width=600>
To populate the matrix, we will also use smoothing as we have previously used:
$$
P(w_i∣t_i)=\frac{C(t_i,w_i)+\epsilon}{\sum_{j=1}^V C(t_i,w_i) + N* \epsilon} \\
= \frac{C(t_i,w_i)+\epsilon}{C(t_i) + N* \epsilon}
$$
Where $$C\left(t_{i}, w_{i}\right)$$ is the count associated with how many times the tag $$t_i$$ is associated with the word $$w_i$$. The epsilon above is the smoothing parameter. In the next video, we will talk about the Viterbi algorithm and discuss how you can use the transition and emission matrix to come up with probabilities.
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
[[Viterbi algorithm]] is a [[Graph Algorithm]]. Computes joint probabilities of several paths in the graph at the same time in order to find the most likely sequence of hidden states
<img src='https://lh3.googleusercontent.com/CmiXjOMdgjCQDDlR4ghFV3jeuOMANrMoE4tPauZlDOM9Tm3xpG507pptF0mhQ60EgfrAMxqiky9uatPXdDaP1m_a3KXnkduRdZwgyYtOi3SqVxuFmLE0yCXLnT7p1bI5DXsy3r8DwNa6L8ZK7MQXogSvdtnYmCj8kI-L8pYu4EGlJP62yMgrexzZO0gUHHkx-Dy4EID3ckLt_X_N_OPgGEKdGClblcsMW-snQDFT7zvEmmXxB8JUpICZt_WxaCmbCSs6v44UBZ-T4aDm3X6rMHPyixDzlG4daXJMVMQH8uDlKzFe-EQF1dCqot4aPQ6gtAxvz9AJ7C1ABbwqPMg0lM3Q3HP9k2DcNJyy0cyl4JKhBjgNQ6kZNezK7Tj_vu2IvRUfpMkEoAB8bPwKXeDbBIF4mCi5wLyJA7T_Si49v5CLEc0VdmWCRcBUEdirDMdT0LpSitmY7_mKaO_HzRlYkk3MGBDOWbop69qX66BTvT7Ae5Bcp2JsHSFqQgDB2HkV2yqCiT7PMGJ8pwKKwRy4PyW2ooBvIiZPDxbl3cHKFBaZbWVvFeRzFgtAb9ek1fNCKPnIfRxur1w7hzrOUi0b5mJaGA8_hwlfr-9G_AGqFAmVaZL_wN8WASNvcA882su3uzbm5WFBMJ62Wryg7qp1JCizvmZF_zqqzRz2_mxMSQxEutZJo2oNztRmzi0ue6nCVtw6KjDk0xPmdr0ewvsVwuvr5g=w1920-h683-no?authuser=0' width=700>
The algorithm traces the path and selects the one with the highest probability. The probability of a sequence would be the product of highest probability paths
!!! 3 main steps
* Initialization Step
* Forward Pass
* Backward Pass
Given [[Transition Probability]] and [[Emission Probabilities]], you first populate and use the auxiliary matrices C and D.
* C - holds the intermediate optimal probabilites
* D - holds the indices of the visited states
* n rows - n is the number of POS tags
* k - number of words in a given sequence
,,[[Course 2: NLP with Probabilistic Models]] | [[18 September 2021]],,
Initialize a matrix to estimate the probability of POS tag of every word.
!! Initializing Matrix C
* dimension (num_tags, num_words)
* Probabilities of word in POS tag
* During initialization , only populate the first column
* Multiply the initial distribution to the [[Emission Probabilities]] in the matrix B
** $$i$$ = tag of initial distribution
** $$cindex(w_1)$$ = index of $$w_1$$ in the emission matrix
$$c_{i,1} = \pi_i \times b_{i, cindex(w_1)}$$
As the initial probabilities are stored in the first row of transition matrix A this is the same as
$$c_{i,1} = a_{1,i} \times b_{i, cindex(w_1)}$$
!! Initializing matrix D
* To keep track of which POS tag you are coming from
* Allows you to store the labels that represent the different states you are going through when finding the most likely sequence of POS tags for the given sequence of words $$w_1, \dotsc,w_k$$
* Initialize the first column of matrix with ZEROS, because you are not coming from any POS tag
* $$d_{i,1} = 0$$
<img src='https://d3c33hcgiwev3.cloudfront.net/imageAssetProxy.v1/JbG0gpqSTWWxtIKakj1lkQ_96118449ece645ea9432333f081a8e91_Screen-Shot-2021-03-10-at-2.56.00-PM.png?expiry=1635120000000&hmac=y11upEe4v9OJATJAIVKZYoVVzFSorVTHOUmw70KEb5o' width=700>
[[Course 2: NLP with Probabilistic Models]] | [[19 October 2021]]
* 2nd of 3 steps in [[Viterbi algorithm]]
* populated column by column during the forward pass
!! Populating matrix C
$$c_{i,j} = \max_k c_{k,j-1} \times a_{k,i} \times b_{i, cindex(w_j)}$$
* $$b_{i, cindex(w_j)}$$ = the emission probability from tag $$t_i$$ to the word $$w_j$$
* $$a_{k,i}$$ = transition probability from POS tag $$t_k$$ to the current tag $$t_i$$
* $$c_{k,j-1}$$ = probability from the preceding path you have traversed
* you choose the $$k$$ which maximizes the entire formula. In this case, there are three states that are not initial states, hence $$k$$ can be 1,2 or 3
:<img src='https://lh3.googleusercontent.com/dXECo-tdn-lZQRm3P_mf8vbRWBXvLA4WNWEM6OTG7TNzxDMC9E0BqCGDPpEAo-lElExgIQKO89TH-033cB-4sKOR8jpvdodcvMV-ZsM7MrkyAC8y3ZR8gPDiJ8P-eT16fQZOylgTJZoH-tl7CPsGfu4uIpyu7Ln-IOHET5gbKVlEHhYfWW-xPN5Ls5Fd2VOqXxAJgY8mdTZX55vvErzSoB8KG4rsA_v7KpB8x6nXjIOehwEUIFvK2xW1TNGCB4ipKtBEJ0Em_sBnxInfJBBJ-d2-eGQ8o7qr4MLth1Vg7iqEDAy-mlCe2H1ZDM31CJNRJFmYB_HYISpHGGrOtisIbZpMj2uO90KORfGYoOxDl82qCr_WI7VDX92uUx4_WhZQzL5kAcenOb6QfjJ4TcH0Ub7WR0VGeUvLh-JzyXl_BGkUzbM6efXLM_f3C26yZ4pqA9JhIjPm0AlV6gBPux0xNnYK6x4r1p9PglQmVktb1Q4X9jPVKPW_RxSa8rMhMjrYykRi76BYwSNuz_Cl5JHkcYG-Oyxfh98Ng--hDYy5IbxsE8sj6RrbOxqAdtypY2dIwYLg1-hPJCFoXKQzmUh6vO1sraOkvrOiUpjIVJjxqfrEavFfWKKj-T5cBnXfoHdyMWMQoIgMJygzT1JZzmeTR3dFEg1bUJPmoY9z2Cj5Rtj5YFzFChYpjFjzepmLAjvw5ht2Uhn6HXMhCpKVN71rn7Yrdg=w958-h349-no?authuser=0' width=700>
!! Populating matrix D
In each $$d_{i,j}$$, save the $$k$$ which maximizes the entry in $$c_{i,j}$$
$$d_{i,j} = \argmax_k c_{k,j-1} \times a_{k,i} \times b_{i, cindex(w_j)}$$
,,[[Course 2: NLP with Probabilistic Models]] | [[23 October 2021]],,
* 3rd of 3 steps in the Viterbi Algorithm
* Populated C and D in the previous step
* Extract the path from the matrix D to identify the likely POS tags which gave the sequence $$w_1, \dotsc, w_k$$
!! Process
* From the matrix C, get the index of max probability from the last column i.e. $$ s = \argmax_k c_{i,k}$$. The probability of this index is the probability of the most likely sequence of hidden states generating the given sequence of words $$w_1, \dotsc, w_k$$
* use the index s to traverse backwards to get the most likely sequence of POS tags
:<img src='https://lh3.googleusercontent.com/L_utxxmpHZFq80r212l0I8J8LYdxi7T30r4tBo8Vtv6PjBKWcmhlFtvqhxhBVQCW2B4gdg3K-J5uFbr4E0K9arYtnt8iVDjex3vZfizCeSCFV2MLkagdrAkii4llZ1RTPTIQpNXv1hWVYdkae1Kj0HrT0W5bElv4ds0kwROy5KDoMNWMzAsZ-veSp5qXFjNkdLJakQgizNNxyYcSBTxHz9Pfs4QewAZ5u9dG9zoCYZxtPw_CozlyPSeVUNHZMZC5odZEGEtWVw9YnNqS5ekTHUcjeNFOnNP35OWvo337axIhu892r-Yg5JrFgLXhl_7tMIzSX9aAnw0NQKCUsWhh_Yy0We2_m5UC_cQlcKversAibKCLYF5wdL34r6tRkMiB_8c7AvFDyp_HUL-3dDmFfR5jAhxSoJlC9TvuC3mR1QwgO5O4nuRhjNlIs9S2QS01z_LKull5YleJqV5yNATgUp5oJgcxDlegPYT0jcWk0t2rW7Z9rH3OPOvoXasIcYHbZwBeMgKQHC2LEVovLxNndKtZFqN2z1BVJ58DwJaeSVBXrOjSHtJeDUuOXoUUQzRcjGTlVcrFphrq_Yu05o5PDYB38DBPDglwvHJBObBg2x4m3s0sZj85YhNvdXfj5LSpsQJjBQNeNCv8vNTJpv6LpiZU16s7b2n680OfKtvedmLq_oFo1x5l5NPRJxmTvmnlt3q0tldVgNHrJV2F0GEf2QNoTg=w959-h330-no?authuser=0' width=700>
For example, given matrices C and D of dimension (4,5) - 4 POS tags and 5 words $$(w_1, \dotsc, w_5)$$
* D stores all the labels of the hidden states traversed in the forward path
* From C get the index of max prob in column $$w_5$$, which is $$t1$$. This means you traversed the last hidden state $$t_1$$ to encounter the word $$w_5$$
* Look up the next index, this time from D, which is 3 in column w5. This means your last hidden state was $$t3$$ to encounter the word $$w_4$$
* Then going backwards t3 stores value 1 which means the last hidden state was $$t_1$$ to encounter word $$w_3$$ and so on once you reach the initial state in $$w_1 = 0$$
<img src='https://lh3.googleusercontent.com/VNZqj-fWE-e-6TMICpmF6JUEh2f4H-apw_XgEuWvjKrvcq10ku7RH3RKsdn-g7I_g3Pb19qSNayweyVKv-JoO8FQotd7N6ju5vQL9wgJSZRrIixi5K7drjTyoxjnkDFPNuCGfjtVVzDOcMvVa3eBs0TA1_lRgyr2vn2oh4muHBILz9ssOI4e-un2xFHPQYcM-j_VHl4-5PdManEMUTt7G0SdLJ3ABMDk50hJByuAzS6X1d37h_9dTBFkyUu_mQ68ujx9M1MKiyNSrSgNKgaI1z1SewdXAWnFtd-LY3g2gawgP5lk9QT6obqeBsZAwZSSQsf8bqElic5K5iyjMveFixEyvzsgiYf-WagIKh0hvs5FC3wOzlERXfkSHhOJGB_GTRnf5Lb_r-U5E92TAVNhlWRqzA1XC5HjvraDCzQW18TdeLECnCAiFkGHyxuBl2s_IKL58XbS3oK_GIuOzWRKFWIG46eKF0CCZHA3WowKwRWGjx_-FcwReQQT12VlBW8-UKKOyIGVzdT7CGYa-ev_uFYkE18DyxVRTPpld7kTkK-qnK9NolqgJy9-jPAXk4gbt-I-v3acm4NQYkHLSMradKnICY7ROibo2bEGmOON4leITy9yY9DcUfKViOwAEod4-FoWjc6o9fX1n1UI0RebAYZm2u54vPqWf-Bni0Ub1RrOI0bqJKcFlMj5g8_7E1gF37jjHHdkBeVMXI1mPKtsdR-ABg=w959-h251-no?authuser=0' width=700>
!! Implementation Notes
* [[Python]] indexing starts from 0 instead of 1
* [[Numerical Underflow]] can be observed when multiplying probabilities, so instead use summation of log probabilities
!!! 1. There is no risk in escrowing funds in a smart contract because you can always get the funds back (atomicity property).
* ''True ''
* False
!!! 2. Burning a token is accomplished by altering the private key (e.g., interchanging some of the bits).
* True
* ''False''
!!! 3. Minting (or inflating) an ERC-20 is done (for example) to represent new ownership in an asset pool or to reward user behavior.
* ''True''
* False
!!! 4. Linear bonding curves with positive slopes make it more expensive for the first users to buy a token.
* True
* ''False''
!!! 5. The two main types of incentives are: staked incentives and direct incentives.
* ''True''
* False
!!! 6. An example of a slashing situation is when a user’s staked balance is reduced because of an undercollateralization event.
* ''True''
* False
!!! 7. Keepers are triggered algorithmically and are part of the smart contract mechanism.
* True
* ''False''
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[15 August 2022]],,
!! [[Token Swap]]
* Exchange of one type of token to another
* most popular way is through centralized exchange like [[Coinbase]]. Like exchange of [[Stock]]s
** But unlike stocks it can be token can be swapped on any exchange
** Need to be careful about exchanges - price could be different on different exchange - Arbitrageable
* Fake Exchanges - incentives to exaggerate volumes to make them look legit. Over 90% of trading volume is fake. Use govt regulated exchanges
** Buy and sell prices similar
** high spread between bid and ask price
** Hours of zero trading
** Volume is constant - has to have some seasonality. Long tail distributions. Spikes at round numbers
** Exchange volumes are correlated with other exchanges - fake ones are not correlated
* <5% of the volume is real.
* this is centralized. [[Coinbase]] and [[Kraken]] are no different than [[Stock Exchange]]s like [[NYSE]]
* Centralized exchanges are businesses, while the Decentralized ones are [[Algorithm]]s
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[29 October 2022]],,
* Create an [[n-gram]] model using a text corpus
* [[Language Model]] is a model
** that calculates the probs of sentences (a sequence of words)
** that can predict an upcoming word given the history of words in a sequence
* Build [[autocomplete]] system
!!! Other applications
* [[Speech Recognition]]
* [[Auto-correction]]
* [[Augmentative Communication]] - series of hand gestures (sign language) to words for example, [[Stephen Hawking]]
!! Learning Objectives
* Process text-corpus to build a n-gram langugage model
* Handle Out of Vocabulary text on unseen data
* Implement smoothing to estimate probabilities for unusual words
* Evaluate the language model
,,[[Course 2: NLP with Probabilistic Models]] | [[23 October 2021]],,
* One benefit of swapping in [[DeFi]] or [[Decentralized Exchange (DEX)]] is that transactions are atomic - revert to the original state if the transaction fails.
** Centralized exchanges can stop trading
* In centralized exchange - you have to connect bank account to transfer money to first buy crypto. The private keys are held by Coinbase. Transfer may take 2-3 days
* In DEX, like [[Kyber]] - you only need to connect your wallet. Transactions are conducted on chain. For now these are expensive as gas prices are high
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[29 October 2022]],,
!! [[n-gram]]
* An n-gram is a sequence of n words or characters or elements.
** Focus here is on words
** punctuations will be treated as words, but other codes will be removed
For example
* Corpus : ''I am happy because I am learning''
* [[Unigram]] - All unique set of words in the sentence
** `I, am, happy, because, learning`
* [[Bigram]]s - set of 2 words appearing next to each other
** `I am, am happy, happy because, ...`
* [[Trigram]]s - triplets of words
** `I am happy, am happy because, ...`
!! Sequence Notation
If corpus of text has 500 words
* $$m = 500$$ : max number of words in corpus
* $$w_1^m = w_1, w_2,\dotsc, w_m$$
* $$w_1^3 = w_1, w_2, w_3$$ : refers to first 3 words
* $$w_{m-2}^m = w_{m-2}, w_{m-1}, w_m$$ : refers to the last 3 words
!! Unigram
* Corpus : ''I am happy because I am learning''
* $$m$$ = 7
* $$P(I)$$ = 2/7
* $$P(Happy)$$ = 1/7
* More generally, $$P(unigram) = C(w)/m$$ where $$C(w)$$ is the count of words
!! Bigram
* Corpus : ''I am happy because I am learning''
* $$P(am|I) = C(I \ am)/C(I) = 2/2 = 1$$
* $$P(happy|I) = C(I \ happy)/C(I) = 0/2 = 0$$
* $$P(learning|am) = C(am \ learning)/C(am) = 1/2 = 0.5$$
* More generally, $$P(y|x) = C(x \ y) / \sum_w C(x \ w) =C(x \ y)/C(x)$$
** $$\sum_w C(x \ w)$$ - count of all bigrams starting with $$x$$ can also be written as count of all unigrams $$x$$
** only works if x is followed by another word
!! Trigram
* Corpus : ''I am happy because I am learning''
* $$P(happy|I \ am) = C(I \ am \ happy)/C(I \ am) = 1/2 = 1$$
* $$P(w_3|w_1^2) = C(w_1^2 w_3) / C(w_1^2) = C(w_1^3) / C(w_1^2)$$
!! N-gram
* $$P(w_{N}|w_1^{N-1}) = C(w_1^{N-1} w_N)/C(w_1^{N-1}) = C(w_1^N)/C(w_1^{N-1})$$
,,[[Course 2: NLP with Probabilistic Models]] | [[23 October 2021]],,
[[Automated Market Maker (AMM)]] is a [[Smart Contract]] that deals with both sides of the trading pair. Quotes prices automatically. Executes within a contract according to a rule
!! Fixed Price Ratio
* Eg. 100 TKN = 1 ETH
* If the value of TKN drops in one market, the cheap token would be bought heavily in one market and ETH will be drained from another market because the ratio is fixed
!! Composable Liquidity
Any exchange contract can be plugged in to the liquidity and exchange rates of any other contract. Can build [[Trading]] systems with tokens available on ETH [[Blockchain]].
!! [[Impermanent Loss]] - Risk of Naive AMM
* E.g. Two tokens A and B, where A = B = 1ETH. A:B can be swapped at 1:1
* Pool has 200ETH composed of 100A + 100B
* If A becomes 2x and B becomes 4x . The value of the pool is 6x
* however, once B increases in value, traders will swap A for B, decreasing B and increasing A for AMM. The value of the Pool is 4x.
* this means,6x-4x = 2x or 200 ETH is the impermanent loss. Opportunity cost of doing nothing
!! Impermanent Loss with Uniswap 2.0
* ''Constant Product [[Automated Market Maker (AMM)]]''
* 1ETH = 100DAI
* Pool has 10ETH + 1000 DAI
* Liquidity of Pool = 10 x 1000
* If in open market the price of ETH goes up, say 1ETH = 400DAI now
* Now Arbitrageurs, see this opportunity, buy DAI in open market, use DAI to withdraw ETH, but this time upto a point i.e. after draining 5ETH they stop because at 5ETH x 400 DAI = 10000 (liquidity product is 10k)
* Original INvestment = $200 (1ETH + 100DAI)
* Final Investment = $400 (0.5ETH + 200DAI)
* Impermanent Loss = 1ETH + 100DAI = $500 (because ETH inc by 4x) - 400 = $100
* Not accounted for fees for providing liquidity
*''Impermanent loss'' happens for any shift in price
* So most attractive pairs for AMM are the ones with [[Correlation]] in price - [[Stablecoins]] pairs are attractive for AMMs
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[29 October 2022]],,
!! beginning of the sentence
* Corpus : `the teacher drinks tea`
* Bigram : $$P(the) P(teacher|the) P(drinks|teacher) P(tea|drinks) $$
** For the first word, there is no word preceding the word $$the$$, hence, you can add start of the sentence character `<s>` to the corpus
** $$P(the) = P(the|<s>)$$
* Trigram : $$P(the)P(teacher|the)P(drinks|the \ teacher)P(tea|teacher \ drinks)$$
** Add two `<s>` at the start of the corpus
** $$P(the) = P(the| <s> <s>)$$
** $$P(teacher|the) = P(teacher| the <s>)$$
* N-grams: add $$N-1$$ start tokens `<s>`
!! End of the sentence
* Corpus: `<s> the teacher drinks tea`
* Helps in the model generalization
* Attached `</s>` to the end of each sentence in the corpus, which helps in computing probabilities for a sentence of any length, including identifying the probability of when the sentence will end.
<img src='https://lh3.googleusercontent.com/RYbTZo6k0EGeh36l_4z7vBEf-i1rtuy63zxPSB2x0gSo3MXbaA9grF2-7suTLtTGXk4MjFG4g2aqQpPn91qD0tr7ySHIulB8xoD4FVTcdvcbBdZYC6Efn7XLaxEh9WXSyzhBx-yhfjj2kcodCzILeRpN-Xtw8ehkj-MrjqSPD5sS9wyQzjFiBC7wMsjD2GYKHLwjVCx3biy8qrJlwRiPCDcqwOLrNmXXuQ-zmPncsO8c3g_2fvxnU0-jCLgwithVp_iFi4qt7r9pJDtdCcJiw7gfm-zwxCpQrg48Xr-mE8tihJMdKSn-FAY2wgzqjUnukQYmjb3ZwFRDsVY4wAZxnGioA6tXAeXF-rQm3h9H92-kMFNgf5tE8xsXX5L_eemTvautYXnIStDUDlBalyhYkcJ4oUHX8PIlkrE2WZDFdtiKiqE1MRJYhThuk8zdOlcc0lJ2McgepHtcuYSHBjDbyvJC7LvQhP0ARtvZBOntgaKngxPs2lqEg3ujSrR_Ci_p6kt5EofFRMCiXSml8fiKZcAb6l17F5E3Z0QLJ7UytxXexHVJJHnOxOP1essqfS8_-aPOCDdy7kEItgSLlTHZIr9c_KCtcecWY9K6vDjU4LkqXclqwQQd9dVl7yEyn05jWUhLaubT4-jo1YeIEmwLOs6lDsTaoZPbGvX7snfF21VkGmMtw07lf-Pl8q3UobnUIkQLDj_8-hV0Vx6OZ1sFqrxUkA=w1921-h746-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[24 October 2021]],,
,,[[Course 2: Decentralized Finance (DeFi) Primitives]] | [[06 November 2022]],,
!! Outline
* Generate Count Matrix - process the corpus into a count matrix that captures the number of occurrence of relative [[n-grams]]
* Generate Probabilities - transform the count matrix into probability matrix that captures the conditional probabilities of [[n-grams]]
* Relate the probability matrix to the [[Language Model]]
* Avoid [[Numerical Underflow]] using log
* Generative [[Language Model]]
!! Count Matrix
$$P(w_n|w_{n-N+1}^{n-1}) = C(w_{n-N+1}^{n-1}, w_n)/C(w_{n-N+1}^{n-1})$$
* Numerator in the above formula
* $$n$$ : where the n-gram ends in a sentence
* Columns: Count matrix captures the numerators for all n-grams in the corpus
* Rows: unique corpus (N-1) grams
* Bigram model - count matrix
* Corpus: `<s> I study I learn </s>`
:<img src='https://lh3.googleusercontent.com/NnBptIP8F4ncTciPF9cU87RhqZu1wi0gRIm8p0gZNpK_3tk7Eqa_aBzcpkZ2bXEz_QuSMfjGm5cAga-HuDAxymGJoyeb2_X899VfH7TLM1QxO-WK_b53nS8L4YXE_kD8-U5yFokUbyzxq3Y6OugFz1A5dbnnhZZyyue-ABdLe0el4M0riD_altxiZJYx83ijSU85S47XvtK-2gBHg7TIleXaxhuv9UY82qto2xYUhC2z79rvjJ_X7iOIe9dZMuLQ1tATMX-jdG6-Sw4pJNCoYeCgUN97PRzh87WGd7rkpdGV9cySNeQ8z86UcKt0c16dtXM2YNBHm3vUTclWABIC8I0fFfRAMprVKNzPwIU4hBzf1WoNLhdxvO2H7prPp3miYnbpdNrSJfEOEd1pHTJht_yYBW_DBf0E0IDaxnEggrSacGSeMR9aAMLYL2HW_Mv2fNfeucpIvRBhfedqdSP5tlIz5WlB7gC3xHxzFqQWoliyC0WbXLynz1wgu6CmRDlK-iF6AsleX2msdvyNcfXWu-BEksPJbkgrri8zY3CLbZ7AStOKDs0C-2XsBNXR9SdJmRFk9h8szpg-58AINx1GF2QsVCoRCe6uRikuRG0VlE-xULaeOKeX96CvuVMhO6Nt7rcxGJM9RIrNC16AU3YCA3Huq15tdTojMpDnhexeGHLETY_4s7u9n3x8QkVANLLVuPUalTIuWUpVjVH4H-c7tJBSBw=w1560-h381-no?authuser=0' width=700>
!! Probability Matrix
* Denominator in the above formula
* Update the count matrix by computing the sum for each row
* Normalize each cell
!! Language Model
* Estimates the probability of sentence by splitting it into series of n-grams and then finding their probability in probability matrix
* Sentence probability - `<s> I learn </s>`
**$$P(sentence)\\=P(I|<s>) \times P(learn|I) \times P(</s>|learn)\\=1 \times 0.5 \times 1 \\ = 0.5$$
** Next word probability
!! Log Probability
* Multiplication of lot of small numbers leads to [[Numerical Underflow]], which can end up causing errors
!! Generative Language model
* Randomly choose among all bigrams starting with the start of sentence token `<s>`
* Choose the next bigram starting with the previous word
* Continue until end of sentence token is picked `</s>`
,,[[Course 2: NLP with Probabilistic Models]] | [[24 October 2021]],,
!! Outline
* Divide the dataset into Train/Validation/Test
* Use [[Perplexity]] to evaluate language models
!! Test Data
* For Smaller Corpora
** 80-10-10 for Train-Validation-Test
* For Large Corpora
** 98-1-1 for Train-Validation-Test
!!! Split Methods
* Continuous
* Random short sequences
!! Perplexity
* Commonly used metric in [[Language Modelling]]
* Perplexed - confused by something very complex
* A text written humans is more likely to have a lower perplexity score. A text generated on random word sequences would have a higher perplexity
* $$PP(W) = P(s_1, s_2, ...,s_m)^{(-1/m)}$$
** Compute the probability of all sentences in the test set and raise the probability to the power of 1 over $$m$$
* ''Perplexity'' is the inverse probability of the test set normalized by the size of the test set
* Higher language model probability of test set, lower the perplexity score and better the model
** $$m=100; P(W) = 0.9 \Rightarrow PP(W) = 0.9^{-\frac{1}{100}} = 1.00105416$$
** $$m=100; P(W) = 10^{-250} \Rightarrow PP(W) = (10^{-250})^{-\frac{1}{100}} \approx 316$$
* Good [[Language Model]]s have perplexity scores between 20-60 and sometimes even lower for English
* Perplexity of Character level language models lower than perplexity of word level language models
* Closely related to entropy which measures uncertainty
!! Perplexity of Bigram models
$$
PP(W) = \sqrt[m]{\prod_{i=1}^{m}\prod_{j=1}^{|s_i|}\frac{1}{P(w_j^{(i)}|w^{(i)}_{j-1})}}
$$
* where $$w_j^{(i)}$$ is the $$j$$-th word in the $$i$$-th sentence
* Compute the probability of all sentences with the bigram model
* Product of product of probabilities of all sentences
If all sentences were concatenated then the formula can be updated as
$$
PP(W) = \sqrt[m]{\prod_{j=1}^{m}\frac{1}{P(w_j|w_{j-1})}}
$$
!! Log Perplexity
* Researchers also report PP(W) as logPP(W)
* Perplexity scores between 20-60 can range from 4.3-5.9 in log terms
$$
logPP(W) = -\frac{1}{m} \sum_{i=1}^m \log_2 P(w_i|w_{i-1})
$$
!! Examples
* Unigram Perplexity > Bigram Perplexity > Trigram Perplexity
[[Course 2: NLP with Probabilistic Models]] | [[02 November 2021]]
A [[Vocabulary]] is a set of unique words supported by a [[Language Model]]. In [[Speech Recognition]] and [[Question Answering]], the output is generated from a fixed set of words.
* [[Closed Vocabulary]] - fixed list of words like in [[Chatbot]]s
* [[Open Vocabulary]] - may encounter words outside of the vocabulary. eg. Name of a new city in the training set.
* [[Out of Vocabulary (OOV)]] - words not in the vocabulary - replaced with `<UNK>`
** Process the training corpus to generalize it for unknown words
!! Processing
Can chose that the min frquency of each word in the training corpus should be >= 2 and replace words that only appear once with `<UNK>`
<img src='https://lh3.googleusercontent.com/hMMFDlh0qwXWp7wVAJP1ccwP1XbkZmCWUUnssuAmTu9ixnJm-a2kTuOkLwC0h6VsqAYuL3Aoz8Lppq6E_FTIf7mb4LsmBQrU0vV1XLg4WH_mk2zybWnnxaLw-yl76FOL_Bd_d5S7YUTGN2AM1F2EdDru1rOMU1nu2FbxqA5UHTH5RPe1QsvUYdSnaEpFt5oYJPyF-UW_o0GLdd050Tde4Mc93x3ANTs4dgAcaWdr5BcEfEJJoX1eN0iX4qCBCqpc1b1ET0gm4QJispvSeVxSlIPHZ7_vwq6YqHStq6CiSpyA3TT8UTVvcsdlNJG_iWKtl8q6uIPDjXhzcyfPggsfsAJZIvdmoBxSgbi54GD2hC8ZZlyFYZKf2IGWI_1BRmBLjCvBO-Z7btbVaYN7p2VQSbDwo8IhngkpjeXxaBrRSMZo3xCNHgVMVf9Cy1h3XiZ_rMUgJxGDsFACMtEz5SZxoFhOx9Y1i0JMbEpRdJbCNeRoHS3-djdLhOzWobFLhi3dm7ZuqC3Tmo4fj_VytrtpvgDX3gLvnlmLneKSGDVpPLsERH65liAlJN22Gtg9VZKkySb_tEBo8SK3sfTXU2CADf-UbCzsff-noXCbAWl1PIazIiBdIwwxz5iXR0mcHWoFWe-J9z6TAxQ9wElb64D0Drz7UB2hlf9Ro8hOmBE5WLMMs_bJAhuw25Innq5g3_XDnjaNedx0PPUgMzgX5hkVZyftCg=w1560-h563-no?authuser=0' width=700>
!! How to Create Vocabulary V
''Criteria''
* Min frequency f
* max |V|, include words by frequency
''Caveat''
* Use `<UNK>` sparingly, because including `<UNK>` will generate a set of sequences with lot of `<UNK>`s leading the perplexity being lower. It might seem that the model is getting better which is not the case.
* [[Perplexity]] - compare only those [[Language Model]]s that have the same vocabulary V
,,[[Course 2: NLP with Probabilistic Models]] | [[02 November 2021]],,
!! How [[n-gram]]s missing from the corpus affect the estimation of [[n-gram]] probability
''Problem'': [[n-gram]] made from known words could still be missing from the training corpus. Everything that did not occur in the corpus would be considered impossible. Smoothing helps us deal with this situation in n-gram model
!! Popular smoothing techniques
''Add-one smoothing (Laplacian Smoothing)'' - Adds one to both numerator and each bigram in the denominator sum
<<<
$$
P(w_n|w_{n-1}) = \frac{C(w_{n-1}, w_n) + 1}{\sum_{w \in V}(C(w_{n-1},w) +1)} = \frac{C(w_{n-1},w_n) + 1}{C(w_{n-1}) + V}
$$
This will only work where the real counts are large enough to incorporate the +1 term. Otherwise, the probabilities of the missing words will be too high. But it helps as there are no bigrams with 0 probability
<<<
''Add-k smoothing'' - Makes the probabilities even smoother for larger corpus. Instead of 1 add k in the above formula
<<<
$$
P(w_n|w_{n-1}) = \frac{C(w_{n-1}, w_n) + k}{\sum_{w \in V}(C(w_{n-1},w) +k)} = \frac{C(w_{n-1},w_n) + k}{C(w_{n-1}) + k*V}
$$
Can be applied to higher order n-gram probabilities as well
<<<
!! Advanced Smoothing methods
* [[Kneser-Ney smoothing]]
* [[Good-Turing smoothing]]
!! Backoff
Another approach to dealing with n-grams that do not occur in the corpus is to use information about n-1 grams, n-2 grams and so on.. until you find a non-zero probability. This distorts the probability distribution, especially for smaller corporal, so some probabiliites need to be discounted from higher level n-grams to lower level n-grams as used in [[Kats Backoff]] method
<img src='https://lh3.googleusercontent.com/2yFiJscKGJOQUGuayEkw2oBf_wXegNR-fMmUju_gr2q5Ph322lmkueSnTQV5sCbsze0ygElD6MtoRAfPD2flGGXXPShq4MdPWK7BasBgJz4iJ9-hinE7iRPafuFVS6cnJskoZQNe85sTRZNrL2TbH-KJouuveLDePEVaZU8JKLD_88V-OLnCE0cHWts3QtClcucgGFGi5asympvRCiDBthTJdoeXVPX2vURxMyrwBrH-RiU5OJjJ5-DRwT2UNjp8B847eg54T351UOreF52Q1MlpfD3G922R_luMySkkRTWh5rGN7a-UaRTH6oDHvU3uRy16lF8orE6dQK-vrY69JidiiivTtvcr35Du7vqAuAKp6jUNvFoZcAgAApwf7tKt4-OP9sL1C0P_-esNHoVvSosOgfwuoM8tl-FDiCGTJPsGf9Uf_T8krEUcrOsMzWlDtst1D2f4Njyusfo08dAIdnnP73uIBgWgWVAXDwiQtkZGrl1bDU6CQs9wO5nS4bRewQJk7xgvVUdcYfaAfyVisoy0haHSqw71lZBzifTPzYBgJcBfKd205kCuYcPbRSqDbia2-ysk5H7gId3P73y73P92N0eGO-lLfvyEdSTFe9_kMNvmCH_hQ1haQf1crsiC_YKuwRxGeVk01Z_wioXglzJ5dKjXp3g-i_HmGnMLka5M_WszmMu2pFrFFfw4JupuJ2gTMniYOxghC1NZLrPHAusYKw=w1560-h345-no?authuser=0' width=700>
[[Stupid Backoff]] is effective in very large web scale corpuses
!! Interpolation
You can also use interpolation when computing probabilities as follows:
$$\begin{array}{r}\hat{P}\left(w_{n} \mid w_{n-2} w_{n-1}\right)=\lambda_{1} \times P\left(w_{n} \mid w_{n-2} w_{n-1}\right) +\lambda_{2} \times P\left(w_{n} \mid w_{n-1}\right)+\lambda_{3} \times P\left(w_{n}\right)\end{array}
$$
where
$$\sum_{i} \lambda_{i}=1$$
The lambdas are learnt from the corpus during training
[[Course 2: NLP with Probabilistic Models]] | [[02 November 2021]]
This week you learned the following concepts
* N-Grams and probabilities
* Approximate sentence probability from N-Grams
* Build a language model from a corpus
* Fix missing information
* Out of vocabulary words with `<UNK>`
* Missing N-Gram in corpus with smoothing, backoff and interpolation
* Evaluate language model with perplexity
[[Course 2: NLP with Probabilistic Models]] | [[02 November 2021]]
!! Word Embeddings
* [[Word Vector]]s or [[Word Embeddings]] are the cornerstone of enterprise uses of NLP
* Can combine word embeddings with a classifier to perform sentiment analysis
* More advanced uses cases from word embeddings include [[Machine Translation]], [[Question Answering]] & [[Information Retrieval]]
!! Learning Objectives for this week
* Identify key concepts of word representations - numerical representation of words to be used in mathematical models
* Generate word embeddings
* Prepare text for Machine Learning
* implement [[Continuous Bag of Words (CBOW)]] model
,,[[Course 2: NLP with Probabilistic Models]] | [[03 November 2021]],,
!! 1. Representing words as Integers
Representing words directly as integers would imply word ordering. It does not makes sense as to why hand was given a lower integer value and than happy and vice versa. Thus representing words as [[One-hot Encoding]] vectors makes much more sense.
<img src='https://lh3.googleusercontent.com/pqHm7qgzMb61B2Wa2saF2CaGnntLsfb8q2rMJCIgPeTBMjpL1Gkbe4FutAf8IedIcUxrYgN2d-RG-KnBc7Goc4XrVV5Zl9pVfliSMYbPGvN5Mx3zllTN3geAmDkvS0ZG1wdVNQm_AVRCmX2hkgEwXQKbIWV0UoE2iHVLypjG2Rut64LuHTHWIFxuEP0p6GiOK2Yo4moKTXGIHctjAXf_zwSAsWXa_bo_sK_4MWL2VZbSpGQFSGQuwR0qS8Q76eAJ3FRahLAaCfu-vvgSfotKIaZtcJfzLxu90UPRdBQJ4Mzcw1rzKg8oDRWKFoh2SEgK3cU_Jat4kEasvcGhdWI_tfBPDeNE_s763a3K4M2oUolKmzQOHeMMrdu6i-liBYesBB7PAysg38JBUyeO25zDUvXF9BJxv4BaaSGA2dc-Qa-TjtI6vwVK1adTSCF2jwMSB_BPPBOxXEJ9zkWZDQ4_9NcQt-rPxFi1_NuYMyZa2S7PxNNqTiMUnkYueKgbjwZ8upXIa-orVDr1YIE3bZ-Ex-mHQOXBg2IYbI3J5pFY91IH85yhVa5jDj100m63rx3UXUJJSr32fN1_EmJcjoN5pBZyhhCxmc3RgdJY0BUDMDPeo3xU5WplYFsWBYbOfYkMvIRIH_I4O0i_Eg-z-TBGChRGrvzJHhubOJLeflWJO9jNNfpQkJ9kKu-QIVZbjE8LNaX7vptlWJw_WTjQ2TDatuGmlA=w1560-h644-no?authuser=0' width=700>
!! 2. Representing words as [[One-hot Encoding]]s
Each word is represented by a column vector where all the numbers are ZEROS except the word being represented.
''Pros''
* This does not imply an word ordering.
* Simple to understand and represent
''Cons''
* Vectors can get very large in size when vocabulary size increases
* The meanings of words are not encoded since the distance between the word happy and paper is the same as happy and excited. Intuitively, happy should have been closer to the word excited than paper. This can be tackled using [[Word Embeddings]]
,,[[Course 2: NLP with Probabilistic Models]] | [[03 November 2021]],,
* Word embeddings are vectors that carry meaning. Can now use any decimal values to represent, which makes word-embeddings imprecise.
** Possible to extract semantic distances between words
** Find Analogies
* Has relatively low dimensions - making it practical for calculations
<img src='https://lh3.googleusercontent.com/PdlmTvjxopXKE-yTvIavSBaNRbnoDhvOgRb2SdoXT3W54cV9fJacUW3H0gHu9NLB2AthdLwfn6vl551lD3bGv9rMPB2ImHI3ZiZp8C3hMquv_19YR2tUN6IJzanWHe4czIlO23TVjTOozCFBXDRm2ERSkYkFEX2FfztQDhUpkJE5IVuyDINfKm6BWUP2xUK6Jgij-re2yCukjhDTXrVD9Erm0yDxbp2XiIP-hYpBvRtAQjSShOgzBSFqKkUKW11Okkr_Sg5q54DC8nNVlIEavpNomdjGGvHqt-v1w7JpzeNAubiS8t_H3C1jZ8ugoJg5QYQNbzkk4wYlHsfRfOxPcW-93kLnTW7ULBgUxjX30Ok-yxINIfYn3p-sMQHVE-ppP6cQnpY3mLOnaSxTk2kIG7l-1nNbWgc6_DNuwlzWQGwSJH2x-q-tzWw6fy_1z-8G5F8BRqvgL0ER5wfCaKEuzBA00XJJnvvzbI1YwVp-RUzN0qeDV4Tbp7zUu4AhCPTl8lypJBVoOnn-q9Ll5PpNYp_h3WoM-H8IXrX6GYxZss2K3tw3D3l0VOU7iyuWIm8EJ5AJJulBfIH1txPjN017eClEOnTgw8LEfuEyEnWkYxXxhb1QjkRJEyen2ljXtr6wNQdNRHOIPCKgV0zFxUoYJqVAFIulQN0n51bwYkPAqqGf8iUE3x8bT__Mzc1sHaeojGkQo8dz6l4k1Vd-CAZNTMH8_w=w1560-h602-no?authuser=0' width=700>
All vector representation of words are known as word vectors which includes [[One-hot Encoding]] and [[Word Embeddings]]. But the term word vectors could be seen used interchangeably for word embedding vectors.
,,[[Course 2: NLP with Probabilistic Models]] | [[03 November 2021]],,
Need two things
* ''Corpus of text'' - requires words in ''context''. For example, to learn word embeddings from Shakespeare's text, need to pass on full works of Shakespeare notes and not notes and slide presentations. A collection of words will also not be enough to create word embeddings
** Types
*** General Purpose - [[Wikipedia]]
*** Specialized - Industry or Enterprise specific corpus to capture the nuances of the context - contracts, law books
** Transformation - from words to mathematical representation before learning
* ''Embedding method'' - creates word embedding from the corpus
** ML model performs learning task
** [[Self-supervised]] = [[Unsupervised learning]] + [[Supervised Learning]]. Unsupervised because the input data and the corpus is unlabeled. Supervised because the data itself will provide necessary context and will make up the labels
** [[Hyperparameter]]s
*** Word Embedding size or number of dimensions - 100 to low 1000s. Using higher dimensions captures more nuanced meaning but is also more computationally expensive. This eventually leads to diminishing returns
<img src='https://lh3.googleusercontent.com/Tw9K_FgoV1E2vF7AvKdCUxUnPFmxjCtSOaqjT8nN5MTTgiuJ4XolYBtNsxAA0hEQvPvn81pz2IBPvyD3b9irFYmz6bd00z2THom9QwypGga5FagpEIUtfLkjoSRxkwBVKyxoss6HPOgQKAIgEKnq_puIojAfjEuFcO2GIc-3vMNvN68qf3qjXrSdKmUh_O0RdGaTHFJ7BrJ_2ybqpc_yRvmEgEc5TsuU9M3ANJfT5ay5OOhVYnkcFzduvunPvFzLxGRIsvES2_df92x3Oqp8Bb1DTo4Z60oarTWqMJkZYxuXz9WHYlybV_bFPDb1EIvtsFovwP5khXsKQVavfiwx299sRzAtPhd7Ck1tvxb-G8PVoUdDuDPudairaaQ7F5540aA12-xTK4_6XNWAelAEcR-YGvncnj6f7g0LexTWhCx6nCO7SBTi62fvEqjKYFbOqWU_AuQxI96tfDAtKSuDJOwKVPnJ0I0lW4hlVihY9mIlm5YMnzbbATm_MvYdJsxXRsU0HgCec_caS75l-fioju352Crqxyu_L0VJfg3rv3qn0lPp9lTiArVvsftgZAYit2gDm_Vi9Cbu7ehDuIRdHSwWwXctGxFhdmmq_Fr9tCTkSBeBXQU-z-XvJejWlVpJ5Z45rU9PPTJHkEPTBST0LhrY9C04KR_ocV7KD1ZbwPg0D2NnhL0y4JmQx97LqSP3I6UItC4HV-6dTtsLkaSMwPQYjg=w1560-h690-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[03 November 2021]],,
!![[word2vec]]
* by [[Google]] (2013) which initially popularized the use of [[Machine Learning]] to generate [[Word Embeddings]]
* uses shallow [[Neural Network]] to learn embeddings
* Two model architectures
** [[Continuous Bag of Words (CBOW)]] - the objective is the learn a missing word given the surrounding words
** [[Skip Gram]] or [[Skip Gram with Negative Sampling (SGNS)]] - model learns to predict the words surrounding a given input word. It works opposite to [[Continuous Bag of Words (CBOW)]]
!! GloVe
* Global Vectors by [[Stanford]], 2014
* factorizes the logarithm of the corpuses word co-occurrence matrix which is similar to the count matrix used before
!! [[fastText]]
* by [[Facebook]] in 2016
* based on the [[Skip Gram Model]] which takes into account the structure of words by representing words as an [[n-gram]] of characters. This enables the model to support previously unseen words or [[Out of Vocabulary (OOV)]] words by inferring the embedding from the sequence of characters they are made of and the corresponding sequences it was initially trained on. For example, it would create similar word embeddings for Kitty and Kitten, even though it did not see kitty before, as kitty and kitten are made of similar sequences of character.
* Another benefit is that word embeddings can be averaged together to make vector representations of phrases and sentences
!! Advanced word embedding methods
* The words have different embeddings depending on their context unlike previous models which had same embeddings irrespective of context. This adds support for [[Polysemy]] or words with similar meanings
** [[BERT]] or Bidirectional Encoder Representations from Transformers by [[Google]] in 2018.
** [[ELMo]] or Embeddings from Language Models by the Allen institute for AI, 2018
** [[GPT-2]] or Generative Pre-Training 2 by [[OpenAI]] in 2018.
* Off the shelf pre-trained models are available which can be finetuned on our corpus to generate high quality domain specific embeddings
,,[[Course 2: NLP with Probabilistic Models]] | [[03 November 2021]],,
!! Embedding Process
In the [[Continuous Bag of Words (CBOW)]] model, the objective is to predict the missing word based on the surrounding words. The rationale is, ''two words tend to be related in their meaning if they are surrounded by set of similar set words when used in various sentences''. That is, they are related ,''semantically''.
!! Training Example
* ''Corpus'': `I am happy because I am learning`
* ''Center word'': `happy`
* ''Context half-size'' = 2 (Tunable [[Hyperparameter]]). This means the number of words surrounding the missing word is 4 (2 before + 2 after) which is `I am` and `because I`.
* ''Window'': 5 (Count of the center words + context words i.e. 1 + 2 + 2)
<img src='https://lh3.googleusercontent.com/FgJ8bSIXWbHeIPeXxCXCF1LfkHnBYecoxtyCNLZk1GY_vxbthuFrtHTAPRYk2f3eMyNyicO9aiKiJTj1oK5TqVDtFH00dbTafUtldJMcdSAYpshw88SXKxQYRxQjv0UZ8AUVX1vlOP1u0_PcviOrp8qjLnlFZ8QwE_gB1HIhFhbIGplWzyuUyippXA2gdGr-1Pn5rlHJfDc4siB5bJ7AF6CTFyjr0FiW682YJD9nrabCWAlz1lPt04HrgY-GH_7E-cUAsLTTSwg62BsB0EFMwxP_BZwWA7klgJQJcyc_ehYOYjDx98EUXBT8UJBzfK0XxguYWOdqnopl-b40YCS30qBdDEJpnAMuK5xMuaA8Y_TfSNS0C69jOAVXXItV_zIYrunPUZVb_hMR7LU1kD3Wzk9WIxNSb46nhI8ICwHgIWjwQy37XUdG_JSEXNspyw2v417jykbVZte2Wpezs_7fIWjqmvHkEgUh6x_95wRzxwEZTgpB5MYTI0rNTQhdTRCpaIlqqFArVYEmxq69U4_RaBw8LR2STzMiaS7JLH27IRHwftWwZU8VWqGHWBctgWoKa28bRI_oxfwt5wAPjE-27R_ueilKnNm_b_IP5ftlRa83tgT4IDdY-TC5C9J_PZdRgTssAt4NoEH_tqWEk-XI5RVsgrSSgo97f7AW2JwE5siRGQPgVKmkWy4XtKt0QTgXIcWFvYViG7ZTQY4LW221UmT9bg=w1560-h498-no?authuser=0' width=700>
Each training example is prepared in the form of context word, center word format. Can slide the window by one word to create the next training example.
<img src='https://lh3.googleusercontent.com/xyMvowFxz16JQJ0_9yd-4tbXSN7ws5ay2yO7QbrQKrH3zit72mvn0VMKDpyVtrcuOvfaoccYnZQJBbhvhtRdp0obdldxlpUqTRDuAnkH1i1Km7NemwNi-pttABp2kutZhLVoCsfS2kSESKFTOsvNX-OfUQlLi6LJymOQdmg9XzWBGQwCM6Zc5GAK3ONOq2-mz3SHSmrMnmaYI5dOY9ndLBVGeCxLdMxbrs0N52YQVYoQJIhA8_B7agTeDX3SeyUxBzAmIu9l8SU7XsVebsNDdmRT5jdnF2EfGZ21xH4-LIWHhmGUDjiu77qBwYUkUVeV4ESK9ivgnwcA1I_OoUwWMfgXLfEhi5rbVG99-AWJ1dBiJRIm3I9NjgxbXyoqqUA35A4VnEZ9ALwKEfDgeozkWCUI8x_cqvXRbpgGoXPBhR8WB5oHs_rCU_j-JlLMLKV3BHk87fPeK8pgnrNmolDYBf1jPU4xh8mYhCTGq5ovKlmp728Z_Uok1xx4px_1n_KhmTR7WKwfd8PRRqmHOwL0B_qGyZCH4d7X8jAj9ti7VtfGoUuHHpSvLvYc3ciPGAUWef1q_nQFiXKfCSmvZf-zuIwmQ5PtsgdKI9KmI2mehrudQn8W9FwjAEGGMr4XQiGH1T1TBW7SCmJqNjNlrEsAofzSER7rNl8rdNNjftv-Uf3EpQ1jYEEGNXnnZpyvY-pgmqZsUsbmqso_4Wz3ZeJhUgVU6g=w1560-h599-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
!! Process
* Case sensitive
** Convert the corpus to either lowercase or uppercase
* Punctuation
** Represent all interrupting punctuation marks as a single word in vocabulary like `, ! . ?` $$\rightarrow$$ `.`
** Non interrupting punctuations as another special word in the vocabulary like `" ' < > ' "` $$\rightarrow$$ `Φ`
** Collapse multi sign marks to a single mark `... !! ???` $$\rightarrow$$ `.`
* Numbers
** If numbers do not carry an important meaning in your usecase - drop all of the numbers
** Otherwise replace it with a special token `<NUMBER>`
* Special Characters
** $$\nabla \ $$ $ € ** $$\rightarrow$$ `.` It is usually safe to drop them
* Special words
** Emojis and Hashtags - like working on corpus of tweets
!! [[Python]] libraries
```python
import nltk
from nltk.tokenize import word_tokenize
import emoji # to handle emojis
nltk.download('punkt') # download pre-trained Punkt tokenizer for English; handles common special uses of punctuations
corpus= 'Who ������ "word embeddings" in 2020? I do!!!'
# collapse all interrupting punctuations with '.'
data = re.sub(r'[,!?;-]','.', corpus)
data = word_tokenize(data) # tokenize strings to words
data = [c.lower() for c in data if c.isalpha() or c='.' or emoji.get_emoji_regexp().search(c)] # removes numbers and converts to lowercase
```
<img src='https://lh3.googleusercontent.com/18DnKR-TU4k-FGykGslgAfJNqOLxYxVAkSKH1q3uD_loeVf3w5UVmPgzfjOyGT-F5H8vp1bZuYF4aCP2RaLDKie-qCPzXwR_C-IIQdo2hMy3oddpoapmh3NE8_e4iYz3GDv3_fI9-10qk9EHj_WsePfWYyB0E1ONnPb1inPaBTKXlms-7JQR0ZF9Aui8bojbR2HuGJILd8teK-amWcJoB61sf-q47ovzNuQ7es8VJT1yetX2cHBiZe6-rzY3K8sy8kXPmOaXj72t9aXuBd5HFs0GPEr-KW-RDRHVokOd5H6ajOMAnFS9HE0dcc3gfGMHOz-Q4HcjsTpuLz8CpKoc9LimYxiIlr69U2xqFy4yOPNapjCsse-PZV2UJBwEGTCB5J-yPD2uHL0tChJsEw_RSMjlPu7FnMJKuBBdx5yyoJfQzd9J66vQeSGZDTVWXt9KPdZ4eYQkYxPEj9MXaH0iphICDR_6_RbjoURA0fp-inRWXagKb1wcac4SnLJeklKmvVTG2RO9-hSkn_zHkQ7Ud4pCWQL3v_7eaVJ42lonudFhLXIm07p3qSddXQcN7462vu04gRgOPUk1tpq7MLuW6-6Vu4R1i0e6cN0Fwlli00OfSo4mj4oOukXIOEXl0nGT-EFDbpqvLXfs-WVlUVKmzpTW2yTnz5-dwxxQcmyTiN5N_K0E5NXLaTEPzAN6YdlUBLuqQcG7J7WbfeEzUfK2q2nZVA=w1560-h534-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
Previously we cleaned and tokenized corpus in [[C2W407: Cleaning and Tokenization]] which we have available as list of words. We can now use sliding windows to extract center words and context words to build up the training data for training [[Continuous Bag of Words (CBOW)]] model
```python
def get_windows(words, C):
i = C # context half-size (previous and after words)
while i < len(words) - C:
center_word = words[i]
context_words = words[(i-C):i] + words[(i+1):(i+C+1)]
yield context_words, center_word
i += 1
```
used `yield` instead of `return`. `return` exits the function at once while `yield` returns values from function several times
!! Using the function
```python
words_tokenized = ['i', 'am', 'happy', 'because', 'I', 'am', 'learning']
context_half_size = 2
for x,y in get_windows(words_tokenized, context_half_size):
print(f'{y}\t{y}')
```
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
Transforming words obtained in [[C2W408: Sliding Window of Words in Python]] into numerical vectors to be consumed by the [[Continuous Bag of Words (CBOW)]]
Corpus $$\rightarrow$$ Vocabulary $$\rightarrow$$ [[One-hot Encoding]] $$\rightarrow$$ Average one-hot-vectors for transforming context words
!! Transforming Context words
<img src='https://lh3.googleusercontent.com/I5V1oUKQJJGc69vwfr9qimPaOHiyg-uf8rPsOakSTK2yoUV9u7GwqMYaZb6lnbSYoYDkflcYJ-QC5PAPF_bc6xt-a99dGhuDaRhuuGbiaRtEX1Q5vbaBJrFa5Z3YEGE4C0saHv9gPu7qIrTqtNDx4yTzghrdRL8N84C1cOFFO1H9cw6HwJLkWU0OrkkVVYLE9Y-aL-UXyibCAqHTN4XxJ8OUtL_NqqRu1Y6oRgyMemjUuCRdihgZYWvnD25GuPXbPzZ3NzgDdb2064N_FNEOvsF1iUl-acPWMfDFE2ZTrPg11DIT9xDMipNR7cfFV7td71p3J-SayEOAOgtjwHjBSgcmje4eMzjafdMpnEisYt_qWq_zr3vaPsbAOJ7n94fwdWgiqgVatM53B-P8KMBasVCf8O5tvGzci59CJRx0iGcvAq-TMt3z-3OHC-90B4puF4bcrXueFH6aQiPHa9L1ZRNZnP099qebKGhe4pKg3MG4fiJuGVuN0CCyihB8h6BEx9DYfJDxPoTbOX7-21mxGYMETXlxlp6FME4MIuvcUC1ryVk1F9BKNgVgkcw6sZHhZUWxusVYoTsSpjgUXnIPUCVlmIRvH1JP_IEvIQtE6v9l5ONfDIIbpkle1iXk8aZqz5EwOlonqx49TBcbC6nD7Vsxcp6njIgMTMJfES53dEBcfZuLo8YUpvwIgNOHy_uyCR0rN6yd06Jkx3wq2stu0kl_gQ=w1560-h439-no?authuser=0' width=700>
!! Training Dataset
<img src='https://lh3.googleusercontent.com/Yc_6EwPnYKGaEEMSZex7h1-TBjO9hlcrZsTvmbbepqu8P0ex_sPHc9JBOxlYYVYzDrIHxh-jmzjh5qy7zRYFCZMarTh8l5a9BxwjAEYrWSzLKOXSyKsie8NtSiqNT521Km9RSbCYIzOukroybGBZ_nI2iDNWw3ajv6clSaP0S7qvJ2rS3zlpDv_6nT4UF68t7sTBFC_A_pjVj8M9PxhPeNw9DFTvLeeDOI0svcrms_iCJ7b0nOdA4plryQubKKmxD381GSIEXLV5L3VpqDw91ZwNvhF8AuaCMpaK_vvSZ393dvUPLVHchd4xp1QdL15KVHXsNqayecOoxpRz9mfsAirj6e5PJDfQZlWNi2Z0KZk9McVVVGwFte7vEU1Un1R7nksC1jHMvh2Vi-Pi7TkFSqur-DYuPQtUPZ1w6ENJl5jNGREV6NGSv5mhEcpY9uCYCrZy27sMYeJ_w0vjCtHtbXTL3cjhBAv3Yz7BhasLrz-Agf6-FCMhJ5DKcpNwVYM4Xb21ea_5nyc4LZYsD0x3CaoY6j9gIPku9AgS9c4HVYOgYJioycIRm4jHXH6kVRG4BqQVdl0bDBIbhDhZm0VgPVMkcPTh89lRZWPE8gTInhbl--93pzY_nbpWdPQRILBiq_k7SGqe2oJmmaIPOG3yCUi7yfv714mADdW8Eo__7SEkXc7slLPq-dJRUSMg7bYYpNHNJk29qomMXSZyll5f2yE_sw=w1560-h201-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
The [[Continuous Bag of Words (CBOW)]] is based on a shallow dense [[Neural Network]] with input layer, a single hidden layer and an output layer. All layers are [[Fully Connected]]
* The size of the input /context vectors is the size of the [[Vocabulary]] (V), so the number of units in input and output layer will be V.
* The size of the word embedding (N) is a [[Hyperparameter]] - the size of the hidden layer is equal to the size of the expected word embedding
* [[Activation Function]]s for hidden layer and output layers will be [[ReLU]] and [[Softmax]]
<img src='https://lh3.googleusercontent.com/T6udwE3jt3m2c2zSqyRglCsOCnenW5QVyRsiqE6OoX-4Cr1Y--LuXsVTeg0kmzTqEXVtAX6AlEzURablOnUX0ctRTqbA8yGuG3C7ZC5gQGt3mfM2cjdzDcAHiIgh4NFXkEL0vwc482EIqIvVPDbH5pyg550LjRD6L7utSSOpMFNHuvFv6iufzLlgsA_iy-pJw4msp7wQ9BTv34leLYviAM3KMcW0bR1k1r4vZrmgYMcDOpec6M_Yb5wuqbmQYJU_15lqqeLH8nWBTDfj1SExxbNLpfGkjqvQpcL8miL720MThfpI7VYdqzIsdskUjcGnxqrqPCGYZnQzVXBYHXHNWKmlaXzSaj1PZRhK8q8TgHgcOZkt5CX-J-a6fxFLNeDdZ10H3MNwazMb4jtaaBdFG_CggFynn3xjekyLz8GqAbJSz-TEw6U57ceI2re4-pnJT_YPqwxB9KkZhYk8hkZRnEZsqnbRfFwuNTAAHW_tpcmwDZQdVHN5OW8T9iB-vxMD31wxUq5EbMz2iezZQOSppE2B_NwppFertE3Wn65a2qNuez_wpzOc7njtoEf3hCR98SDRT1zjF3XhdRUESzhfRNiqYjphxJvIj2Y8krEmXzwBErHNLgKATZxBAimqzKUvYcVi-5d41zIaNCVYi_DnFQFxtjFmPqxiOwI8bdPk2dzJTJFi4W4wAEfKLXGsgQrGBSdQxVFDpsWZLBvLkI3ClpHpVA=w1560-h592-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]] ,,
!! Equations
$$z_1 = W_1x + b_1 \\ h = ReLU(z_1) \\ z_2 = W_2x + b_2 \\ \hat{y} = softmax(z_2)$$
!! Dimensions of Matrices
<img src='https://lh3.googleusercontent.com/0c3CqU08wgXy0VRo_Trf2W_wkwJQIH6sZuxyiOL9eFNAIsWVPl1EbK5Xu11T6vbY1SD8xuJP4DlaXJ0Z2_Vwt8THuB5lUuIA6V9jy_wVmkZEjUVB2IBLu14diZ1-CGnr0opEtCvFFgINT1V2Pqv0pQRKkU53dIhEfiNMf4cJJzLnumaSiGPqe5djx79HtggfbZTrKb0KRjOJOjH5uEyEliS8VumAaUmlCxXkOs2zCtDTjaT9TnA5QGrNQ4z9ilnfOjM58xM2FHsIsGyMfh3h0EwDQ5Omi96k-0fOLM7SfpH0QiQFd6oxjxnzVSUxEC1-TqWCosDbtb_a5r3PSOSXALfxBUZBU5XbpFM42F2WKy_wsxquqIy5nAC2Dj_HGaJj3eYqUfQpqrrB-k-shftqA6aaB1YzB8wFl_x8jbKDeDe_ayWLUD8qeMRb1SkH85rX8TRFul-7mGPCf3YroleOQD4BkagIl2gwB0kFfNNbeX7APRv_6XHbQxHxFH2sUjQA96f-m1MoZWVOVK8V3Co8Jkx2PpN3tYUx-yTTGiZ6mDZRYNo8cGU3WusJXjkOihdEGfz5exwagCwBinM8fBq21gXzlNlGvXRa8WlUUCtYiPmpzwn8-Z5moEu8K8iS7tKM1jJvct4mj8DXrJ_IO-hOhg8VoxogtkEbHRuohf__7IscVu9KSNutmpMX21aXRMMLtdxgCoF_vY89JR352CKVUscRhw=w1920-h770-no?authuser=0' width=700>
!! For m training examples for batch processing
* Batch size $$m$$ - tunable hyperparameter which makes the learning quicker. Stack $$m$$ column vectors together and name it X matrix with dimension (V x m)
<img src='https://lh3.googleusercontent.com/-cDQm0a6LIaDUMtdhjXUPWXvAStrxQKShS50a9MNSXg4xD3Pw0vUSr8pSMd9JyKef--qpTOF6UDYoivdpRcPnekZNnkcEzhf8b1_mTDkyh0vhIxuOgZQGsGlV-wlmpUP4RdnaCKqmo8I29baQC0Cz0Z8H0bsJMb4GFD37zUOOVssJntp1XSuv5QV-2aWERF1SQNRuCdiIDl-B-Kg3mSmvnju2eldOWvWzBeB6x_3ZAtv87hOTu1tYmSVSGaUtQeOcZBW0LyGzWKJJCxQOTEL5Vp6ACvHwPibD1_OeS9Ba0LnNIqClr9mKH9iyFPSdk8mU1rA5fA5AE24aKeuafDaBZ53Fyh4Xj2YIKy8Pn-jRzQTMSIw6vZv03tRmUlkNEBT54NXRFLubrpIvtcn-DiZzuSE-cMZAiz8Agk1rie1u145A1-yCBNWlo7pN8fG9nl6nriJ09SnlYHhX7QM2v8pH6OHiXBKhpA7pzwQmkrlGSk0hgEx5APLwRU9EPDHU1-Z-fQQ0elLl4FadYhq399kP2RL8kozCjGazDI8sojK-J6USF7WOrn8TzGKQqpuKWiOEw5y2R70RmgtbMUWYlXuRbEOmrqza7MtLPPSjduGbXfcTEZdOgLKalR80iwdEKNnzY9pJogMiLcedg-ToAjel9NKHCApo01Xtw-b-lKGCTVobL9OAv0APSrPZuh49j6V9UixAwzvdDGoxtRZcDgjc66cSg=w1920-h739-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
!! ReLU
The rectified linear unit (ReLU), is one of the most popular activation functions. When you feed a vector, namely x, into a ReLU function. You end up taking $$x = max(0,x)$$. This is a drawing that shows ReLU.
<img src='https://lh3.googleusercontent.com/xjsSbel45o7QMfcHw3cIRy3AubORhzAIdbQVtxALsBxYPT475xl5-XIphi5jZj2Szjp5qxPfNWybfeMQnfUj_d82ySk50kOme5uOvYWqWVMMAgl3YaPel8ih_rgb5uMVS9KX8zFlg99sE2Ehz5_zE6GpmNoYIaRU9ReXFmvfPnOEg6Fhz6YjtnA4nlIFzFXH1UxGG3qdoPSUTS2pEDbY8GcSJYcBRYvNEKAVOzkJc7iCOO8SOLsxO4NRlxRlDyY3uhZLvSs6AtZ-D7i7phjvCQs9MNN-ZYY8ZSdgb9BTU2X_r7DeyidJzvjrKF3CYRWsMj4nTqVoCY4JJV-o1Nr9s4omDEcXVtAOrEOajcPoojU4Av8MQ_IhRWfDfGYKOrkV8E7NqyHw_LtktfxAuNrLlp3Ok9VJniSTiCrJh5SC4V9htfeItGmsNekH2UYh8t7tfKP0rs5PhehfwOvGfS91cFj9shG_wZkH0cJL2fmSZ4Zfs5tWS-qhnJZIrlHub1EFHSjsrH0BTou_MBek0ZB8K3Jn4on7LoGZS4rMmry-QARcuJ8Cq8Wj3NYg4nazaJOpFdqUIWZ24dB-W0PK3SQdpcZy3pHvT2482QQsH_H5VrdCMae7P4TC2qGBvymvQ1BnUtQR8QQeYmGQx2i6P95qKck70B2IzzQklIyq5AgpLeOOirXOQm2vBlXhw3vrUI1L-arashor8uUCizu1KRJhtoxWVw=w1920-h730-no?authuser=0' width=700>
!! Softmax
The softmax function takes a vector and transforms it into a probability distribution. For example, given the following vector z, you can transform it into a probability distribution as follows.
* the output is set of probabilities of the center word which adds up to 1
<img src='https://lh3.googleusercontent.com/jwDW-lCeuv-XBMZM10smEyPsK3APmx5Uj_a3e_EBBg9DAZMK4O0FIvk0wwlLlmNXEgkY6ms8WaQMHc7O1uDbKKKFEJsjMW7HVAe9KfKWBWpFpobeBFRKWLHJvnSFvTU9XVXzgrXUlxERZxy5jqIM8sj95cEhV49uLMdOEXmu9FYaYtndhn06dxgpDwm9q_wbU2XnTXJf4f7SESgfIEZ8m993rqVJ5mtue9Yn7er17YH4ugUY79BW0WnITw5EkoBT0ssf2BgPHvz5r2sCvvQJCoNns10R8hrhI_bVrgsGsYZl3KUtZyGZS-IqmmZ2iufCu4jMsEuGV_B3D7TAJFX4H5TjfUofT0cUqciDrbtO6iRqw43o7d2uV6jOwJdD_td0ttTYhojqtHJNcQFwnSq4DzU3sRHY286vW5aWVmX7tG5AjnKYjbQA4ZzPblm1nxOtFvjOxSvp11qjf_IWU2AovJWssIZibmLdzkYAAW3MDQyCaeeK-dREB1333ZOe1Ru27H83e3IMzeF08QU-aHBinxhckBu-vlTlEHO1QWsxkKVncpPUjNu2LppOVO62RSq2Z-0C_1_bjLDFfKLdbyO1NwNUEmXOYLkLb7Wj9r2x6DxZm-HWVhrTQGmY9WRJ7LbD9UKhzU2Xw2zsMAyPeQ0WhgeK1-pgL6DHp44Nj0EACpOPL9lbemzbp7NBdl134Fkq-KKyT_BQLBWUKfLpVK_w2mx-Qg=w1920-h727-no?authuser=0' width=700>
As you can see, you can compute $$
\hat y = \frac{e^{z_i}}{\sum_{j=1}^V e^{z_j}}$$
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
The use of the cost function is the compare the actuals with the predictions and compute a metric which can be minimized.
<img src='https://lh3.googleusercontent.com/unYHxzQAaCb7oAbNYO0nNZWTk8hWGkvSaJMMDPFG8JNHVg5yOvYCZAiX5BeyYbm9S3joAB3MhT2MiPGYqCrkG7dcs3bfPaAU__crdfdzf7J30k9U_C8nQ938rM0VXVi4tt3ht-hV_QV28EnoU-K_i08x4dwC2sbMVl-o-7Xg8HCHJ9Jhz39D5pzLJgr35r0seXEoKAAgBeui5hI570jCMgPxIsMar-imixs5_RpevnUUhoqwboqscdg3YZaDGiFDWHmt8rWHnlGQ7poPCgNnNVrXzgJSLeT8yRAeV8xJrBBpYmAejv90-c8IzAOyFP_X_ovMp5UZJkGwcw4wTsyOTjCZh844AryajqlQBdgkW10tqw9CM_fmHI_-iXqPE2npWa5tBSA63xI91KSHifxjIhBy2XWjQXv_ktRQ-phc0qLh-V_eUVLRDm77EPBTwS8Q5y6-N1WdOPojmDf7nJhTowU_Cz6TYHhvKO2d88uqrML2_goGnjtPZjBlABMIj0rigmzYx7QBOmpvV-7K5PCLWSkAW2CKB9vj0USPH4C1lF7olKqRZ8QANrMhxr1tIcQsscCpYW79KtG7Qus5xq48wPC8lzPYBcO28_0xdq6fQdv84RncxE140HJgNrm2Fpz_Uww_IKc2B0W2dlkpc5AlyfLNcDg7BYr0jRSy-uf6zuC0-4tFJu3yHT-8Z0g7AVLNEnog2ZUjKimZag3d78eNHgMo_Q=w1658-h639-no?authuser=0' width=700>
!! [[Cross Entropy Loss]]
<img src='https://lh3.googleusercontent.com/bXwn2o_qdzWVVunspIGJlqiLEKb7KE6g2JsTD3-MMMx9KFVTVtg4lBKGSAXBSOySYWozAsmaYQtb-Z1GPf1SHvW7LBmhtE5e16T2FaH56Tuxm7B6lfqsbg9TUiEf5QczI7QaZLv2SMgpzrsImu3tjgPuDSsCSVVtAaLcUXvRaq1hlEOj525MQvnK-IfpmaDdboBk_WBn1HprbKr_BZviOnPwD-BVPLrl9tL4x4TTsmkUDMcCW_S8KNIbMJsCtfKpGDbAZ5kRZxfkmKVgrUD7pjc2eD8lmvhbQL7SkaDx7rjrWPBI3hIjDZntKf1_IFbFHSB9eQ79vvHspgdfiMeeeZKBv-YbWTzbSRFImZBXkmC3PivluS2Aw-j92Zy52SLZg7UxwcwHsn1nNideYde9eqlaYuuDgDCr4l5Ftm7uNLAvB6A83wP-skbNB55ashDl2gpMDO9uuj6Xz-c-DQf6YnmE4cEvh-DvSDEwk7hmQ8VZXUoA5LjBBg5FbjtFfVM8psuXZ8HtHkLJiJTC9TMbmGiYgE8H74q1dKZqj3epKhYctM5E2E7bDGSnpD8Mgh2qnHFR5h08ESyIuSDgVv-8YV6ScHwal8BwVhgKS0MZTmVt-B9E4X0x10khl6RrCyBDsJrDoQm_zJWvJZ8B1PhvriKyyfBu9K5kSyT8umiT_O7rzLJdsCp-AJCYE_b9xjqXdAbCwU1xoAYMqdOkQOgrOYG0fw=w1821-h877-no?authuser=0' width=700>
<img src='https://lh3.googleusercontent.com/eI0LXrWeNi7DeqyVrW5YN7q6vLPfSfc91TbFuMjldMl6hzFaPK_bj5qe26y-gJRLmUkCxY-mM2cfvnHf_qYnEI9Vpt89QnjXlTZa84zu9LNDv6WqIsDbDVW93c2-cTmSSg3aXt2SxM3E3AhhpK8c4gI1OHQG2VTgy9O-FqhgxsjDL9x2GuHDe4Q7aSb2aPHjh_sAryZ9ylsBhhgy4dVkdcPC2uXkVbQGIs2mk9ytVSMWFzGjuNHMvTlGC5ZKmBaHzW5R06mcGQm4urJVVYpva85ylVf2rD_-JvwsSHoF4jjgnVOqigVHivQn56fs_L9EoEf6_kzEtzypZEIjenWqXJ5xyy2mN3Oare4TxOeICc8YoEksAJ-vjcFYaexPkgoAL3gZyCL_99KQdHoMrxMt2mTVi9ysjWsA4LAz8xRSYlzvPvrm1rdukj3qwNW1FJGPChxoKNcpt0jgnp5NN7cpuyWgih8uHOo4FU-a83E64h7iAHCisrX6bCficc51Z2AF2CvuQWJuX1UbYcqegI38DLSoDXp0Xdvi2z3Bk3GUb1Afa9rjw9oR8IqtNIdDli-O7-DcHMPXk6BW1RerCVcPAGt4fl3nFri7I6rGYJb0nuWSNBK8t1aEdaMEWP66Qfl9Cn47r1E1-Zm296rL859w0NiFR2rDV-uTvA4Wn_jtMaV1vzVFT_t6A_mcCcUg6fUzmSRnTg8efNhea8jorxrlW6Cwfg=w1920-h692-no?authuser=0' width=700>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
!! Training Process
* [[Forward Propagation]]
* [[Cost Function]]
* [[Backpropagation]] and [[Gradient Descent]]
!! Forward Propagation
$$z_1 = W_1x + b_1 \\ h = ReLU(z_1) \\ z_2 = W_2x + b_2 \\ \hat{y} = softmax(z_2)$$
!! Definitions
* Loss - for single example
: $$
J = -\sum_{k=1}^V y_k \log \hat{y}_k$$
* Cost - for batch of examples is the average of individual losses
: $$
J_{batch} = - \frac{1}{m} \sum_{i=1}^m\sum_{k=1}^V y_k^{(i)} \log \hat{y}_k^{(i)} \\ = - \frac{1}{m} \sum_{i=1}^m J^{(i)}$$
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
The objective is to minimize the cost. This can be done by [[Backpropagation]]. Backpropagation computes partial derivatives or gradients with respect to weights and biases of the neural network. This is accomplished by computing the derivatives on the output layer first and then working our way backwards and use the computed gradients. This is an example of [[Dynamic Programming]]
$$J_{batch} = f(W_1, b_1, W_2, b_2)$$
The second technique used is [[Gradient Descent]] which adjusts the weights and biases of the [[Neural Network]] using the gradient to minimize the cost.
!! Backpropagation
These are automatically handled in the [[Machine Learning]] libraries. The derivations are also not relevant for usage. For info, the calculations are presented below
$$
\frac{\partial J_{batch}}{\partial W_1} = \frac{1}{m} ReLU (W_2^{\mathsf{T}}(\hat{Y} - Y)) X^{\mathsf{T}}
\\
\frac{\partial J_{batch}}{\partial W_2} = \frac{1}{m}(\hat{Y} - Y)H^{\mathsf{T}}
\\
\frac{\partial J_{batch}}{\partial b_1} = \frac{1}{m} ReLU (W_2^{\mathsf{T}}(\hat{Y} - Y)) 1_m^{\mathsf{T}}
\\
\frac{\partial J_{batch}}{\partial b_2} = \frac{1}{m}(\hat{Y} - Y)1_m^{\mathsf{T}}
$$
!! Gradient Descent
* [[Learning Rate]]
** Larger $$\alpha$$ leads to faster weight updates
** Smaller $$\alpha$$ leads to gradual and slow weight updates
$$W_1 := W_1 - \alpha \frac{\partial J_{batch}}{\partial W_1}
$$
$$W_2 := W_2 - \alpha \frac{\partial J_{batch}}{\partial W_2}
$$
$$b_1 := b_1 - \alpha \frac{\partial J_{batch}}{\partial b_1}
$$
$$b_2:= b_2- \alpha \frac{\partial J_{batch}}{\partial b_2}
$$
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
There are three options
!! Option 1
Each column of $$W_1$$ (N x V) as the column embedding vector for each word in the [[Vocabulary]]
<img src='https://lh3.googleusercontent.com/gp-xGSUno_KunQ--UwYxobEAYzh-YT0_a-o8p0vcEbI1o-M-JgotfhMlu5BO1WYLWTT6JAxWeLIfu8qNj6uA2eGdUkFvf1ujigWDhU7O6M91u6SIxusTZBeBCmSg9iUKB_QssEB1b17QnQ1685IUJclbLuBIr4W5cmUar6yOpfzZQB3VCnVZdd6YVwFHfk3rt9R6wKrhDV95MZD7jVZbomJnKh0JtvDComCQl-Zrv8yb7ZUUnsyuMuuJw7FmEg5G57KKjRLUor3XGekGmT03o4l06GUgknfKTolhQUnbRF9e4ZqCSlkAwK85G9pEMQ0fhiI-040mCxRb0BUDbhXcT62Ke9zJLzcQ4TkMXHv3Syo6IEqCQUfa-YPTlnqKzRJ09rwe8J4quUNiNu4y-Ja8oDZuPbfBh9aX1b3ui6YuRvN-q_RwchhAImUBoZtOP_sXEQ64qExeZt4_mrcbOQFW1Jm5FfuCTOH9HgxVz_NpsCCFV-puUgFkzsmYYBlGl7XpTnwu4GBVY6GLFWjmsZt-9WBr5daAJKWngvQIHabIGg1fbQC267SPw3QyWAQI0wAQTfYPoGsfioB6Do387pZAc1lblazTLdzEbkFxAVrKUUlGhpun7MDNS5yyp0rx1Zh1JS6mTE09Do07MlviGCFgguT8YBgcaRJo6e70xQImrlYEzoTVOh8mB6MlM3RNnLEI1eIW2xy7aUYvtCezPBLvmqpMPA=w1774-h772-no?authuser=0' width=700>
!! Option 2
Extract word embeddings from $$W_2$$ (V x N) as the row embedding vector for each word in the [[Vocabulary]]
!! Option 3
Average of Option 1 and Option 2
$$W_3 = 0.5(W_1 + W_2^{\mathsf{T}})$$ (N x V)
Then extract word embedding for each word in V from each column in $$W_3$$
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
Two types of evaluation metrics are - Intrinsic Evaluation & Extrinsic Evaluation
!! Intrinsic Evaluation
How well the [[Word Embeddings]] inherently capture the semantic and syntactic relationship between the words
* Semantics - refers to meaning of the words
* Syntax - refers to the grammar
Can test the word embeddings on
* ''Analogies''
** Semantic Analogies : Finding the missing word `France:Paris as Italy:?`
** Syntactic Analogies : `Seen:Saw as Been:?`
** Caveat - Ambiguity. There could be several possible answers.
* ''[[Clustering]]'' - Identify and visually judge the clusters whether the words are closer or far apart and whether that is expected
* [[Visualization]] - visualize the word embedding vectors which qualifies as the basic intrinsic evaluation of the vectors that rely on human judgement to assess the quality of embeddings
<img src='https://lh3.googleusercontent.com/WJEUXspX3gdddJ0OxWJrTn0jp6WWj6_3Q5px8BF7gpMUCYQ4Z4oz42uAn8khf10FWxdkyptV5UNi_5GrbKjsZr6StYTcnXi8DI72z_FOuryrhX4rcBIj80XiT92UzD_q7HIWpMigNl-2KeCIx8Fn5RJrwUBTpqSzBWgWb0T5Wax-7HhPBD4MZa9IM_zzMsG-1T-yE9n4i7a5fsocCgRsOXArTFQpAlsjjyoHoVIj-xnh1vdZAcyHH98DSsY8dzlFEm84nBuZxTBwY3aHp-dCKMt3LsdUfBnOXAzQjekmqJsdVKnwo8fLfVxpY2b726xrFlBJxLehu4Zda794DIi1A3CuPZWeZL4bq9hZrDI8EvdKSngxKGAKojrguwf0OE-Hc_FjhkOo296bp30t9OyJq949CzONnDA-wbnQLqC8LC4kdVFDb8FJm6CfjnS2g3giOHg_8-EPaGBC4KHB3S1WL6AC6otG0buzJXmUNSyiEOkdBB-Tnl8R9O1U1g9Eoy4LEgH5VPL4xsIlvPxzYU59yK62LAKEm3su-IieAOBhVZsXhoTafvjzp0nBL3CbmX05p2KKxbu3UbS-Bq5qVrYX5LYtMmQkjyFd2bAAbBlTr75mzS3LYZQwi0SddLORziyfKlMA64Ivnv2MHuyp04inYRZyt3LzMSZNooD5GxPkvl8FDghCYiEfuOw2vJLp_TMYRns4G8OT2M1edNNKSMk6Xt7z9Q=w1920-h603-no?authuser=0' width=600>
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
!! Extrinsic Evaluation
Use the [[Word Embeddings]] to perform on an real word use case. Then use the performance metric of this task as a proxy for the quality of the word embeddings. For example
* [[Named Entity Recognition]] - a [[Named Entity]] is something that can be referred to by a proper name
* [[Part of speech (POS)]] tagging
A useful task is to train a model and that identifies and categorizes named entities in a sentence. Next, evaluate the classifier on a test set with an evaluation metric like [[F1 Score]] or [[Accuracy]]. This ''represents the combined performance of the embedding and the classification task ''
''Drawbacks''
* Evaluation is more ''time consuming'' than the intrinsic evaluation
* If the performance is poor, it is ''difficult to troubleshoot'' because the it does not point whether the lack of performance was due to the embedding or the classification task
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
This week was about creating word embeddings from scratch and it is an important skill to have. The concepts include
* Data preparation - Cleaning and tokenizing the corpus and preparing data for transformation
* Word representations - transform word vectors to numerical representations for training [[Word Embeddings]]
* Training [[Continuous Bag of Words (CBOW)]] model from scratch
* Evaluation - using intrinsic and extrinsic evaluation methods
Can now move on to more advanced uses cases of [[Natural Language Processing (NLP)]] which handles [[Out of Vocabulary (OOV)]] words and where word embeddings captures different meanings for the same word depending on the use-case.
,,[[Course 2: NLP with Probabilistic Models]] | [[05 November 2021]],,
Used [[Logistic Regression]] to build [[Sentiment Analysis]] model. This model provides a good baseline but does not work well for confusing statements. [[Deep Neural Networks]] are able to capture more abstract information and don't require [[Feature Engineering]] to be able to build more sophisticated Sentiment Analysis model
,,[[Course 3: NLP with Sequence Models]] | [[19 November 2021]],,
!! Outline
* General structure of [[Neural Network]]s and how they make predictions
* Structure to be used for [[Sentiment Analysis]]
<hr>
!! Neural Networks
* mimics human brain for recognizing patterns
!!! [[Forward Propagation]]
* $$a^{[0]} = X$$
* $$z^{[i]} = W^{[i]} a^{[i-1]}$$
* $$a^{[i]} = g^{[i]}(z^{[i]})$$
where $$a^{[i]}$$ is the activation of the ith layer
!!! Structure
* Input layer with integer representation of tweets
** Word $$\rightarrow$$ Number $$\rightarrow$$ tweets to vector of numbers $$\rightarrow$$ 0 padding to match the longest tweet
* [[Embedding Layer]]
* [[Hidden Layer]]s
* Output layer for [[Binary Classification]]
,,[[Course 3: NLP with Sequence Models]] | [[19 November 2021]],,
[[Trax]] is built on top of [[TensorFlow]]. Every computational steps needs to be included using a [[Trax]] layer in model's definition, including the dot product as [[Dense Layer]]s
```python
from trax import layers as tl
Model = tl.Serial(
tl.Dense(4), # dense layer
tl.Sigmoid(), # activation of previous dense layer
tl.Dense(4),
tl.Sigmoid(),
tl.Dense(3),
tl.Softmax()
)
```
<img src='https://lh3.googleusercontent.com/_D0O6kVBCUqQeCoaWHOc4mlOkVq61lm3Z7_j_vuyA33tGeWN_V4WEYIOy6B771HKQy0wQMwJ-gGYU9R7xxRVw3lfru3eeKq0zUa3cgchcYgsLlh2xYXO6o8-ORUWeY1QdIaq6CZbMUV_qvyzE2a-vBycXXQPAxmkgtGixm-58GxpqoZsMW-USuJTT5qilNn0qVaKvTLWyUuJsUrFBQ4_MK9DC0-co70CQ8TyGt1J-lBjXYdsH_7sQ3r6Kmtv21Xz1-sCFGVPjnJTW6umFo9QpCgReGrzcOL5C4BMS8udvM40IzoDTStd7eT-pMt2dqpGry_jiLd3g6jAyZbA7_-cPfT6561EfeoMgPfKvOLO8rC30U2yjncCJT7VDwsUAt43q__02cVJDEIR_mniPMVWFMr_QXE2Cs0HRcrxqFNhDTBhZqMUp3w4KuFP2qzmOtAtq2PtknEYLUFv7jNizJk0kyM8Ffhy8p7S6ubqUZnbMQ4CassAiKDT-D547rO6smrA8QPSkhbE6FcWUX-1kbRsLxjFM3VTX67DgiY-8eJhLXo72dfDbIMgm1jSxLBctOy9EE60q-tZMz9nijzuJXPodf3HzhcXAIsbmXyxNKOdjn76B5YQo6ybUaJzE17ENy-Gw7oKjG5-aMdCxryOMQU9KklWRhchpZgVXEEuCwJcjMhgqRyibkKQUehQd8clX7Jjv1VQSuSAa8BgYYFcmhLmuaHefQ=w1920-h723-no?authuser=0' width=600>
!! Advantages of using libraries like [[Trax]]
* Run fast on [[CPU]]s, [[GPU]]s, and [[TPU]]s
* [[Parallel Computing]]
* Record algebraic computations for gradient evaluation
* Alternatives : [[TensorFlow]], [[PyTorch]], [[JAX]]
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
!! Pros
* It is fast and can run on CPUs, GPUs and TPUs without changing a single line of code
* Rewrote the library from scratch based on the learnings from past 6 years in [[Machine Learning]] research
* It is easier to debug as the code is simple which matches with the algorithm written across various papers
!! Cons
* Not backwards compatible, You have to learn from scratch
but the pros outweigh the cons which also enables faster [[Machine Learning Research]]
!! References
Official Trax documentation maintained by the Google Brain team:
https://trax-ml.readthedocs.io/en/latest/
Trax source code on GitHub:
https://github.com/google/trax
JAX library:
https://jax.readthedocs.io/en/latest/index.html
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
!! Classes
In [[Python]], `class` is a way to define common properties and methods for similar objects. In other words, classes define common variables and behavior associated with them
For example, a color class will have common parameters like `r,g,b` values for every item defined in the class and methods associated with it
!! Classes in [[Python]]
# Name the class - like `MyClass`
# Next, define methods associated with the class inside
#* `__init__` method is for initializing any instance of the class and assign values to its parameters.
#* next define custom method
#* `__call__` method is used to call an already initialized instance
```python
class MyClass
def __init__(self, y):
self.y = y
def my_method(self, x):
return x + self.y
def __call__(self,x):
return self.my_method(x)
```
```python
# initialize MyClass with a value of 7
f = MyClass(7)
# when called with value 3, it adds 3 to initialized value, as defined in __call__ method
print(f(3)) # output = 10
```
!! Subclasses
When you have multiple classes that share some parameters and methods, it is convenient to define them as subclasses from another `class` often known as the ''parent class''
* ''parent class'' - Domestic Animal with parameters - name, height & weight
* ''subclasses'' - cats, parrots
** Each subclass has their own parameters and methods
** Any method written inside a subclass overwrites the methods in parent class, the __init__ and the __call__ method are inherited from `MyClass`
```python
class SubClass(MyClass):
def my_method(self, x):
return x + self.y**2
f = SubClass(7)
print(f(3))) # output = 52
```
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
!! [[Dense Layer]]
$$z{[i]} = W^{[i]}a^{[i-1]}$$
<img src='https://lh3.googleusercontent.com/KiMeEV9uwoXZH3-YqfMZ4lKAROjlFJhHiSh4L4Y6MaSho62yBrAJaXDdpwZW3YP-Go7CqXuRbbh_uoEeZOvTLB8qCPIoVGosDVIZoSILY3oW32ODfnaDiZbzuaNm5MdNJ_tpaJ-N8zd6dWen1JI_ZUPpMe7i96YJgQIZ4MzEcWbnUtRzc91UO1RgQDMe09wfcfeIRe7qeJZGSyjUf0TnWks9ybGL_SMf3mKj0YFj-GjLikTQjOu_ZsSxceLWhyIs4w6tnQrMZ3Y3a8aRTVK1bEPHWfMAj9rfOUNyCStYaYomy96TMRkDfk3mxbuKDTM_d86pQ265WZmwtsstLdACn76UTJXicBbZExWQ8hhbTMHFnFPYdOdiXjWOVfMUK5BPvOyTjIT3Bp1zQ1HSCfgDXh8LRyUPCyo6ZzmP6XSzF7Ea3I_kDbHw1P2J9yPaqPFjmKK5cDl4U9zDO_xbBR4HOP5lAQ0VrU8zVPV3UhWQoZyYq_Q17eJedzlqwl4RkFwbpqpvWWqLbtVnpUOtj4kJP7cbYwB0IOoodlCaq8suULpJfn_JoWQP25HcloZq5-nog6q7IicWD0Y9ATM4QpFr-kEPSCF1EPoMMXLSM_lhEbuGAvNucrUcPuAsdzUhztKNRc2FjrBXig_-IwSyoxI9rWOUuKo7nD6Re-78rkOpxNBdbukHavP2B0qsF1RsHurCokauRFxl2q-tTFi_8VOliEznSw=w1888-h814-no?authuser=0' width=400>
!! [[ReLU]] Layer
$$g(z^{[i]}) = max(0, z^{[i]})$$
<img src="https://lh3.googleusercontent.com/lRoGFS3RkWkgoOf-WMQ5MbeLvnqa_3pN7AeFRS4phsWvgpn-4z8cogcN3_HZtBRANCNyfyGoXxP3BDBkZ20pHfFXFkBF4lhYvOpgtutAwcZlJ1mlXafU_cEGNO3FBAhm4O0mX-qdhpf6BC3nZETZ9gG-bzPcWkhj_yoNYn1yT-crm_r9fGdadDurC4SayqgyXvkvBSQjQSqSeTY66LVn_YuRA5psqtUrOgBLQMjJ_sIR9m7iM9dBHQKaaipROwXNAAPaSsLVHtmbx0qCwYH3bbtDDXzEFcykK8hRYL_pzE5hZ6sQajlTyX1ju7qKqvSjt3mEqkVuby3ndb_0NDbGsDPKqbRl_unbKAnS0THdF24Xdt2XB2cOmTb3SqMVC7J5rq6ZTuOw1tTFriu5IWE9wjuBhs6BkmEQyOKTaHcwMVZGyx-7GO5ZbJySKARJd5du8mKDdLKGU_oD0mwwwfvt-iA9l6qqBZti6NR3PgiT3ftfZJPPdll-mJUf1WvFpyhMJEqwvHg357anY4ElLDOL53eax32BnrFNRtyIL-GXZu-a5LJU1G3EvXYNuE_jBSR8h4KVL2EfHQjnQ3v2_oC2ewcvlpXygnjENzg_fvZzwufjiV6LAnLaQfhW6FKi5v0UTQRRDpumGKofSoCbC5LKhK7YerY0SnVVzm0TiRJ86kdQ0kztcgoiZk8s7ODJCqHZO00HTf1YNWNhrme-FNv_dpHAkw=w1828-h770-no?authuser=0" width=400>
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
!! A serial layer is a composition of sublayers
Serial layer uses Sequential arrangement of layers - encompasses whole neural network model in a single layer
<img src='https://lh3.googleusercontent.com/SGGRzySkCio34SJGxJ8tt5Iv6CvYZCaur8xTm_06erTpakJjJvXaIPilhV37weFDmq3tTv51ABgyNqEf8mDZ2LjakZ4OGS_9sJ1Ng8uq3TO2zwx6hOGm4ZM3PCWfyStymNKAaJ3WNY0Xl3E3djN6iUIr0cX1s6kkA5_Cy-QGfhBg8ve3j0m4Fd3_8PhkZCXVueiNRhZN-Yta8lcmNaEr-r8R3pMg3Ckwz-6g_03Main8ya44jD9UC9O0WuqsQ96HekfUknz3ChJm4fA5OvS-1115WJDHGCbsaHE3c6PZGxjhAxvmRO0Rxi4zl93CdSOw_yjlbajzJN4T6tzfX7ItYGzMpsAxJ_mCbi2Yu1qQIpIwJkq2-xZtFbrOuEo5Isl1IZIaynbrr8MPY2So-yrVJ_3nnU-xrN6oeOI1LoE_vGsq16PigEkPUlJNx337GME2liZo2mgROCCZqTHucL4fu6ep1VzsbanjpMlo0rp1XpZEQSrNBQSuufW3NV4RCPvnnjpael7z3nW7oum-wB4Yd0viOqSFR5lRk04n1zCfejWlLO9dRFktjO4H2lJD_TL9ORDF9GYePux5K3JdMqoEoZ6NnhgQkHdHJgP6NEr86aYBOsACwfwIipa-sJEwHbZez51IXhbQCInYNALBA1eMMm_AMDg6pA5xTqEC82CS0iNgRYUPg09MlDk5lN7yPY1yLQErx5VEbxFottMfECjCUJqtxg=w1840-h724-no?authuser=0' width=500>
,,[[Course 3: NLP with Sequence Models]]| [[20 November 2021]],,
!! [[Embedding Layer]]
* Takes in the index representation of each word in the [[Vocabulary]] and maps it to a representation of that word with a certain dimension. This layer is trainable in the Neural Network
* For this you have to learn a matrix of weights of size ''Vocabulary x Embedding Dimension''. The size of embedding can be treated as a hyperparameter in the model, which the model can learn or improve the [[Word Embeddings]] on your [[Natural Language Processing (NLP)]] task
Tweets $$\rightarrow$$ [[Embedding Layer]] $$\rightarrow$$ Matrix of [[Word Embeddings]].
* Using this layer allows you to learn a good representation of the [[Vocabulary]] for the specific task
<img src='https://lh3.googleusercontent.com/JwXt9j6hbiD1Mxi2_i9LqS-TUdMJm-BYPYsStsXXifVC9NFzfRZ6F5f4j3I_Ih4cU_swXTU4CpE_WoT_Nd8O9HXnNENR3MbvAK2RzyAedQpr2I44_axW_P_LZ4e7rFLYgdT-pD7o0Q8qM9KONk_4kWB2fAFZeJt3pu1VuHM7uOnRWbh6cht--fovUkW3rARzFWXnIJNALVyEYDP-ene947_Bv8Ji3kE4lHdrnUixePwyfxR6vYo3gDUMEA42U8b8P9DioEdMhi6MgAswWPPCEfIjJNz63XGGWTWjAbHiJ9rQ3rWZEV-OAdxO4lgZSHzF6FNsgEWpPD_UYS7R8bM1Z8MP5ZENTHJurAuVO7_4nhL7SfJjzvuePNuXVEimtDW8qDcgsJopBt0lcGiNWsctE-FZuB6sx6gptFj-fpjWPMCU87x41ZoLWrN4AvGVbtnZ-WltHBfWRIdI62Irrkx42GOZrGCQ883UflAkl6V__zq-q6W2IFoNcOIPSv9ef8wTQyc4Z12ztHqFmoDFlELxy7eY3Ilrz6hUwRqGok1WadLoCsLhNIzRxOxVL-QMq4fGNAqmLsuuQkc_7s0jk9I5_kTHSqqsmq5eEcJW-PnFOkALT7dvEH3ZDk2V3d6FnTxGgE_zKE_cAipXn6c_RsvkjaqWLvTfEkYIZtDUYee5xwebVHr5N961dMi2C7DjJ4-PU25P1J3eYg5VYCn-g6hiqJ0Vjg=w1860-h780-no?authuser=0' width=500>
!! [[Mean Layer]]
In doing this, you end up with a lot of parameters to train. So as an alternative, you can take the mean of embeddings. After means, there number of features are same as the embedding size
This layer does not have any trainable parameters as only mean is getting computed.
<img src='https://lh3.googleusercontent.com/psI13EQRYsNVN7HmFefIh1PUpOeQGGzKWF97NExBb7bpNj8DLJsJs6SqAB-Hg2WZpD58PSKy_siEIj20UUbSjaoqdXhcFRDR8WLquw3ZHD3HLjJseegcu3VHUMW3b__oJCth2hjwBP8YXvQOQcnl8jreTOfJ5o2EDfv67Vi2I6MHslrS1P-J7Zp0fQrYyUoEBC80gHBd30Rs8D7yJNtgfMaETpYh9E7o3pPv_50hsPgKp1joc5D9c0uqPZgIufhkZS-RVLiNQ82GwrTAsSQG5af8HeFm1QZBRFQwYrAH5CNRSWu5T2__CHcJKYzSeaAzLrSD6-qArAFM4YYZ9U1mCq7NU_cGIUPe9qPkon_wxiYGJ3Lai7ucLspUEwLG881Y9Fn4eE4TB4heay3qOwZ6bix9smxNssFBTC27GFm9MDl3fR-QwfnN2HaUxp6L5knXwvWpstInM0NW19SxARbgOKVoJrqqLIEFHORPHxKtMQwgv5PkoyU5RJsrOBV9Pk1NCYdjNCSEBTP3HUeoG_WlQxlvJ9Yyl6DIUHL9vdrDgI4fPLliqydvkxpHLrnH8ggrjEkU-Vrq3CrdhQ85CQAT4YSVhUNCRm_dKKpaIcasaJU6VcAxHvSIAjn-rrNdzqQfnVMVfTn_8av-WukVmUCgV_XmlAZW-EkLkmI-Wf2aOEtMts-hsW3YhgRjltaucmxqaSc6Jwyp9ddU7xRJLTvztDkF_A=w1872-h772-no?authuser=0' width=500>
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
!! Computing [[Gradient]]s in [[Trax]]
$$f(x) = 3x^2 + x$$
$$\frac{\delta f(x)}{\delta x} = 6x + 1$$
`trax.math.grad(f)` automatically computes gradient
```python
def f(x):
return 3*x**2 + x
grad_f = trax.math.grad(f)
```
!! Training with `grad()`
apply `grad` function with the `forward` method on the model as a single parameter. Then evaluate the gradient with the weights and inputs
```python
y = model(x)
grads = grad(y.forward)(y.weights, x) # forward and backprop in a single line
# iterate until convergence - this is gradient descent
weights -= alpha * grads
```
<img src="https://lh3.googleusercontent.com/sMo_1I_NhDARlcsq6_de8_RMa6xZSSJzLnixegqrlHVk2FFWVz65AaekJkBgS0kXuHONfEttHlfgHp-PeDOCI-LXfxKmLFOmp04m-xq3FDWSlOXBFgBpAAZTdNdeA8ZC5TwJZmZOjZfCwSUFbHWttPbXfc28bl1lY0CShcXCmsxUf5zzQD1SJIsBh8U0vNqXuh2GGQn5Joa6f9uR7QZY0FWwrQ_WLDXSzsooiQRheLvBR5xPz5kB7UKr1h8fIbpnFa933ZG6p_lEg768DLYWSkQ0sQ5S1ZvhDw2ZfbWIG6X12mq5nTAw-ktIt2ulRJ39hW5ogNC5YyswhUzD8OYYd4Po5pVX0CofT6-B9vIqZcgQCZwmVZg4iTSez7wsPvUXm4S9ilZk727byouaEyoQ8LTLRuA2AieT2otAF0TuSDSqHmlXqOXf2AHV2bspwKz5fEucJRAtQ9he0OBSeitY6BcpzqeH_6BCUPFEqCWVNPO8sJZ4fiBqjMtGjTl9JbCDeSmQwb5DfkQQqT7Yf3qWD39v6I6D9iMou3-rktWMi70w1cOVeN53BE66IBhv_8iYyT_MZFriguz-Y7u5apCsPyP4L61ON5rdX_0_YEmgyQOT5FZ2TE0RCEOuu7PrFhC0Vffd8-k8Qwmxr5XDeYo938U9-tW9i4cvk4y5b04x2UZ9_OXSEbdzgkwz6KpZUfTur7E-SuAfxmsEm0PN76yj-HdXhg=w1826-h656-no?authuser=0" width=500>
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
* One of the biggest problems of [[n-gram]]s is [[RAM]] and memory consumption. [[RNN]]s help mitigate this problem and outperform on [[Language Modelling]] tasks.
** It allows better generation using [[Bidirectional RNN]] keeping track of information from both directions.
** Deeper RNNs allows us to capture more abstract dependencies
* learn about [[GRU]]s or Gated Recurrent Units which are more powerful than vanilla RNNs
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
The problem with traditional [[Language Model]]s
* Capturing long range dependencies is not possible without a correspondingly large corpora
* high memory and RAM usage by the models to store probabilities of all combinations of words
[[RNN]]s are better at making predictions where long range dependencies are required while also reducing RAM and storage issues by sharing multiple parameters during computation
,,[[Course 3: NLP with Sequence Models]] | [[20 November 2021]],,
In the sentence ''Nour was supposed to study with me. I called her but she did not _ _ _ _ _ _''
* The correct answer is ''answer''
* Trigram would only look at the word ''did not'' to make a prediction. The word ''answer'' would have lower probabilities as compared to other words and so it will pick something like ''have'' for prediction which is incorrect
* [[RNN]]s are better suited to handle this case since they are able to capture much longer range dependencies than [[n-gram]] models
Following is the sequence of computations used by RNNs to make a prediction
<img src='https://lh3.googleusercontent.com/MzYV-HIFFVFI8ATKpZ-uQkgrgC6fEwRo32A4Z5Dv9vYt_LqU43zTD-GvNW7XK_6WbzrFpEE_8cQY9FJSgUMQMOjQUdq9Lz03dDe0QjZxCBcugRJGz2WumUvGuq4FKKh3U0T8lEb8qOO7D5e8E_eiIzbMpufS2FpHjpOHxbUwB-fJAaFalNcn-p7JyROOe42Cd2iwxsuN8O1DRvATqvaJXsaPCFUgmak1_XHQbSA1dC7Vh98aSDBMhtqXJFHL-9jvSfflUfui63dwYShvY_v7Z7I13O9rnkDomWNWOyVuDFuQpu7FucKhwATqJFJJp_dEGlv1rRJqV8luFXXVx7j0FHmbktKUHbIm3O_ybYg1ATsXLuAywsvp88rDwDYaYoWkaXuGRQ2HI0dh3Awk_kCIHruCygDSZBCVB53WsVBnUB8A1NpmpcSJY_e6zMBU8tD-6KN22aRyu6OHSpLdeO_Veddxl2IkHyRbaRNfvb3SKF7ljzIF3VbBue_K8Ry1u3MSq3n3h3vKFrxT69t8qwlfoxUyEUJ7fnGC2mhaBOG7yjYlMGhEP_CL5dAOd-xEncfdI3055gKlhH2QVPG2Shei2HkdWK7fr3Ro2HNM_c76-MVIG4OPGgsdSNEYyYAkR_-3pb2fn9s3tI3oNYZnntJAI5YMgbckIvVNSeMPT6G8mGsguCITJ8bK-l7_e9MWc6KNdVR6CQIDoFpk2AwCQA_a_Qha_g=w1920-h755-no?authuser=0' width=700>
Here the shared parameters are $$W_x$$ & $$W_h$$ which are also learnable
,,[[Course 3: NLP with Sequence Models]] | [[22 November 2021]],,
[[RNN]] Architectures
* One to One: given some scores of a championship, you can predict the winner.
* One to many : [[Image Captioning]]
* Many to One : [[Sentiment Classification]]
* Many to Many: [[Machine Translation]]
,,[[Course 3: NLP with Sequence Models]] | [[22 November 2021]],,
* Hidden states propagates information through time
<img src='https://lh3.googleusercontent.com/llRUNwGWXu0SqIiRFNc9JBD3_xrBUaVMXzygi9eDDRJXxt6zTMNE-XQJ4w4nJI10yseUyBW6KpWITdP1eVgpUVscp12ar5cA6zaaEFlUO33qxVMMJ602Z6F5mZ8yFtSMQ2ujJyWdD9ep9ibaNo8eVw-7i8qfgvmkhsK678mkyTUYSJS5k8_8DMf07YVgztO6xHlsa2UCkPXe7Tb3d516Wh23hizcv6B_WTSoZMLi6-ld_iJrNNnAsOmqXVTW8XqNpbgPe6_OaSSQ2Z601WIDPVwoJMRj3NOnGQRzYM0MynS4bR4Pdw_ASpQfdP4YfZht3O1Ev8hN27Q4jkPxm6pAwRTwcl0dyEAeXjwExxR7Q8eRNZW0nUb88nw3wOuryJkl1FYuEtbKdDWnXRV9NvMQrknOxeVs5Jcwy0GbwNTkgpCGaY63PTAkPDRaEU4y4hKipBQC0kqVUDsQJoDzSwwPXq77L4zwBdkqOlVEYXhe0qr7aVj4Y2Cks0zE1F2PF2XH6JZZJzOw74ALA7GaYf8XDXIsfZRrEDQtu4BqxmhJxkajYDFVRdn1cshCJ4OAUcV9l6c-2zeZkpmtkhVovlpLOXLVfucEc_qtUfTbIFMqIErqwGMZpogaDCKREcryz2oiF6B_ipFNnC07nOrWuVWcvTp4A5HOs-z2tbVrW18hVBlG_d6BgI6yHq4e1t6mofTBY8Dc6kNaCqLdEiXOJD-MijL1HQ=w1920-h648-no?authuser=0' width=700>
First, compute the next hidden state using the information from previous hidden state and current input value
$$h^{\langle t \rangle} = g(W_h[h^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_h)$$
It is same as
$$h^{\langle t \rangle} = g(W_{hh}h^{\langle t-1 \rangle} \oplus W_{hx}x^{\langle t \rangle} + b_h)$$
Then compute prediction using
$$\hat{y}^{\langle t \rangle} = g(W_{yh}h^{\langle t \rangle} + b_y)$$
The trainable parameters are $$W_{hh}, W_{hx}, W_{yh}, b_h, b_y$$
<img src='https://lh3.googleusercontent.com/wbaLuCmuFW867tL8NVEp7k31Xi36cKqUYAWmN_mPEtXVEL9n7Tcx9nQsr7v16VxGiY-7hgHVIHjMYqurVEyXhFvt4_ykxXq_d6SmjWCg2GHukOFen3mLWlBhMDe2v3TSh9SYwQYBarA-sxLSu-eJX86WBgKisZSBHyxIazHUCphCQxwg99rVQVkrCK1Hg683RrobwaTksKz_l0RO4fYTYJe7p2ccp-5_JdEScqEULhiyClsiJmZcCCkhjPH3doBGzKFCnvLaLhKHcuL0-SsMZ9c2EpjYK3cHitabAer6xzVqQZp91iEPDGU-d9T1-IAtWFv52IMf0B9PTBhpSQ9NkBKDHw-nk-EajVrwksgApM4qo2BUYh5IeuWYq7-3ZVyafj7hkfUZNlvjcdEdEBl858UIHiiFvHaJV_136w2zHBsDumt-cEKzxYrDYQzoIhE0J_aHjbLsQX7LXHOEWIGxCAtxUpsWxK33oHgaVh_HhhtMLsWf9CGgIUPuyH4FXimssAv160fCobEj8WCgtLg1LgX2omhpB8u3oTrJsRjOs4W-2doA12wPln5RgJmnu-H-4I5kzJbBxARO_CJOOeguBgVkRlJaZn8Q8uN1txTXmDNg5NEzTaDsr4gJnqXsbZRjh2w1Tyj5JJCBO9cyHf6ows2JeslsWBA724rGo4Sj5waKu04EBpX7LBlPFIn9VkoUtzgUOZRyBBGt0u7ygWKDjuVHig=w1920-h712-no?authuser=0' width=700>
[[Course 3: NLP with Sequence Models]] | [[22 November 2021]]
To predict whether the model belongs to one of three classes, for example, the loss can be defined as
$$
J=- \sum_{j=1}^Ky_j \log \hat{y}_j
$$
where $$K$$ is the number of classes and $$y_j$$ can be either 0 or 1. So for a single example, we need to look at the probabilities for each of the 3 classes and compare it with true values to get the actual loss for a single example
<img src='https://lh3.googleusercontent.com/2c4VSsWC-qwOsUL4h73nf_nptbnwpRgoeswQjqZHqN64oglo1SvlZ8iWjEz-YfxVWRllb4ZxEURUxssKoKLiMhT2EHZxFk5DE4tikzz4xnmy3FYKMPhfoaHY6K3FL9bRM7JogflO6hla-DRH9sft3XOI5qo-LZXpA5i4kZkzlhA30LOQA-MBjRe3KDUgEezYK1Frd8kMMlek-H_6HNIbO1MIYQRxzD0-RhTrNteSfGzz_R4WZknBr8GvqWQs6-UPmFyQNYrZLeNwU6hfr3xGlOGJbXm0xB-EDwDZA3VKxHDtqsmNPLZs0D6xy9dtOn76_YX7Fv144MbWjVkBZE5vOQQluxbKvmLfyON7H_Qk7OA-1iPVidWKBD3ozTzl2ZcnaGnPQ3uGIn3EKtmPJLTM2s1fadqFLBAEhsVZzEgMSp0_fB3ygCL2ALfQmGmMtolGcIHY4g6dqkqYayYoIEMPqrk_iu_w_umwvyKLmjPeD-eg-lVjOzBdbzyfF-PfhzfqkUKFu0tBgkJq2yq0cNuRi0AOvj2vrINiNAzaMmFaIKbMAL37TWzNQIrhWUpfnJ8Q_0FFFxBUYM6hLy5qyBKZGXHyJvZ0LUGtR97_SZd0iQFDzxmmoBDKPfWJUzD1jGCRRJ1gVyek7Y3GTO-uoZN-Ru0bpi8J-A8F9WnRPh5OYAwWAq1XX-PjF3-4FQfo-otKerRHd293Ot_MS91eytDD1LeLyw=w1920-h710-no?authuser=0' width=500>
!! Cross Entropy Loss for Vanilla [[RNN]]s
$$
J=- \frac{1}{T} \sum_{t=1}^T \sum_{j=1}^K y^{\langle t \rangle}_j \log \hat{y}^{\langle t \rangle}_j
$$
So, to compute the loss, the only difference is summation over time T divided by total number of time steps $$T$$ - average [[Cross Entropy Loss]] over time
,,[[Course 3: NLP with Sequence Models]] | [[22 November 2021]],,
`scan()` functions are like abstract [[RNN]]s and they allow for faster computation. The scan function is designed to take in a function `fn` and apply it to all of its elements from beginning to the end.
Such functions are required in frameworks like [[TensorFlow]] for [[Parallel Computing]] or for executing in [[GPU]]s
* Initializer = refers to first hidden state $$h^{\langle t_0 \rangle}$$
* Elements refers all words in a sentence which are input to RNN as time steps
<img src='https://lh3.googleusercontent.com/8NGiQo1-C6cXqAzKlHcvPB-bJvCoxBHj4YqtoFFyJ20RFxIzeQrmnpnh1QIjT_ICYqZIiIcgcr_UG1RHnRY1rarzzNbVtps-Zz72IIUlvPiWaG7wCiwnE4J9VYNpJ4_Su3SBwGn1j7Tj44h8Xi2zPnw73QZAvCEZrlu-6heYA_Sx9RFALcMUtCDkG8o0fyo_cbig-HUKe2Bc5KRqAqQ_ymjArBtWpQRukzOXUZSwHmm59Vl4sKbbaEz-9Sd_VoJ6Wy_8hU_8foDm9bceCkSWGJkpjTeYIirZ4wYUAVktnA8eRe2w893Qwpae_2B18XiBPrueEyczLZ8Wxz7fEnM8PRSEq1X6CIpJTwyAuh3hgBFzqVgitzBOuJres-ov-9sICO8pviPzp4uaNtyoIrI03DwsMQHVqUqlVr3EuZDeeRWVUMxnmMXHF8eiQO_JUqIsp04hHHMO3UzY2uDZTR9BO128cGZpx7P121fmsJuWekm-rPlAdUcV1rkWDy9VcnmpixUrIS99elaVjMmTZXGTTvv-Rl2HjVAEZRHxsiPTYCV_N7qarivvPbr-Q1k2u8h6r_s_zR_obeWpci7s-68E-gRwUvdoZvxSIw5WMnUmsrzG1H8yT1D7LuFovnNfb5Z-brbWuT2--fxaNo_mSX59slsiVN4Afi31IS-XygzM5Wb7kTWo6zH5dA9XEhJQXj4xiO-clk39Na5xgvRU-zTqByFX2A=w1920-h540-no?authuser=0' width=700>
,,[[Course 3: NLP with Sequence Models]] | [[22 November 2021]],,
!! GRU Architecture
[[GRU]]s allows us to keep relevant information of the hidden state over long sequences, using relevant and update gates
* Takes two inputs, value $$x^{\langle t_1 \rangle}$$ and hidden state $$h^{\langle t_0 \rangle}$$
* Computes Relevance gates and update gates parameters. They compute [[Sigmoid]] [[Activation Function]] where value lies between 0 & 1. They help determine which information is relevant and which value should be updated with current information
** $$\Gamma_r = \sigma(W_r[h^{\langle t_0 \rangle},x^{\langle t_1 \rangle}] + b_r)$$
** $$\Gamma_u = \sigma(W_u[h^{\langle t_0 \rangle},x^{\langle t_1 \rangle}] + b_u)$$
* Next we compute the candidate value which can override all the information in the previous hidden state
** $$h^{\langle t_1 \rangle} = \tanh(W_h[\Gamma_r * h^{\langle t_0 \rangle}, x^{\langle t_1 \rangle}] + b_h)$$
* New value for the hidden state is calculated using the information from previous hidden states, the candidate hidden state and the update gate
** $$h^{\langle t_1 \rangle} = (1 - \Gamma_u) * h^{\langle t_0 \rangle} + \Gamma_u * h'^{{\langle t_1 \rangle}}$$
**The update gate determines how much of the information from the previous hidden state would be overwritten
* Finally, a prediction is computed using the current hidden state
** $$\hat{y}^{\langle t_1 \rangle} = g(W_y h^{\langle t_1 \rangle} + b_y)$$
!! Comparing with Vanilla [[RNN]]s
* [[Vanishing Gradients]] is one of the major problems with vanilla RNNs. This is because, the next hidden state is computed with current value and the previous hidden state and another activation function is applied to compute the prediction with the current hidden state, which leads to information loss over long range sequences and thus Vanishing Gradients
* GRUs compute much larger information which leads to memory problems.
<img src='https://lh3.googleusercontent.com/mHedES0KcCGnUNtU9loIJ0esJQPyJzSEXiqW1EOmyJWTezzz0iAG2OS14CxnBF-WisE2K6czHxBFsMeAIY9d0mxEKK-JL_qVU_YUja3sEAJbf6-6HqJ27EjcLlqK7tEd86PStvgbacctZAiX3NVK9fObX_Neb8M0XVuHeqkZDmS2nOUx4k_93gJJJgC-WO7yRJ8-hpCZ_j9rjeHaMVggdX9gp-Gga40lKDmnIW1IFrh7ST1uudZPQysS0LifCVoCsYo-Z-L_trulW7CXi68GUuH_n9YWSwxYaOTCahz2iN_H_vYcrGjpot14Hs-CiwSx-ssqZdrg2Xu8U2L27wm_cjLTEPp15viaZjv303lnKSHAHhXJySxL63rbtWgra557AC8401PRPycAGPNBzzLQsfkB5Nn6feFUba3WQyIH39ra7r8wH8S4I8iP5TTsisT-9Gn4HKVYWhrfYbRp1349u-ECrceTxbfj_cj5VyVUUw8VLQ5US5RNw2ehHsayKyqyXO5jdCDA3kmnySbjj2JhQYe_g3gPHzMzBBRX8WZLOWLTsURJXlHUFraPPfzLmhCG4QR3HBazI__pavWe0vhoRUOw-N6h1-Pr5GVJRTv2X8bGs4CiianCwinnbAoAC5ZgxD3d5-E41mzQ1ZL4CS6hqxYlTf9TCWgTUdPOZ1Y9pJJ3YmtaVJcIOHYCwJJS7E0KPm2yKr9X2pFUVykfXQvpVdxpbg=w1827-h872-no?authuser=0' width=800>
,,[[Course 3: NLP with Sequence Models]] | [[22 November 2021]],,
!! [[Bidirectional RNN]]
Information in [[Bidirectional RNN]]s flows independently between past and future, which means the computations from left to right are completely independent from right to left
<img src='https://lh3.googleusercontent.com/rbLjFELix-UAVGSXgxD8aS13N8dIwG2TJysi5rssuu8Wv6sWSaHXPDhxSPE8jLVj4QbJEGkGmx_GaGr_ekWGtJDlc9sNLBDBuWz_IA_WImVpGF5J7sO400axNx_w7NqOnWRsI8eUCURVQVSDjYpnQC64yn8zu1wXdzD0-LQK1jGwt66qstb8wzmF1-EwQQaDIBn0dRWx7SFUZUaJg8D-lKSa63KxIBc9wF2rrhd0w2cccXWmNr-3IwTHMXYBC9Kb7TKSgHF99ry-t8D9tPFREqgZ1wOAmXz9Qjn3N6FukA7cMMdErohOO3_C-_YwIgsh7ZpCrs5iVBQbmniF106Vm9OKKRLJcUnRGFZxo88z6ZDaBlRlJucnwy3NGai3owflZemiLjGB7jpUZHxAzo0nRDmi20SF_AbQD5B-HFGfvZIOlS1mArwkmRMhZAk6AuUjaXN0aT2oKdGvR9ZpUvRvuWXRjJifXEPueXmManSmj5_k6jSxuftEEi1GZCH_lI0nFGuS6ujILlnIRTWnKQ9o7myNkkTzVCCFEhdrUAQ3q95Sx52l_nvSF-yHCQkjziobPrp3XYakS3B7XX-wAvkaEakKoaWJc8YFEYrzJYIbaG41liBpoHKvJVJ00wbwXtvF87dyNLI1d_VyCXkWDA6HoCiGGK5BClkoAmu1_Yt_0sun21LXV5BfeEpz3fQykfY5bARglJPPVun9VPgslfUN8qceyg=w1920-h534-no?authuser=0' width=700>
!! Deep RNNs
These are [[RNN]]s stacked together. The intermediate connects pass activation values just as in conventional [[Deep Neural Networks]] but for every time step
<img src='https://lh3.googleusercontent.com/dlVJOFhWYXafjWCXS1pffb1pO-oMGHLbS97CBx07GHZ-RqlofeKD59NJQHaSMBJhK-PFflHgmyPTs6yF8tpBn-oHkicHyHS6hKPdyTYcHkKcym8Tx7Q_F-AxviSOM97EwWJ3Ij2nSQgcTCLvHQJ_wOP_ANCLbM_JYsavzLWLbzx9CMTdI9SpxYG7Nu-w5WsACV88itH-0RYmoKFKRVC-05Ke72QY5aYVU5hoexkkwAC4ouGZrOO8RC3RnLHF4fDeH4OiGkidUsangyPNqVEZtJ6z83SOA-kdHjrFsP1pqcafQHKgU8BRgMrN3KChEB6XsxDzwXjyNPi0ZBG1qNrAqSOoDWcvoL7c67Yt-QoF6nl7_Tzs-lH-2NN6Nq27eIPWixbDD0vuHKYK0FJQzhqewUXlm2MmFo978qt_o4Iv0EWmdXAOSztjJddXiVxeb3ScGmQA2UdqKeZakia7KkorbaZ2BAh7stV87KKhB9IblXGkPsC9Zt3v25YpJFi-3jryOzf30xS4TF0DNKsctPe9P1Hoy6p7ZsMVlnFvbLz44bqt-UJ8iuO6e38oWWcH9LKDQ5H56ImzK8I6z4Mo9kgLksR_DxO5ZpjrqngHFRuof5ehwvkmrJpQGMfHa3-rBXqHD8tmZryLVPrHos94H3VhgNuUooN5_IAq6VvcEPMcVvBRglHXUUxC8jfKx05XmipjQyC_xnQTBSZt8yY9-y28K961Ww=w1920-h774-no?authuser=0' width=700>
,,[[Course 3: NLP with Sequence Models]] | [[23 November 2021]],,
In the assignment you would predict the characters using RNNs. The same logic can be used to predict words
,,[[Course 3: NLP with Sequence Models]] | [[23 November 2021]],,
Cabin fever refers to the distressing claustrophobic irritability or restlessness experienced when a person, or group, is stuck at an isolated location or in confined quarters for an extended period of time
,,[[The Rosie Effect]],,
!! Circa 2013 when I was obsessed with metal genre and Bluetooth headphones were kind of a new thing
<img src="https://d2t1xqejof9utc.cloudfront.net/screenshots/pics/e6ccd1d2dc306754e583f18aec61b188/original.jpg" width="700">
<img src="https://d2t1xqejof9utc.cloudfront.net/screenshots/pics/bae8f70ab8559543ff5a5a0771dfabc7/large.jpg" width="700">
!! Rooftop Water Harvesting solution
A solution that we designed for rooftop water harvesting to help the people living in Kamand valley of Himachal Pradesh save some water for bad times. Lack of motor
<img src = "https://d2t1xqejof9utc.cloudfront.net/screenshots/pics/e5e482fc1862b32ab4186d664bafc765/original.jpg" width="700">
!! My First Ever CAD Model
I had just got this Dell Laptop in 2012. One of the first softwares I installed was SolidWorks (a CAD modelling tool) and published one of the first models on [ext[GRABCAD|https://grabcad.com/sumit--3]] community
<img src = "https://d2t1xqejof9utc.cloudfront.net/screenshots/pics/c957eb1108be7bb0d287e0c084168e4f/large.JPG" width="700">
!! Candlestick Screener app
!!! Heroku Commands
```bash
heroku create candlestick-screener
git init
git add .
git commit -m "first commit"
heroku buildpacks:add --index 1 heroku/python
heroku buildpacks:add --index 2 https://github.com/numrut/heroku-buildpack-python-talib
heroku git:remote -a candlestick-screener
git push heroku master
heroku ps:scale web=1
```
!!! APP Link
* https://candlestick-screener.herokuapp.com/
Uses money control metadata to generate URL of the stock containing financials like balance sheet and p&l
```python
import os
import pandas as pd
from bs4 import BeautifulSoup
import requests
import re
import json
from datetime import datetime, timedelta
metadata = pd.read_csv('../datasets/mc/mc_metadata.csv')
pnl_files = os.listdir('../datasets/mc/balance_sheet/')
scdids = [x.split('.')[0].split('_')[-1] for x in pnl_files]
for i in range(metadata.shape[0]):
stkname = metadata.loc[i, 'stkname']
scdid = metadata.loc[i, 'scdid']
if scdid not in scdids:
pnl_main = pd.DataFrame()
for page in range(3):
url = "https://www.moneycontrol.com/financials/{stkname}/balance-sheetVI/{scdid}/{page}#{scdid}".format(stkname=stkname,scdid=scdid, page=page+1)
try:
pnl = pd.read_html(url)[0]
print(url)
if pnl_main.empty:
pnl_main = pnl
else:
pnl_main = pnl_main.merge(pnl, left_index=True, right_index=True, how='left')
except IndexError as e:
print('Error : {} ! No data on page {}'.format(e,page+1))
pnl_main['stkname'] = stkname
pnl_main['scdid'] = scdid
pnl_main.columns = list(range(pnl_main.shape[1]))
pnl_main.to_csv('../datasets/mc/balance_sheet/{}_{}.csv'.format(stkname, scdid), index=False)
print('{} > Saved {}'.format(i, stkname))
else:
print('{} > {} exists'.format(i, stkname))
```
Loftus and Palmer set out to prove just how deceiving memories can be. The 1974 Car Crash Experiment was designed to evaluate whether wording questions a certain way could influence a participant’s recall by twisting their memories of a specific event
!! References
* [ext[https://as9465.medium.com/the-car-crash-experiment-38b01e499930]]
* https://www.simplypsychology.org/loftus-palmer.html
,,[[Experiment]],,
* ''The number of unique categories'' in a variable is called cardinality
* The `nunique()` method determines the number of unique values for categorical and numerical variables. In this recipe, we only used `nunique()` on [[Categorical Features]] to explore the concept of cardinality.
!! What you want to do in life - Share [[Goals 2021]]
* Set the context for interest in [[Machine Learning]] and [[Data Science]] - I consider this to be next 10 year thing
* Tie it back to personal and business goals
* Two ways to approach - getting breadth and getting depth
!! Pros & Cons for Breadth and Depth
''Getting depth'': Talk about the director role for getting depth - under which you would want to join as Manager. Could also consider role in Innovations team
* Will provide exposure to leading teams
* Will focus more on innovations, techniques, reading and experimenting research
* Improving existing solutions
* One Major Project
* Timelines could be longer
* Less maintenance and hygiene based work (Expectation)
* Uncertainty of work and demands - Seen Abhas's work found interesting (only to an extent)
''Getting Breadth'': Join the team under new VP position under Jayatu
* Will provide exposure to leading teams with deliverables
* Will focus more on managing partners and upwards
* Solving practical problems for the partners
* Multiple projects
* Timelines will be shorter
* More maintenance and hygiene based work
* Certainty of the idea of work and what it demands - Seen my manager's work and involvement with partners
''Inclined towards getting depth'' - resonates with Chao but also conflicts with [[David Epstein: Range]]
!! What I want from you?
* Get clarity whether joining depth role would inhibit future opportunities to breadth based roles?
*
The city's cab drivers undergo four years of intensive training to pass the ''Knowledge of London'', one of society's most difficult feats of memory. Knowledge of London requires cabbies to memorize London's extensive permutations of routes through 25,000 individual streets and 20,000 landmarks.
Students of Knowledge of London typicall spend 3 to 4 hours a day reciting theoretical journeys.
!! Reference
* Research paper [ext[Navigation-related structural change in the hippocampi of taxi drivers|https://www.pnas.org/content/97/8/4398]]
* <iframe width="560" height="315" src="https://www.youtube.com/embed/sfy9j0h9_O8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* CaseMine is [[Legal research]] and analysis platform.
* founded by Aniruddha Yadav
* based out of [[NCR]]
* recent push by Prime Minister Narendra Modi and the Supreme court towards digitizing the Indian legal system
!! What does it do
In law, the extent of search is constrained by the extent of keywords known on a given legal proposition. CaseIQ apart is the ability to understand the context involved in the document uploaded, rather than just trying to present case laws where a given keyword proposition is found.
* pioneered the introduction of next-gen legal research platforms in India
* leveraged AI to unearth latent linkages between case laws
* CaseIQ, tries to ''understand the context'' from the case notes. Thus, you don’t need to break down case facts into searchable keyword propositions and then experiment with permutations of keyword combinations to hit upon the relevant case laws
!! Advantages
* reduces research time between 5% to 50% of what is needed on legacy systems
* can uncover on-point cases which are not known to lawyers = serious advantage and the difference between winning and losing
!! Team
* IIM-grads works under the able guidance of ex-Chief Justice (Kolkata High Court)
Casemine.com is backed by its parent company Gauge Analytics that was founded in 2013. In addition to CaseIQ, CaseMine has other features Case Similarity, Case Alerts, Case Management and is also backed by a visualization tool that allows users to get a visual search approach of the most relevant and landmark case laws
!! References
* [[Story of CaseMine, NCR based startup that’s disrupting Indian legal system using AI|https://analyticsindiamag.com/story-casemine-ncr-based-startup-thats-disrupting-indian-legal-system-using-ai/]]
* CatBoost is developed by [[Yandex]] that outperformed publicly available [[Boosting]] implementations.
* Introduced two algorithmic advantages
** [[Ordered Boosting]] - a [[Permutation]] driven alternative to classic algorithm
** Algorithm for processing categorical features
* Both advantages addressed [[Prediction Shift]] caused by special kind of [[Target Leakage]] present in all existing implementation of [[Gradient Boosting]] [[Algorithm]]s
!! [[Ordered Boosting]]
The true set of gradients in a domain may differ from the set of gradients learned on the training data. This is because training data is just a subset of the domain. Most [[Gradient Boosting]] algorithms shift their gradients in favor of training data leading to over fitting. This problem is called [[Prediction Shift]]
CatBoost offers a solution to [[Prediction Shift]] by sampling new training data at every step of boosting round. For example, in a data set of 1000 observations to compute the residual on 100 samples, none of the models built in previous boosting iterations would use the 100 samples to get an unbiased estimate of residuals.
This is not possible for limited data but, CatBoost maintains a set of models differing by examples used for training. In order to compute residual for an example, it uses the models trained without that example.
!! Handling [[Categorical Features]]
There are a number of ways to encode categorical features like [[One-hot Encoding]], [[Label Encoding]], [[Target Encoding]] etc. Target Encoding seems most efficient because it does not create many different columns for each category, but only one column with one numeric value of each category. But this leads to an issue called [[Target Leakage]]
Catboost uses Target Encoding with a twist called [[Ordered Target Statistics]]. Inspired from [[Online Learning]] - training in real-time using live examples - the target statistic is computed using observed history. It converts categories in a categorical variable into numeric value using the mean of target variable, but only using the training observations sampled using random permutation during each boosting iteration. During every boosting iteration target statistic is computed over multiple random permutations in order to reduce the variance in the statistic
!! Reference
* [[CatBoost Demystified|https://towardsdatascience.com/catboost-demystified-8b0b538bfa31#:~:text=CatBoost%20has%202%20very%20unique,implementations%20of%20gradient%20boosting%20algorithms.]] on [[Medium]]
* Research Paper
:<embed src='https://arxiv.org/pdf/1706.09516.pdf' width=1000 height=400>
According to [[Carol Dweck]] CEO Disease is - speaking of reigning from atop a pedestal and wanting to be seen as perfect
!!Introduction
Deep learning is a fascinating field. Artificial neural networks have been around for a long time, but something special has happened in recent years. The mixture of new faster hardware, new techniques and highly optimized open source libraries allow very large networks to be created with frightening ease.
!!! 1. Why this book?
* I (Jason Brownlee) created this book because I thought that there was no gentle way for Python machine learning practitioners to quickly get started developing deep learning models.
* [[Deep Learning]] does have a lot of fascinating math under the covers, ''but you do not need to know'' it to be able to pick it up as a tool and wield it on important projects and deliver real value
!!! 2. Deep Learning the Wrong Way
* You must have a strong foundation in linear algebra.
* You must have a deep knowledge of traditional neural network techniques.
* You really must know about probability and statistics.
* You should really have a deep knowledge of machine learning.
* You probably need to be a PhD in computer science.
* You probably need 10 years of experience as a machine learning developer.
''This advice is dead wrong''
!!! 3. Deep Learning with Python
* There are two top numerical platforms for developing deep learning models, they are [[Theano]] developed by the University of Montreal and [[TensorFlow]] developed at Google
!!! 4. Five parts to this book
* Background
* [[Multilayer Perceptron]]s
* Advanced Multilayer Perceptrons and [[Keras]]
* [[Convolutional Neural Network]]s
* [[Recurrent Neural Network]]s
!!! 5. How to approach this book
* The best way to learn about this impressive type of neural network model is to apply it.
* ''Building up a catalog of code recipes is an important part of your deep learning journey''. Each time you learn about a new technique or new problem type, you should write up a short code recipe that demonstrates it. This will give you a starting point to use on your next deep learning or [[Machine Learning]] project
!!! 6. Outcome
This book will lead you from being a developer who is interested in [[Deep Learning]] with [[Python]] to a developer who has the resources and capabilities to work through a new dataset end-to-end using Python and develop accurate deep learning models
,,[[Deep Learning with Python - Jason Brownlee]] | [[25 July 2020]],,
!! Introduction to Theano
* [[Theano]] is a [[Python]] library for fast numerical computation that can be run on the CPU or GPU
!!! Simple Theano example
```python
# Example of Theano library
import theano
from theano import tensor
# declare two symbolic floating-point scalars
a = tensor.dscalar()
b = tensor.dscalar()
# create a simple symbolic expression
c = a + b
# convert the expression into a callable object that takes (a,b) and computes c
f = theano.function([a,b], c)
# bind 1.5 to a , 2.5 to b , and evaluate c
result = f(1.5, 2.5)
print(result)
```
!!! Extensions & wrappers
* Keras is a wrapper library that hides Theano completely and provides a very simple API to work with to create deep learning models.
,,[[Deep Learning with Python - Jason Brownlee]] | [[25 July 2020]],,
!! Introduction to TensorFlow
[[TensorFlow]] is a Python library for fast numerical computing created and released by Google.
!!! Simple Example
Computation is described in terms of data flow and operations
* ''Nodes'': Nodes perform computation and have zero or more inputs and outputs. Data that moves between nodes are known as ''tensors'', which are multi-dimensional arrays of real values.
* ''Edges'': The graph defines the flow of data, branching, looping and updates to state. Special edges can be used to synchronize behavior within the graph, for example waiting for computation on a number of inputs to complete.
* ''Operation'': An operation is a named abstract computation which can take input attributes and produce output attributes. For example, you could define an add or multiply operation.
```python
# Example of TensorFlow library v0.10.0
import tensorflow as tf
# declare two symbolic floating-point scalars
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
# create a simple symbolic expression using the add function
add = tf.add(a, b)
# bind 1.5 to a , 2.5 to b , and evaluate c
sess = tf.Session()
binding = {a: 1.5, b: 2.5}
c = sess.run(add, feed_dict=binding)
print(c)
```
,,[[Deep Learning with Python - Jason Brownlee]] | [[25 July 2020]],,
!! Introduction to Keras
[[Keras]] [[Python]] library that provides a clean and convenient way to create a range of deep learning models on top of Theano or TensorFlow. More in [[Keras]] tiddler.
!!! Building [[Deep Learning]] Models with Keras
* ''The focus of Keras is the idea of a model''.
* The main type of model is a sequence of layers called a `Sequential` which is a linear stack of layers
* Construction of a model can be summarized as
*# ''Define your model''. Create a `Sequential` model and add configured layers.
*# ''Compile your model''. Specify loss function and optimizers and call the `compile()` function on the model.
*# ''Fit your model''. Train the model on a sample of data by calling the `fit()` function on the model.
*#''Make predictions''. Use the model to generate predictions on new data by calling functions such as `evaluate()` or `predict()` on the model.
,,[[Deep Learning with Python - Jason Brownlee]] | [[25 July 2020]],,
Skipped chapter (Only talking about getting access to GPU which can now be made available using [[Google Colaboratory]] or [[Kaggle]]
!!Project: Develop Large Models on GPUs Cheaply In the Cloud
In this project you will discover how you can get access to GPUs to speed up the training of your deep learning models by using the Amazon Web Service (AWS) infrastructure
,,[[Deep Learning with Python - Jason Brownlee]] | [[25 July 2020]],,
!! Crash Course In [[Multilayer Perceptron]]s
!!! Multilayer Perceptron
<<<
The field of artificial neural networks is often just called [[Neural Network]]s or Multilayer Perceptrons after perhaps the most useful type of neural network.
''Perceptron'' is a single neuron model that was a precursor to larger neural networks
''The power of neural networks come from their ability to learn the representation in your training data and how to best relate it to the output variable that you want to predict''.
The predictive capability of neural networks comes from the hierarchical or multilayered structure of the networks. The data structure can pick out (learn to represent) features at different scales or resolutions and combine them into higher-order features. For example from lines, to collections of lines to shapes.
<<<
!!! Neurons
<<<
The building block for neural networks are ''artificial neurons''.
<img src='https://missinglink.ai/wp-content/uploads/2018/11/activationfunction-1.png' width='700'>
<<<
!!! Neuron weights
* Weights on the inputs are very much like the coefficients used in a regression equation
* Each neuron also has a ''bias'' which can be thought of as an input that always has the value 1.0 and it too must be weighted
* Often initialized to small random values, such as values in the range 0 to 0.3
* ''Larger weights indicate increased complexity and fragility of the model. It is desirable to keep weights in the network small and regularization techniques can be used
''
!!! Activation Function
<<<
The weighted inputs are summed and passed through an activation function, sometimes called a ''transfer function''.
An activation function is a simple mapping of summed weighted input to the output of the neuron. It is ''called an activation function because it governs the threshold at which the neuron is activated ''and the strength of the output signal.
Traditionally nonlinear activation functions are used. This allows the network to combine the inputs in more complex ways and in turn provide a richer capability in the functions they can model.
<<<
!!! Network Topology
* A row of neurons is called a layer
* A network can have multiple layers
* The input layer is also called the bottom layer or visible layer because it is exposed to the inputs
* The middle layers are called hidden layers because they are not directly exposed to the inputs
* Output layer outputs a value or vector based on the format of the problem.
** [[Regression]] problem may not require any activation function
** [[Binary Classification]] would have a single output neuron with ''sigmoid'' activation function which will output a probability between 0 and 1
** [[Multiclass Classification]] would have multiple neurons, one for each class and will require a ''softmax'' activation function
<img src='https://raw.githubusercontent.com/ledell/sldm4-h2o/master/mlp_network.png' width = '600'>
!!! Data Preparation
* Data must be numerical
* One hot encode categorical variables
* Requires ''normalizing'' values (scaling between 0 and 1) or ''standardizing'' columns with mean `0` and std. dev of `1`.
!!! Stochastic Gradient Descent
<<<
One row of data is exposed as input. The network processes the input to produce an output - called ''forward pass''.
The output of the network is compared with expected output and error is calculated. The error is propagated back through the network one layer at a time - ''Back Propagation'' - and the weights are updated based on their contribution towards the error
The process is completed for one round of training data or also called ''one epoch''
Weights can be updated one data point at a time (called ''online learning'') which can result in fast but chaotic changes to the network or they can be updated on entire training data (called ''batch learning'') and is often more stable.
Due to computational efficiencies ''batch sizes'' - number of examples shown to network before an update is made - of tens or hundreds is used. The amount of weight update is controlled by ''learning rate'' parameter also called ''step size'' and controls the step or change made to the network weights for a given error. Often ''small learning rates are used'' such as 0.1 or 0.01 or smaller.
* ''Momentum'' is a term that incorporates the properties from the previous weight update to allow the weights to continue to change in the same direction even when there is less error being calculated.
* ''Learning Rate Decay'' is used to decrease the learning rate over epochs to ''allow the network to make large changes to the weights at the beginning and smaller fine tuning changes later in the training schedule''.
<<<
,,[[Deep Learning with Python - Jason Brownlee]] | [[25 July 2020]],,
!! Develop Your First Neural Network With Keras
[ext[Simple NN model using Keras|https://www.kaggle.com/sumitkant/simple-neural-network-with-keras/]] built on Pima Indians Diabetes Database hosted on [[Kaggle]]
!!! Recipe
# Load dataset in csv
# Separate `X` and `Y` values from the dataset
# Define `Sequential` model and add `Dense` layers
#* The first thing to get right is to ensure the input layer has the right number of inputs.
#* ''How do we know the number of layers to use and their types?'' This is a very hard question. There are heuristics that we can use and often the best network structure is found through a process of ''trial and error'' experimentation
#* [[ReLU]] - typically gives better performance
#* [[Sigmoid]] - for output layer to map values between 0 and 1
# Compile model by specifying `loss`, `optimizer` and `metrics`
# Fit using `fit()` method on `X` and `Y`
# Evaluate model using `model.evaluate()` by passing `X` and `Y`.
```python
# Create your first MLP in Keras
from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=(8), activation= 'relu'))
model.add(Dense(8, activation= 'relu' ))
model.add(Dense(1, activation= 'sigmoid' ))
# Compile model
model.compile(loss = 'binary_crossentropy' , optimizer = 'adam' , metrics = ['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10)
# evaluate the model
scores = model.evaluate(X, Y)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
```
,,[[Deep Learning with Python - Jason Brownlee]] | [[26 July 2020]],,
!! Evaluate The Performance of Deep Learning Models
How to evaluate a Keras model using
* an automatic verification dataset
* manual verification dataset
* [[K-Fold Cross Validation]]
There are a myriad of decisions you must make when designing and configuring your deep learning models. This includes high-level decisions like the number, size and type of layers in your network. It also includes the lower level decisions like the choice of loss function, activation functions, optimization procedure and number of epochs.
!!! 1. Use a Automatic Verification Dataset
Using `validation_split` argument on the `fit()` function to reserve a percentage of the size of your training dataset for validation. A reasonable value might be 0.2 or 0.33 for 20% or 33% of your training data held back for validation.
```python
model.fit(x_train, y_train, batch_size=64, validation_split=0.2, epochs=1)
```
!!! 2. Use a Manual Verification Dataset
Use the handy train test split() function from the Python scikit-learn
machine learning library to separate our data into a training and test dataset
```python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)
model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=150, batch_size=10)
```
!!! 3. Manual k-Fold Cross Validation
The gold standard for machine learning model evaluation is k-fold cross validation. It provides a robust estimate of the performance of a model on unseen data. It does this by splitting the training dataset into k subsets and takes turns training models on all subsets except one which is held out, and evaluating model performance on the held out validation dataset. The process is repeated until all subsets are given an opportunity to be the held out validation set. The performance measure is then averaged across all models that are created.
<<<
!!! Recipe
We use the handy `StratifiedKFold` class from the scikit-learn Python
machine learning library to split up the training dataset into 10 folds.
```python
# MLP for Pima Indians Dataset with 10-fold cross validation
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import StratifiedKFold
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# define 10-fold cross validation test harness
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
cvscores = []
for train, test in kfold.split(X, Y):
# create model
model = Sequential()
model.add(Dense(12, input_dim=(8), activation= 'relu' ))
model.add(Dense(8, activation= 'relu' ))
model.add(Dense(1, activation= 'sigmoid' ))
# Compile model
model.compile(loss= 'binary_crossentropy' , optimizer= 'adam' , metrics=['accuracy'])
# Fit the model
model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X[test], Y[test], verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
cvscores.append(scores[1] * 100)
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))
```
<<<
,,[[Deep Learning with Python - Jason Brownlee]] | [[26 July 2020]],,
!! Use Keras Models With Scikit-Learn For General Machine Learning
Learning to use `sklearn` package for standard [[Machine Learning]] library for [[Deep Learning]] models.
[ext[This notebook|https://www.kaggle.com/sumitkant/gridsearch-k-fold-keras-models-using-sklearn]] on [[Kaggle]] describes in small steps to configure `sklearn` library to do `GridSearchCV` and K-Fold cross validation on [ext[Pima Indians Diabetes Database|https://www.kaggle.com/uciml/pima-indians-diabetes-database]].
,,[[Deep Learning with Python - Jason Brownlee]] | [[26 July 2020]],,
!! Project: Multiclass Classification Of Flower Species
Prepared a [ext[notebook|https://www.kaggle.com/sumitkant/multiclass-classification-with-keras-tensorflow]] in [[Kaggle]] for this project.
A general observation while working with tensoflow and deep learning objects using this dataset resulted in results that varied wildely. Need to read [ext[this article|https://machinelearningmastery.com/reproducible-results-neural-networks-keras/]] on [[Machine Learning Mastery]] that addresses how randomness in introduced in [[Deep Learning]] models and how can we get reproducible results.
[[Deep Learning with Python - Jason Brownlee]]
!! Project: Binary Classification Of Sonar Returns
* Using `StandardScaler` to scale the input variables of the dataset to standard normal distribution. This is an effective data preparation scheme for tabular data while building NN models.
* Using pipeline functions to use sklearn’s `StandardizedScaler` module on the dataset while using cross-validation. The standard normal distribution will be learned on the training indices of the fold and applied on the validation fold
* ''Evaluate a small NN'' - The dataset has 60 input dimesnsions. Some dimensions may be more important than the others. The number of hidden layers can be reduced to 30 instead of 60. This will put pressure on the network to extract the most important structure during training.
<<<
```python
model = Sequential()
model.add(Dense(30, input_dim = (60), activataion = ‘relu’)
model.add(Dense(1, activation = ‘sigmoid’))
```
<<<
Published [ext[this notebook|https://www.kaggle.com/sumitkant/mines-vs-rocks-using-keras-tensorflow]] on [[Kaggle]]
,,[[Deep Learning with Python - Jason Brownlee]] | [[02 Aug 2020]],,
!! Save Your Models For Later With Serialization
Keras separates the concerns of ''saving your model architecture'' and ''saving your model weights''. Model weights are saved to HDF5 format. This is a grid format that is ideal for storing multi-dimensional arrays of numbers. The model structure can be described and saved (and
loaded) using two different formats: ''JSON'' and ''YAML''.
!!! 1. Saving Model to JSON
```python
from keras.models import model_from_json
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
```
!!! 2. Loading saved `json` model
It is important to compile the loaded model before it is used. This is so that predictions made using the model can use the appropriate efficient computation from the Keras backend
```python
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("model.h5")
print("Loaded model from disk")
# evaluate loaded model on test data
loaded_model.compile(loss= 'binary_crossentropy' , optimizer= 'rmsprop', metrics=['accuracy'])
score = loaded_model.evaluate(X, Y, verbose=0)
```
!!! 3. Saving NN model to YAML
```python
from keras.models import model_from_yaml
# serialize model to YAML
model_yaml = model.to_yaml()
with open("model.yaml", "w") as yaml_file:
yaml_file.write(model_yaml)
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
```
!!! 4. Load YAML and Create Model
```python
yaml_file = open('model.yaml', 'r')
loaded_model_yaml = yaml_file.read()
yaml_file.close()
loaded_model = model_from_yaml(loaded_model_yaml)
# load weights into new model
loaded_model.load_weights("model.h5")
print("Loaded model from disk")
# compile & evaluate loaded model
loaded_model.compile(loss= 'binary_crossentropy' , optimizer= 'rmsprop', metrics=['accuracy'])
score = loaded_model.evaluate(X, Y, verbose=0)
```
,,[[Deep Learning with Python - Jason Brownlee]],,
!! Keep The Best Models During Training With Checkpoints
''Application checkpointing is a fault tolerance technique for long running processes''. It is an approach where a snapshot of the state of the system is taken in case of system failure. If there is a problem, not all is lost. The checkpoint may be used directly, or used as the starting point for a new run. When training deep learning models, the ''checkpoint captures the weights of the model''.
The Keras library provides a checkpointing capability by a callback API. The `ModelCheckpoint` callback class allows you to define ''where to checkpoint the model weights'', how the file should be named and under what circumstances to make a checkpoint of the model. You can specify whether to look for an improvement in maximizing or minimizing the score. Finally, the filename that you use to store the weights can include variables like the
epoch number or metric. The `ModelCheckpoint` instance can then be passed to the training process when calling the `fit()` function on the model.
!!! 1. Checkpoint Neural Network Model Improvements
Here, checkpointing is setup to save the network weights only when there is an improvement in classification accuracy on the validation dataset.
```python
from keras.callbacks import ModelCheckpoint
filepath = "weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor = 'val_acc' , verbose = 1, save_best_only = True, mode= 'max')
callbacks_list = [checkpoint]
model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, callbacks = callbacks_list, verbose = 0)
```
This is a very simple checkpointing strategy. It may create a lot of unnecessary checkpoint files if the validation accuracy moves up and down over training epochs.
!!! 2. Checkpoint Best Neural Network Model Only
A simpler checkpoint strategy is to save the model weights to the same file, if and only if the validation accuracy improves. Changing the filename to a fixed name solves this issue, rest of the code remains same
```python
filepath="weights.best.hdf5"
```
<hr>
,,[[Deep Learning with Python - Jason Brownlee]] | [[02 Aug 2020]],,
!! Understand Model Behavior During Training By Plotting History
Keras provides the capability to register callbacks when training a deep learning model. One of the default callbacks that is registered when training all deep learning models is the `History` callback. It records training metrics for each epoch. The `history` object is returned from calls to the `fit()` function used to train the model
```python
# list all data in history
print(history.history.keys())
```
Following information can be inferred from the history
* It’s speed of convergence over epochs (slope).
* Whether the model may have already converged (plateau of the line).
* Whether the model may be over-learning the training data (inflection for validation line).
!!! 1. Plotting Train & Validation Accuracy
```python
history = model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, verbose=0)
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train','test'], loc='upper left')
plt.show()
```
<img src = 'https://3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com/wp-content/uploads/2016/05/history_training_dataset.png' width = '700'>
!!! 2. Plotting Train & Validation Loss
Changing the dictionary items in history in the plot function to `'loss'` & `'val_loss'` does the job
<hr>
,,[[Deep Learning with Python - Jason Brownlee]] | [[02 Aug 2020]],,
!! Reduce Overfitting With Dropout Regularization
[[Dropout Regularization For Neural Networks]]
<hr>
,,[[Deep Learning with Python - Jason Brownlee]] | [[02 Aug 2020]],,
[[Deep Learning with Python - Jason Brownlee]]
!! Crash Course In [[Convolutional Neural Network]]s
CNNs, also called ConvNet are neural networks that preserve the spatial structure of the problem and were developed for object recognition tasks. They learn the internal feature representations by small squares of input data.
!!! Benefits of CNNs
# They use fewer parameters (weights) to learn than a fully connected network.
# They are designed to be invariant to object position and distortion in the scene.
# They automatically learn and generalize features from the input domain.
!!! Building Blocks of CNNs
* ''Convolution Layers''
** ''Filters'' - The filters are essentially the neurons of the layer. They have both weighted inputs and generate an output value like a neuron
** ''Feature Maps'' - The feature map is the output of one filter applied to the previous layer. The distance that filter is moved across the input from the previous layer each activation is referred to as the ''stride''.
* ''Pooling Layers''
:The pooling layers down-sample the previous layers feature map. Pooling may be consider a technique to compress or generalize feature representations and generally reduce the overfitting of the training data by the model.
* ''Fully Connected Layers''
:used to create final nonlinear combinations of features and for making predictions by the network.
!!! Best Practices
* ''Receptive Field Size'': The patch should be as small as possible, but large enough to see features in the input data. It is common to use 3 x 3 on small images and 5 x 5 or 7 x 7 and more on larger image sizes.
* ''Stride Width'': Use the default stride of 1. This could be increased to 2 or larger for larger images.
* ''Number of Filters'': Generally fewer filters are used at the input layer and increasingly more filters used at deeper layers.
* ''Padding'': Set to zero and called zero padding when reading non-input data. This is useful when you cannot or do not want to standardize input image sizes or when you want to use receptive field and stride sizes that do not neatly divide up the input image size.
* ''Pooling'': Pooling is a destructive or generalization process to reduce overfitting. Receptive field size is almost always set to 2 x 2 with a stride of 2 to discard 75% of the activations from the output of the previous layer.
* ''Data Preparation'': Consider standardizing input data, both the dimensions of the images and pixel values.
* ''Pattern Architecture'': It is common to pattern the layers in your network architecture. This might be one, two or some number of convolutional layers followed by a pooling layer. This structure can then be repeated one or more times.
* ''Dropout'': CNNs have a habit of overfitting, even with pooling layers. Dropout should be used such as between fully connected layers and perhaps after pooling layers.
,,[[Chapter - 15 - Deep Learning with Python]] | [[07 Aug 2020]],,
!! Project: Handwritten Digit Recognition
The hello world of object recognition for machine learning and deep learning is the MNIST dataset for handwritten digit recognition.
!!! Dataset
The MNIST problem is a dataset developed by Yann LeCun, Corinna Cortes and Christopher Burges for evaluating machine learning models on the handwritten digit classification problem.
The dataset was constructed from a number of scanned document datasets available from the National Institute of Standards and Technology (NIST). This is where the name for the dataset comes from, as the Modified NIST or MNIST dataset.
plt.title('Training & Validation loss')
plt.xlabel('epochs')
,,[[Deep Learning with Python - Jason Brownlee]] | [[07 Aug 2020]],,
! Principles of Graphical Excellence
* Graphical Excellence is well designed presentation of interesting data - a matter of ''substance'', of ''statistics'' and of ''design''
* Graphical Excellence comprises of complex ideas communicated with ''clarity'', ''precision'', and ''efficiency''
* Graphical Excellence is that which gives the viewer greatest number of ideas in the shortest time with the least ink in smallest space
* Graphical Excellence is nearly always multivariate
* Graphical Excellence requires telling truth about the data
! Graphical Excellence
* Excellence in statistical graphics consists of complex ideas communicated with clarity, precision, and efficiency.
* Graphical displays should
** Induce viewer to think about the substance rather than the methodology
** Serve clear purpose: description, exploration, tabulation, or decoration
* [[Anscombe's Quartet]] - four different datasets with same mean and std. dev can be explained by same linear model
!! Data Maps
* Geographical maps with data. Show very large number in multiple ways within a concise space
* Flaw - May wrongly equate the importance of geographic location rather than with the number of people living.
* History - Data maps were not draw until 17th century that a combination of cartographic and statistical skill was required to construct together ''5000 years after the first georgraphical maps were drawn on clay tablets''
* One of the first data maps was ''Edmond Halley's 1686'' chart showing trade winds and monsoons on world map.
:<img src='https://blogs.royalsociety.org/publishing/files/Halley.jpg' width = '1200'>
* Another famous [[Dot Map]]
!! [[Time Series Graphs]]
* The natural ordering of time scale gives this design a strength and efficiency of interpretation found in no other graphic arrangement
* Best of displaying big datasets with real variability
<<<
Why waste the power of data graphics on simple linear changes. Instead, graphics should be reserved for richer, more complex, more difficult statistical material
<<<
* [[Marey's Graphical Train Schedule for Paris to Lyon in 1880s]]
* [[First known time series]] using economic data was developed by [[William Playfair]]
* [[First known bar chart]] was invented by [[William Playfair]], because year to year data was missing and he needed to a design to portray the one year data that was available.
* The problem with time series is that the simple passage of time is not a good explanatory variable: ''descriptive chronology is not causal explanation''
* Time series plots can be moved toward causal explanation by smuggling additional variables into graphic design.
** Decomposition of economic data in time series with seasonal and intra day fluctuations explained within the same graph
** Before after time series
!! Narrative Graphics of Space & Time
* ''An effective device for enhancing the explanatory power of time-series displays is to add spatial dimensions to graphic design''
* Occasionally graphics are belligerently multivariate, advertising the technique rather than the data, but not these three
** [[Napoleon's Army by Charles Joseph Minard]]
** Drawn by computer, this graphic displays three levels of air pollutants located over a 2D surface at four times during the day for six counties in California. There are 3 pollutants at 4 time periods having 12 slices. Once one slice is understood, the data available in all other slices is immidiately accessible. ''Small multiples are economical''.
** [[Life Cycle of Japanese Beetle]]
!! Relational Graphics
In //The Statistical Breviary//, [[William Playfair]]'s most theoretical book about graphics, Playfair broke free of analogies and drew graphics as designs themselves. Following chart below uses space to display quantity
* Circle represents the area of each country
* the left line - population in millions
* the right line - revenue (taxes) collected in millions of pounds
* The slope is uninformative due to the size of pie chart, although the sign of slope is sensible - displaying excessive taxation
:<img src = 'https://blogs.loc.gov/inside_adams/files/2018/06/Playfair-2.jpg' width = '1000'>
While Playfair lacked mathematical skills, J. H. Lambert could think of abstract problems and he designed a graphic in 1765, 35 years before the //The Statistical Breviary//
* Lambert drew a graphical derivation of evaporation rate of water as a function of temperature
** DEF shows decreasing height of water in capillary tube as a function of time
** ABC the temperature
** Slope DEG, yields rate of evaporation
:<img src = 'https://lh3.googleusercontent.com/proxy/arMHhhnfFV9dpOw7MxlkCiJ39F8oEund6f5yrfA3OXHL0MvvDOIV_6Lt378O4vAciDTyhLFunDDXpYuQL6wfrn6iaq9VAfoTF1vtHSq_puGk7xfzx7c5RZT9yoF4_Y3HDpk6' width = '600'>
[[The Visual Display of Quantitative Information]]
* An [[Investigative Reporter]] for [[New York Times]]
* Graduate of [[Harvard Business School]] and [[Yale University]]
https://chat.openai.com/chat
[[AI Businesses]]
!! 1. Introduction
* 2% risk per trade recommendation - without exceptions. Don't trade for the money or quick paycheck - wrong mentatlity
!! 2. Impulsive & Corrective Moves
* ''About 80% of time'' an impulsive move will be followed by a corrective move followed by another impulsive move in the same direction. This pattern is over when an impulsive move follows in the opposite direction
* Institutional investors are heavily involved in market (order flow is skewed)
* Two choices for trading an impulsive move
** Trade with it
** Get out of the way
''Characteristics of Impulsive Moves''
# Tend to have some of the largest candles in the entire set
# The bars are of mostly one color >= 80%
# A lot of the closes would be towards the highs and lows
''Characteristics of Corrective Moves''
Redistribution of price action and order flow
# Mix of candle colors (50-50, 60-40) - buyers and sellers are not convinced over an extended period of time. Tug of war -> Less commitment -> greater probability of being stopped out when the market moves against you
# Closes are towards the middle of candles - larger wicks
# They tend to be the smaller candles in the entire set
!! 3. [[Inside Bar Strategy]]
When a new bar forms completely within the shadow of preceding bar. If the next bar breaches the inside bar then some percentage points can be accumulated with a target. The target will be determined by the average rally that is achieved post breach of high (when A bar is up) and breach of low (when A bar is down). This strategy points to trend reversal. Occurs very frequently.
* Statistics on how many times the pattern presents itself
* Average points does the break
* Up-break-up - has to happen above 20EMA else break up not valid; vice-versa for down-break-down
!! 4. [[Shaved Bar Strategy]]
!! Summary of Numba
* [[Numba]] makes Python code fast. It is numerical computing library for faster computation
* Uses Just in Time compilation to convert python code to machine code
* Does not understand [[Pandas]] dataframes
!! references
<iframe width="560" height="315" src="https://www.youtube.com/embed/UaFSnaYh2b8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!! Collection of Projects with Clean [[Data Visualization]] from [[Kaggle]]
* [[Exploratory Data Analysis]] using [[Pandas]], [[Matplotlib]] - [ext[link|https://www.kaggle.com/dwin183287/tps-mar-2021-eda]]
* [[SHAP Values]], [[Waffle Charts]] - [ext[WiDS Datathon 2021 RAPIDS+XGB+LightGBM| https://www.kaggle.com/ruchi798/wids-datathon-2021-rapids-xgb-lightgbm]]
* Using seaborn and matplotlib - https://www.kaggle.com/dwin183287/tps-july-2021-eda
* Beautiful grid layouts (covers most complex visualization in a simple manner) - https://www.kaggle.com/dwin183287/kagglers-seen-by-continents
* https://cleanup.pictures/
* Retouch Photos
[[AI Businesses]] | [[AI Art]]
National Security Clearing Corporation Ltd. (NSCCL) and Indian Clearing Corporation Limited (ICCL) are wholly owned subsidiaries of [[NSE]] & [[BSE]] respectively.
Their job is to ''ensure guaranteed settlement of your transactions''
* Identify the buyer and the seller
* Ensure no defaults
* https://clipdrop.co/
* Retouch an existing photo
[[AI Businesses]] | [[AI Art]]
* Market: Food Services
* Market Size: 110B
*
* Industry Growth -
*
An external [[Microphone]] digitizes a sound signal and feeds it into the [[Auditory Nerve]]
,,[[01 April 2021]],,
!! Install
```bash
pip install -q ngboost
```
!! Training
```python
from ngboost import NGBRegressor
ngb = NGBRegressor(
natural_gradient=True,
n_estimators=500,
learning_rate=0.01,
minibatch_frac=1.0,
col_sample=1.0,
verbose=True,
verbose_eval=100,
tol=0.0001,
random_state=None,
validation_fraction=0.1,
early_stopping_rounds=None
).fit(X_train, Y_train)
Y_preds = ngb.predict(X_test)
Y_dists = ngb.pred_dist(X_test)
```
!! Get Prediction Uncertainity
```python
print(f'Mean of the predicted distribution: {Y_dists.params["loc"][:5]}')
print(f'Std Dev of predicted distribution: {Y_dists.params["scale"][:5]}')
```
[[NGBoost]] | [[11 February 2023]]
!! Introduction
<<<
Risk Comes from not knowing what to you are doing
<<< [[Warren Buffet]]
!!! Note on [[ULIP]]s
* ''push'' products
* high brokerage commissions to be sold; high upfront comission
* Rs 1.5Lakh crore has been lost on these products because of lapsing, because investors are not informed about compulsory investment in subsequent years
''Moral: Deligent investor seeks to avoid such traps by reading on his own''
!!! Indian Context of [[Stock Market]]s
* Global literature not applicable to Indian Context
* 88% of Indian Investor's wealth in gold and real estate (Aug'2017)
* Very few great companies that sustain leadership over long periods of time
* ''Average probability of sector leader remaining sector leader is 15%. Rest 85% slide towards merdiocrity''
* [[Nifty]] churns by every decade by 50%
<<<
Stock's appreciate when no least expects them to. And they do not appreciate evenly
<<<
!! Basic Investment Mistakes
* ''No clear objective/plan''
** One of the biggest mistakes
** Investing is usually based on rumours/tips and random
* ''[[Trading]] too much, too often''
** Repeated trading and modification in investments usually lead to lower returns and higher transaction costs (source of income for brokers)
* ''Lack of [[Diversification]]''
** Different assets carry different kinds of risk and return potential.
** Adequate diversification $$ \rightarrow $$ long term wealth
** Excessive diversification and exposure to too many stocks can also negatively impact the returns of the portfolio
* ''Higher commission and fees''
** Money paid as fees and brokerage also compounds every year with [[Investment Return]]s over time
** Important to choose funds with reasonable [[Expense Ratio]]s
* ''Chasing short term returns''
** High yielding asset is a very tempting proposition.
** Past returns not measure of future performance
* ''Timing the market''
** Market movements non-linear and volatile
** ''belief that one can catch top and bottom is a myth''
* ''Ignoring [[Inflation]] and taxes''
** Absolute returns eyed instead of real returns
** Actual returns computed by adjusting for inflation and taxes
!! Key takeaways
* Should first have objectives in sight and bake them into a financial plan
* Not adhere to age-old wisdom of investing heavily in FD, real-estate and gold
* Be patient and systematic with equity investments
<<<
For indeed, the investor's chief problem - and even his worst enemy - is likely to be himself
<<< [[Benjamin Graham]], [[The Intelligent Investor]]
Even Sir [[Isaac Newton]] was swayed by emotions. He invested in South Sea Company, the hottest stock in [[England]]. He dumped his shares at 7,000 pounds. But months later in enthu, he bought stock at a higher price and lost 20,000 pounds (more than $3 million on 2002's worth)
''Successful equity [[Investing]] hinges on two simple questions''
* Which stock should I buy?
* For how long should I holds the [[Stock]]s?
Indian investors are surrounded by bad advisors and imbibe incorrect investment thories - blur the demarcation between punting and investing. ''[[Punters]]'' (who incorrectly think and call themselves investors) buy shares in the company because a friend of a friend says that they have heard the stock price could go up.
''Which stocks to buy?''
[[Warren Buffet]] in a letter to shareohlders, shares kind of companies he likes to invest in
* A business we understand
* Favorable long-term [[Economics]]
* Able and trustworthy management
* Sensible price tag
A truly great business must have an enduring moat that protects excellent returns on invested capital
''For how long to hold the stocks''
* Warrent Buffet's in a letter to shareholders stated, 'When we own portions of outstanding businesses with outstanding management, the holding period is ''forever'''
!! Saurabh Mukherjea's view
In the Indian context
* have to trust the people who are running the company
* Good management teams create optionality -> smart managers create a lot of wealth
* Unless a stock reaches absurd valuation, or something critical has changed in company's growth outlook - prefer not to sell stocks
''One has to invest in high-quality companies and then sit tight for long(often very long) without loosing sleep about where the share price is going''
!! Coffee Can - The Term
* Coffee can harks on the back to the Wild West, when [[American]]s before the widespread advent of banks, saved their valuables in a coffee can and kept it under a mattress
!! [[Coffee Can Portfolio]]
Simple investment filters
* Market Cap > 100 Cr INR
* Revenue growth > 10% YOY
* Return on Capital Employed [[ROCE]] > 15% YOY
''A great company'' is the one which has the ability to grow whilst sustaining its moats over long periods of time.
!! Three categories of business
* ''High earnings & low [[CAPEX]]'' - eg. HUL usually becomes cash machines
** High cash conversion - low inventories
** Product sold for cash -> less accounts receivables
* ''Decent CAPEX; Decent [[ROCE]]'' - eg. HDFC Bank
** Difficult to find
** decent investment options as long as they enjoy durable competitive advantage
* ''Huge CAPEX; low ROCE''
** [[Telecom]] sector
** Warren buffet says - worst sort of businesses
!! Page Industries: A case study of greatness
* ROCE: 50% (Falls in Category 2)
* Consistency of product quality and design over a period of time across geographies is critical for a brand to avoid losing a satisfied consumer
* ''Sensible Capital Allocation'': CAPEX decisions based on assessment of business growth and expansion. This includes understanding subjects like market penetration, leveraging new technologies, investment in software, backward integration for cost advantages.
* manufacturing prowess - Page's biggest competitive advantage. Inner-ware - a highly labor-intensive industry width limited scope for automation.
* Strong network of exclusive distributors - well incentivized to create push based demand
* Strict pricing discipline
!! Case against churn in CCP
Churn against the basic philosophy of long term investing
* ''Higher probability of profits over long periods of time.''
:<img src="https://www.fisdom.com/wp-content/uploads/2020/04/Rahul-dravid-1.png" width=700 />
* ''Power of compounding:''
:Positive contribution of winners disproportionately outweighs the negative contribution of losers to eventually help the portfolio compound handsomely
* ''Neutralizing the negatives of 'noise':''
:Share price over extended periods of times may not generate impressive returns. Trying to time exit/entry, you run the risk of noise rather than fundamental driving investment decisions
* ''transaction costs:''
: Assuming 50% churn rate per year and and 100bps impact and brokerage cost - around 9% of the final corpus is lost to transaction cost
!! Impact of Valuations on portfolio returns
* Starting period valuation not correlated to long term returns - Specific to India
* ''Value Premium:'' outperformance of value stocks over growth stocks. this means low P/E multiple stock achieves higher risk-adjusted return compared to high P/E multiple stock.
* low P/E based investing approach $$ \rightarrow $$ does not work for India $$ \rightarrow $$ no incremental returns $$ \rightarrow $$ because financials rigged $$ \rightarrow $$ stick to high-quality franchises for long haul.
! Expenses Matter
!! Compounding of expenses
<<<
Apart from death and taxes, add expenses as the only certainties in life
<style type="text/css">
table.tableizer-table {
font-size: 12px;
border: 1px solid #CCC;
font-family: Arial, Helvetica, sans-serif;
}
.tableizer-table td {
padding: 4px;
margin: 3px;
border: 1px solid #CCC;
}
.tableizer-table th {
background-color: #104E8B;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Capital</th><th>CAGR</th><th>Tenure</th><th>Expense Ratio</th><th>Ending Corpus</th></tr></thead><tbody>
<tr><td>1 Lakh</td><td>15%</td><td>40 Year</td><td>2.50%</td><td>1.1 Cr</td></tr>
<tr><td>1 Lakh</td><td>15%</td><td>40 Year</td><td>0.10%</td><td>2.58 Cr</td></tr>
</tbody></table>
<img src='https://miro.medium.com/max/1142/1*NSBl4rmXuR-ziL6tzlXbcA.png' width=500>
<<<
In India, over the past decade it has become much harder to generate outperformance for mutual fund managers. Brought modern tech - fund houses use algorithms to run funds at low costs
Transformation in Industry
# The [[Alpha Squeeze]] in actively managed funds
# The introduction of inexpensive fund options and [[Direct Scheme]]s in [[Mutual Fund]]s
# The advisory-led offering vs the distribution-led offering
!! Evolution of [[Mutual Fund]]s
''Mutual Funds'' are believed to be originated in [[Netherlands]]. IN 1774 a Dutch Merchant named Adriaan van Ketwich pooled money from a number of subscribers to form an investment pool and named it Eendragt Maakt Magt, which means //unity creates strength//.
Ketwich's model gained popularity in 1800s and reached America. Early mutual funds were mainly close-ended and issued fixed number of securities. The first modern day mutual fund , Massachusetts Investors Trust, was created in the United States in 1924.
Mutual fund industry in India was born in 1963 when the [[Unit Trust India (UTI)]] was formed through an Act of [[Parliament]].
<img src='https://www.bemoneyaware.com/blog/wp-content/uploads/2017/03/History-of-mutual-funds-india.jpg'>
!! Early years of Mutual Funds
* [[Entry Load]]
* [[Exit Load]]
* [[Recurring Expenses]] - include expenses like fund management fee, operational costs like broking, custody, fund accounting, compliance and marketing fees
Part of the reason why expenses have remained high in India is that - it has been easy for the funds to get away with high expenses. Funds use to charge 2.25% as upfront expense.
Apart from good fund, it is critical to reach out and push people to invest - job of distributors
Overtime, a second category of equity fuds with lower expenses have emerged. These funds do not need a fund manager and this do not incur fancy fund management charges. These funds are called [[Passive Funds]]
!! Active vs Passive Funds
* Outperformance, which is also called ''alpha'', is the incremental performance that the fund manager generates vis-a-vis benchmark ([[NIFTY]] or [[Sensex]])
* [[Exchange Traded Funds]] (ETFs) replicate the benchmark.
!! Perfect Market
* Perfect market assumes that all information is in the stock price
* No market can be absolutely perfect or imperfect. Developed markets in [[US]] and [[Europe]] are nearly there after 200 years. Actively managed funds thus have no edge over ETFs
* Indian markets have information asymmetry but it is reducing. In 1990s and early 2000s, money was being made by rigging up prices in cahoots with promoters. Shady practices are one of the reasons why stock market investing never took off among retail investors.
!! [[Alpha Squeeze]] in [[Mutual Fund]]s
* Actively managed large-cap equity funds in India have actually underperformed the index between 2010 and 2017. So there is actually a negative alpha!
[[11 April 2021]]
!! Characteristics of Coffee Can portfolio
* Obsessive focus on the core franchise - less distracted on short-term gambles
* Relentless deepening of competitive moats
* Sensible capital allocation
!! Simple Investment Filters
# ''Market Cap > 100 Crores''
# ''Revenue growth YOY > 10% consistently over past decade''
#* India's nominal GDP growth rate (not adjusted for inflation) was 13.8% in the past decade (as of 2018).
#* Only 9 out of 1300 firms could beat 13.8% YOY - reduced the metric to modest 10%
#* For Banks, loan growth of > 15% is an indication of bank's ability to lend over business cycle
# ''ROCE (pre-tax) > 15% consistently over past decade''
#* $$ROCE = \dfrac{EBIT}{Debt + Equity}$$
#* ROCE of 15% is chosen because this is the bare minimum required to beat the cost of capital (COC)
#* Risk free rate of 8% and equity risk premium of 6.5% to 7%
#** Equity Risk premium = 4% (US long term equity premium) + 2.5% (India's Credit Rating - BBB)
#** Higher credit rating $$ \rightarrow $$ greater economic stability
#* For Banks, ''ROE'' (profit earned after taxes as a % of shareholders' equity) is preferred over ''ROA'' Return on Assets (gives sense of how efficient the management was in using assets and generating earnings)
!! Returns
* Median portfolio return (compounded and Annualized) ~ 24-25% PA regardless of holding period has been short as 3 years or as long as 10 years
* Coffee Can portfolio offers more than a 95% probability of generating ''positive return ''as long as investors hold the portfolio for at least 3 years. If held for atleast 5 years, there is more than 95% probability of ''generating a return more than 9%''
* 26 % CAGR = 10x in 10 years, 100 x in 20 years and 1000 times in 30 years
!! Why does it perform so well?
* Greatness which CCP seeks is not a short-term phenomenon.
* Great companies do not get disrupted by evolution of customer's preferences
* Management have better strategies than their competitors. ''Conservatism != Complacency''
!! Why Revenue growth and ROCE as financial metrics to greatness?
* Buying a low quality company with 6% growth rate at a lower price << buying a high quality company with 18% growth at higher price
* Earnings $$ \rightarrow $$ biggest driver of stock market returns in long run
* Earnings growth should be an outcome of
** Growth in capital employed in business
** Ability to generate ROCE
!! Themes in CCP
* ''More B2C businesses than B2B in portfolio''
** Coffee can attracts businesses with smaller ticket size and repeat purchase of products and services
** portfolio construct chasing consistency of performance over long periods is likely to end up focusing more on B2C than B2B
** Autos, Home-building materials, pharma, IT
* ''Structural rather than cyclical:''
* ''Avoiding companies that borrow lots of money to grow:''
** because of illiquidity of asset base reduces the flexibility required to evolve the company over longer periods of time
** management teams of leveraged companies gets diluted as large part of bandwidth utilized in trying to service or refinance vast amounts of debt sitting on balance sheet
* ''Prefer companies with intangible strategic assets:''
** Distribution, pricing power, supply chain, raw material procurement, product development, Intellectual property
** For most companies $$ \rightarrow $$ strategic assets tangible. Eg. one good CEO, access to natural resource, surplus capital
!! References
* https://scikit-learn.org/stable/modules/generated/sklearn.metrics.cohen_kappa_score.html
Author of books
* [[Storytelling with Data]]
* [[Storytelling with Data - Let's Practice!]]
Collinearity, in statistics, correlation between predictor variables (or independent variables), such that they express a linear relationship in a [[Regression]] model.
,,[[06 July 2020]],,
!!Ideas
* Build a binary classification problem by merging two datasets and build many models. Measure AUC - higher means different. Compare variable importance's leading to the differences in data - [ext[Using many models to compare datasets|https://cran.r-project.org/web/packages/datarobot/vignettes/ComparingSubsets.html]]
* Plot distribution of all variables across two datasets in one single chart using - [[split violin plot|https://seaborn.pydata.org/generated/seaborn.violinplot.html]]
* [[Andrew's Curves]]
* [[Parallel Coordinates]]
* [[One way ANOVA and Tukey's Test|https://manchev.org/2015/07/01/using-one-way-anova-and-tukeys-test-to-compare-data-sets/]]
* [[KS Statistic|https://towardsdatascience.com/how-to-compare-two-distributions-in-practice-8c676904a285]]
* [[Boosting]] methods still relevant for medium sized datasets despite rise of [[Neural Network]]s
<embed src='https://publications.waset.org/10009954/pdf' width=1000 height=400>
```python
from pyspark.sql.functions import array_join, collect_list
friends = spark.createDataFrame(
[
('jacques', 'nicolas'),
('jacques', 'georges'),
('jacques', 'francois'),
('bob', 'amelie'),
('bob', 'zoe'),
],
schema=['username', 'friend'],
)
(
friends
.orderBy('friend', ascending=False)
.groupBy('username')
.agg(
array_join(
collect_list('friend'),
delimiter=', ',
).alias('friends')
)
.show(truncate=False)
)
```
!! References
* [ext[Spark SQL replacement for MySQL's GROUP_CONCAT aggregate function|https://stackoverflow.com/questions/31640729/spark-sql-replacement-for-mysqls-group-concat-aggregate-function|]] on [[Stackoverflow]]
The performance of the model deployed in production slowly degrades over time due to ''concept drift''. concept drift causes data points that were once considered an example of one concept to be seen as another concept entirely over time
* Monitor model performance overtime
* Check input and output distributions
** If input distributions change - then there is drift due to data
** if output scores changes - which features causing the models scores to change
* Retrain regularly with new set of data
!! references
* [[Why Do Machine Learning Models Die In Silence?|https://www.kdnuggets.com/2022/01/machine-learning-models-die-silence.html]] in [[KD Nuggets]]
Creating virtual environments in conda is super simple.
* Creating an environment - `conda create --no-default-packages python=3.6 -n nameofenv`
* Activate environment - `conda activate nameofenv`
* Deactivate environment -`conda deactivate`
''Note'': By default, environments are installed into the `envs` directory in your conda directory
[ext[Anaconda Documentation for Managing Environments |https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html]]
!! [[Google's AI Principles|https://ai.google/principles/]]
# Building fair, ethical, and responsible AI with the Responsible AI Toolkit
# Avoid creating or reinforcing unfair bias
# Be built and tested for safety
# Be accountable to people
# Incorporate privacy design principles
# Uphold high standards of scientific excellence
# Be made available for uses that accord with these principles
!! [[Responsible AI Toolkit|https://www.tensorflow.org/responsible_ai]]
!!! Questions to ask
<img src='https://lh3.googleusercontent.com/OYvuMOe-bhdLmPKg5D6K-FHPSowDNfOXeEw567HQ74abexWOcLiIDdKISnrCzSblsXb620xf9lG2XF-tvEskCoXj2Ej_sj5h8mP7oRkhav8fPQ0DsejaaEgz2f_rRLCABuulbmduz6z-sWKAtfgoWRA52fPEq4A0RvKDKpYnGAkQyME4C9GRRFl8JII0BVvDtUOA-AO1HhOeR6fp6BDYJkRaCzPmU5otgBes_7QVSUL9a4NcsvghG8GGjE87MD_En7xwuLNQ2Gif_7tupRu4EH1jLKm1JLo_cLu2-WvPyk_lWz03fHwUzvLL0bQL_8JTd4CaDCPFvEsMn2u5Vzg7TBATJ8sx9V4EmyIRqG7CVMuSk7MyUSVKxNmsZd7gyE7Oqucx56UuY3_ol9i6VlKa7-4HPi8zZ_sqNhZqPdXrw0HTTSVVVlj7FJXsHRiCFMd0WuUEyStYL_SojJ_y-leuUNV-cGl9bqnknCNerULQaQFlS3AKZmiFsDO03OZVdgkM_qHPgwtzhbpJEWVfEyEz1paj0XpfKb489JUmi3sBbJNx1D5wSC-I_JEscmfDBnrZAeksqWevegdJ3EzchEUHnhfp__2bTJsiicALtBoZNo8HEIzQnQs-xevEsiUxirgjz4CAcNYIdIM0ySx53SxHfirLbr1Hu1R_gNcvKf7n8zf-HaHBSs2CfCeNns8UkWbDE1_8FGoLUz11SBPhPA5lZf0rEg=w1114-h501-no?authuser=0' width=600>
!!! Tools to use
<img src='https://lh3.googleusercontent.com/ZGJZvjWufGTOC3Ro16Xh-I0jfFOj3qT0rTiY2PzczVWszYUDqD7xkoKMB5hXpnHSIdLbYLSfxq76cBUN7Eoil6rK6XMqwtxR268EUyRUcZbCiJsCNDt5gZlcl0SJxRPdKxHVaAN7E8CwbXR-aR1zouOoHFqGz6U2xe-y5qIDS8MT1cxZ0N7EfArmOjAfbzepfxZi8ivgtVYpBfX8ip1VcK_HTxaygO6NXawGHkQ7dI4eqcKtGfkqiBZPScktVyImb0sEcO3PLOf803A1jljdDnTVdp2eUUxQMnfbTJfPolPoEFYI0ERXUM3nu0fLLzhw0bATzEuHfGxFcr8pyUBMzGUoh2OxvK9PU7KmlSliqJIXovSIf-wYfH2dHCSGkDcySgtUbZy5Q2c30hBU1iDRecWCy7StucVVIE9ZTZ8eaLV-tlT257lG-G2BhNm5jvfue2tZcGhM4hiaLgDttRHphJ1__7ByBvI-jNGan3Wg6S_leW-Xmn4j1CFCWBqMtVdxsUHBdwtJvMz-jJoXeRXTak3tEXhQGXybKP3xBlnDnMhuz-YRhVPzPbpRJyCMpsiXmElL0oQCLfVGKicoTpXLZzOTHlXMf5t1pdp8855W0zkzJn53MdNfOYL2o0aQ_e1IF0lFERdJ4BZKL6T_JlAk4XotbenfJxQ52ufNyiW-rS6rk2DSinYiF6GfOjfD8D-lhemIhvjGxsHYdivP13HaiUf0lw=w1749-h929-no?authuser=0' width=600>
,,[[TensorFlow]] ,,
!! Gradient Boosting - Theory
* [[Decision Tree]]s work well with [[non-linear]] data - easily prone to [[Overfitting]] if we build deep decision trees - which is why we build ensembles
* [[Gradient Boosting]] is an ensemble technique
** Fit shallow model
** Fit another model on residuals and repeat
* How [[XGBoost]] works
** Objective = Training Loss + Regularization Term
** Final prediction is the sum of prediction of all the trees
** Regularization term consists of lambda ([[L1 Regularization]]), alpha ([[L2 Regularization]])& gamma
** Does not use [[Entropy]] or [[Information gain]] to split - but instead greedily computes gain
** Supports [[GPU]] computation and optimized for distributed or parallel training
!! [[LightGBM]]
* Developed by [[Microsoft]]
* aim was to make [[Gradient Boosting]] on [[Decision Tree]]s faster
* Instead of checking all of the splits for creating new leaves, sort all the attributes, bin the variables, so instead of iterating over all of the leaves, they iterate over buckets - so the number of splits considered is smaller each time - this is called ''histogram implementation'', which can also be invoked in [[XGBoost]]
* Instead of building trees for breadth-first, building same levels at the same time, LightGBM splits the node first that provides the best gain
!! [[CatBoost]]
* developed by [[Yandex]]
* aim was to prevent [[Overfitting]]
* Sophisticated way of handling categorical variables
* Use [[Oblivious Trees]], where all the splits are same
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/5CWwwtEM2TA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
A to Z of DATA Science and AI
<table class="tableizer-table">
<thead>
<tr class="tableizer-firstrow">
<th>Speaker</th>
<th>Talk</th>
<th>Insight</th>
<th>Use case</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dr. Shantanu Bhattacharya - Chief data scientist at Airtel</td>
<td>2021 Intelligence Everywhere</td>
<td>
''Synthetic Prosperity score using Semantic Segmentation'' $$\\$$
Business Problem - Find regions to expand Airtel's footprint in rural areasData Science Problem - Automated feature extraction of 120+ signals using semantic segmentation from satellite imagery & NASA's nighttime view to construct sythetic prosperity score
<img src='https://lh3.googleusercontent.com/iBS_58483syus6rXAa_QE5v9dvVW3zjNTysqT-0B7v-t6tgH8u3W9Vh-aOgm84JUf1JafisvzDQ7sxUl1qbapipemzva9bUikp9d7cMUdzEnTrQuPa1RJh7-uY5DtHlkTsaM54k5_4Y_IgkIFebSD7sSG76vxWT8v1JjDM-MNJEmXzw9p14f2N0EiyBCnjXMf-dvOSXhCTHYcg0ci6J_H5POYwT6Ly9iKOlM9TupzNjB-_yZnaTNQ-A8UH-5g_4-9s4rocyGaqvTBk7OqGGNThTV5GV1nBC_V9EijvAOtxuCOSy2xR2cWJa2tunpYBEI2O87OBww7xa0veA7KrdneBJ5-8MorgsB7xpxIhAf2ptgrr94Vbq0PcsfTBn-sV5dhmEPvIEijPbhHgPz8-MTGAoXz7fXA4x23gy5IByJh-8r2Qubd_OpoNWZl1MMC6GeykZ_Ss9hXwKnJD2yp_zUqb1rIBU2KMAvgDP_3gzH2zhpfVLJxTKHjP8wlIymmjvhPNSFiOWae8DfyTZeGYCvYydRjHQVMFd2NXFsdb7hFpbyApcryC6mjqlVTX52ODuJ1_PIW0us7gjZxzOr5lrfUvvo2UKYhtY6bT_f7P-6sim78sAjirU96JPNbd4DRfz9HIQsP1MW55ydl2EySo1zSPpDDdKqKGTmd4z0i7OYzQwtYxUgMawQNuTn1nYr73zM4ApgD2tzw1hR84BZTq6PsKF-PA=w895-h327-no?authuser=0' width=500>
$$\\$$
<hr>
''Case Study - Business Address Matching''$$\\$$
A single customer has multiple business address on different forms of identification. Consolidating the addresses using similarity scores to get to a unified customer id
<img src='https://lh3.googleusercontent.com/HGHJB3jdxFa2kjdXyBkFwMFg5uXzKDeeeBzDa8P6kLGeBuTWg6EsMvrookW3b-ZMuYkKN7FbS4yu00iRgD4DknVeU0ZAx1g7UCUaBZzsOKLVvTQOINAFUKUcYx-eu8_DhO_62TkpsPUr_KK9pW1Z5uaFoxTre3iZ2ZgOrqv4XLAZsctzN3jS7ED_v5huPPhRqeBZFnMd5orvql0maNJU6Lr-gWU7dZy7SDOBS9QJMIwGvULRgDRbWnL_dXx_gt-3ZOomjq91-RSKnc7tf4VpkRe-aaenLSDdWSvIFzD2LHgGHzanoBhmbdNznSStMQxcn8Z-KX-e2clptLwPRP-FcCs7eR0E4bAsLpUwgW4fJMqzn41aUIpetBtWe99hiZ9W910xWP1hW8c2c45qQDrEwFrFfmZ4NsumChketnpiaTq8EL7LcVuUKivRMNlL9SqXQwKPp1WYUgb_bx_Rm9rKbb3veDcu-0X4LI5qx6sKokH2gxWg1cDk-ARqMh_MjLZWdyLK273IZKPqwObe3Zp0V_7Ouqp7bk9qv6wlm4S0gsMftDDUZG6VZt4k3VMNRdBamiPalkd-e6kGqHv8waUD_Zni5vo-OYrQ1Xxs3HrRQQAUwqmvh1KYy-1Zuy9CvlH29juJPZXX631sZVS9bcaLGC7XdNruXRT0nmUd9RYL3HNx3aQOSMSN9FygWGSF0OBXxdH6oVf8FYfw0WWKCHGQ0t97oA=w899-h420-no?authuser=0' width=500>
</td>
<td>Creatively transforming from a traditional existing business problem into a deep learning based problem</td>
</tr>
<tr>
<td>Kitmen Cheung, CTO-IBM Data & AI</td>
<td>Demo - Auto AI</td>
<td>''Value of Data Equation'' $$\\$$An equation for the value of data $$V_D \propto \frac{I}{D} \times r_p \times r_{HW} \times A $$. In short, value of data is proportional to the information within the data, times rate of work done by the people and hardware and action taken on the insight
<img src='https://lh3.googleusercontent.com/nkJc26oZ7Ml44JE-PQFj84lZsZi4FJm1_TVjJImlQF9OPFhexB_ePvOVGIxUo_oImuDFnRH8vgPXkr705BUBtt9vggQmgC8oEEi1_157tyru1jlT7o0T_PMzcWoK5LVJKB1GBpxjnbWCenhOvuEQRGWiFgu_yCHK3rrTm2BcGE0zcAWueeeo3N8TKSKQHEaYDGE8ejuWwa8yGp8VmCR4AqR7MoB1YWFXQVvyCr6aok-f7MwE8gS9Xn8zketENwaeyH0lDrZrPv0_D2rsnp2yGh3wJN0hK6DLk54QOV-lAzmiwv6wu7aFaFu4LsXX5MoLib-WxllRoxcIUt3tSaby7kiX2XARkX8s7oPPIbQM4eZNPZcaTeFlCjLEdzZ9XlqucDKRmqNKkB1jo58DLgBgfzp6nHaoWwCz2L8Al-RQhRzvZWFcjYYaRZx7gOehS3vTnbZNTCVBabbcmvVr5ng01Kxcuq1Vtvt3CsEtqHNsSUwiTcu-TByAlPIT8gVWjjmX2YYEVteqkoS4Yt_dqAt31ou2hAMcnzAydYYH26bHIaZD0BffPyhwYZP8K3WkkLyYqarpW37GVidX5OtbEgXejzeDI5E1UnFVv4pKF4bXGfml4BdX-lJEGn0RWTyHvEmXAMQp6Xa5pic6GUTcSNBUbRCC-kvS0i5Tt8dKsDhBhVVknN4N99NK6nDRfqOBpuiINGCCmzUvqQ79qxj40x7NVZt8Wg=w846-h421-no?authuser=0' width=500>
<hr>
$$\\$$
''AUTOAI''
$$\\$$
Developed a platform to automate the processes for building multiple models at the same time while looking at the different metrics for evaluating models and build and deploy the created models right in the platform without any human intervention. It is ''Cornerstone + MLS + EI combined'' in one single platform
</td>
<td> </td>
</tr>
<tr>
<td>Shailesh Kumar -Chief Data Scientist - Reliance Jio - COE AI/ML</td>
<td>Data Rich to AI First</td>
<td>''Single architecture for AI Solutions'' $$\\$$Data scientists doesn't just have to create models, they have to be solution thinkers right from knowledge to modelling to deployment to measurement $$\\$$
<img src='https://lh3.googleusercontent.com/UiBXcnF917iCd9FTLE_oEG7Zwq5rQwYCBcsWThMHqjZAwWFa4FBi21cSJd1Guq8qLxXACQ-rPGEzNz27J_y3C7t7DpNozDUOGOcR0p8DnHmYM6h_17awGvIpnopIa2bb5b3RQdfaca25DkEM7nPotu89vPcIYNpEdoc4BaILeixmt6wF5K_UKRRsfXTiOlcYQSZRFBYs7xujrqvI_rcJBb-ZnOa3ldwiQeSZNWyrRS4pYSIbzPwsy6joDN3RHdhMm9cD6SO9UxgS0mvER9TSO0XP3c8OXOFMa10n5d40cR4hf7Q2C5jgfKBg4L2By93tEKxnDBDO6aSEfLH2Vu9ZNZraz__RFXrTPgWIZKQpXQ7NGy0VSkMzOErjnO7fEAr3O3VaDyOTV34lsWBfEOFCjEb9qXrzCst2WVWMcbrE2J81yNFD8RC9GJbNTjnrwt-5Pl8kc2LDmRAhJRgG8KO1RSJybELO92x9Xob6gCHqZjXiPolylzAeh1TGgpBJ98LrMBUbY86dnIFFx-jwCvA8eMcTcuydPq1q6P8hLlRteVIJ5vWhwk4RvwcxbzHqWHp0T99tmocDeDXbVldYWafLNmSPHz-n3-yvUB_rX6c3DaR9vMuFATAlJGxdEeTHUqh1-HNToJkZXyEDF8bXzsx5aaRydBJ3bOTEVOSZRpdxkKD3E084PEDhhq4vp-UG0Hihbe3KxZ_-5uhal6lgf6ZmE3XCDg=w1021-h574-no?authuser=0' width=500>
</td>
<td>Modelling team's responsibilities will not just be to build models, it will be to think about solutions end to end
</td>
</tr>
</tbody>
</table>
[[23 July 2021]]
[[JAX]] is a [[Python]] package for accelerating [[Machine Learning Research]]
!! At a Glance
* [[NumPy]] like [[API]] for array-based computing
* Function transformations for [[JIT Compilation]], [[Parallel Computing]], [[Vectorization]], [[Autodiff]]
* Execution on [[CPU]], [[GPU]] or [[TPU]]s without any changes to code
Enables a powerful system to build models from scratch
!! [[JAX]] is fast
* Fastest performance in [[MLPerf]] competition
!! Motivating [[JAX]]
```python
import numpy as np
def predict(params, inputs):
"""Usual Prediction Stuff"""
return outputs
def mse_loss(params, batch):
"""Usual computation of MSE Loss function"""
return loss
```
* Unable to run this on GPU or TPU
* cannot do automatic [[Differentiation]] on the loss function to provide [[Gradient]]s
* Unable to parallelize across multiple cores and machines
JAX can fill all these missing pieces using the [[XLA]] backend
```python
import jax.numpy as np
from jax import grad, map, jit
# takes loss function to compute gradient
gradient_func = grad(mse_loss)
# automatic vectorization to be used for multiple batches without changing the original function
vectorized_grads = vmap(grad(mse_loss), in_axes=(None, 0))
# compilation using jit - uses XLA backend to compile code that runs much faster
gradient_func = jit(grad(mse_loss))
# parallelize using pmap - natively targets mutiple cores
vectorized_grads = jit(pmap(grad(mse_loss), in_axes=(None, 0)))
```
* JAX python code is trace to intermedia representation (IR)
!! How JAX Works?
* It traces [[Python]] functions and records the steps and arguments
* All of the operations are based on the set of operations based on lax
* Intermediate representation created is called ''jaxper or JAX Expression''
<img src="https://lh3.googleusercontent.com/9FAHKtN3Q_yiUwOxq0wVXtwc3N_hFdAdSQSnKavANrKzyIsXCYpDZ3UmsKRWOekh_b98caFi70pg_1eDj4msr5QTzzHakedi_RW2vPvgbkCninourO5D00Yqid50M3iwkzwDj-zxDGPr9zarKW2E8l5HWLoNWCoaAfGTz8auSIhUPn23GyPUxOkNRdzh5MsFNYU8b1-L6J1tW39B5-Y3uM080T8SC3qh8ShM9-MwmzRJHGssHbkOxnRkoroZJ75QalvUz5UY6NDX4IxGgEDn2Sj-9RN84-AuOBWwkIgguEw0UFkOsBvEXEyf5cipb_VjZffOteZyV-qWpSopXvn0k1nIXD8C7rAm04Sz_NlIuBRiCJaqH4qQiOQhSepMHJVKylOsDbvXWoCtXHSYsBdKrURUzitC2NwDY2tPeNkWhdvm2swHKAlcKg-unrR-uc5kwmKDSi-Pb4DsS8CHbAMRp2I8tiitvdMcqXJFBtD-8eHF9g4Ut6BAfY2FtUHT1hDGPDiqlmyStbjf_YbCt2sa7wHtZ9ANIIOSha4gNYBDx8QrB5F5RcFdl58h54LsUeRnEHZPtrd23KV907HFvtTfDiMw5lz_R7t6pUzGMpewDnVhmJNXyD4B0sSLvoh3IHqNnqt2QypRLbfcIz4_PXewy3t6T9etlFJ0R5nfUwJJH3QimXfQuJms-ha5G3IaspfVYv0IZoQYZfA2_DMYpEgxlgDqxg=w1211-h673-no?authuser=0" width=600>
!! Pipeline
* Python $$\rightarrow$$ JAX Tracing to IR and transformation $$\rightarrow$$ [[JIT Compilation]] $$\rightarrow$$ [[High Level Optimized (HLO)]] Code $$\rightarrow$$ read by [[XLA]] $$\rightarrow$$ compile it and send it to CPU, GPU and TPU
<img src='https://lh3.googleusercontent.com/g2LR6jtWCzH56PydKq4JvqmAA7gDwrT10z2ojB5h4OVWhm4H1Slvf3ycJD9WJW7dV9PWFefkivbYOftBsJ-2ZkCrwWF6jXGw1FGuWdkySV6nyyZcd8DYgvjTcb4Ts_wAAiSKQsioOmdxzA66pBPUbz1wW5bsuzSWmtkk3Trp2mrdV8iX_29j_ryEzek6J6zHg8llWgnEr1oHrDPTSV8r5haoYAuwl6sHel8_NDtYGTTpaid3ahplvX-m1nG2A2raw2oGBWXTavZDZenbSVf7QwyX5PO00HYiUQ9Gnp8f4LZbijfvs3Fjfg0gq1xy1Y5zDVVj3peRHDY_ZZHFDOrHR1ClAjUD_vk7yqXHJHt3c21986ILSvAJIn2KMm4g18qM1sqNdajxsHBf3ipHC1CUe-qhUFuR0TetsIPGjRve5qEFAcSZXFNDdnPowhEzo7tzv7XPAJROnPbl_WSoC7zq4jPIRfDU0bYjPAIbPucBQ2Txzg2O6dma3mjY_nFmeVl-ahTaxQoZsCTBKNyoZzyOi78gR3fwNUcWu4hcyRgPnEAskl9LhtXzLgZ2lQ9J-eIMuDa_N5z2W3W6DyTsTTpXy5-xViAyTQf1Cx4qqQJBuEyaZL9aZsiLUB2gk_ijLe2XHJ2QHI4SpYD-Ivd4wtpu-aSNpT_aMeojyxGWLcuwKIVZWgu9RP6uQPWkwHWAvWXaTJXLN667AXvvwKq26HshccdmNw=w1165-h387-no?authuser=0' width=600>
!! Documentation
* https://jax.readthedocs.io/en/latest/index.html
!! Ecosystem
#''High Level [[Deep Learning]] Libraries''
#* [[Flax]]
#* [[Haiku]]
#* [[Trax]]
#''[[Optimization]]''
#* [[JAXOpt]]
#* [[Optax]]
# ''Probabilistic Programming''
#* [[Oryx]]
#* [[TFP-jax]]
#* [[NumPyro]]
# [[Graph Neural Network]]s
#* [[Jraph]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/WdTeDXsOSj4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,[[20 November 2021]] | [[TensorFlow]] | [[Google Research]],,
!! [[Machine Learning]]
* [[Ai4|https://www.youtube.com/channel/UCYAEogbdum3qbHqayXzU6gw]]
* [[Machine Learning Conference|https://www.youtube.com/channel/UCWoVlB63O0951q0j4Vkheiw]]
* [[Neural Information Processing Systems |https://www.youtube.com/watch?v=dxPIkyo0eoI&list=PLuv1FSpHurUcwP9CFLT8efinNGFD7KTVH&ab_channel=ArtificialIntelligence]]
* [[ACM KDD|https://www.youtube.com/watch?v=pj89ehOHNIM&list=PLn0nrSd4xjja7AD3aY9Jxmr820gx59EQC&ab_channel=AssociationforComputingMachinery%28ACM%29]]
* [[ACM RECSYS|https://www.youtube.com/channel/UC2nEn-yNA1BtdDNWziphPGA/videos]]
* [[Conference on Computer Vision and Pattern Recognition|https://www.youtube.com/watch?v=puI13feStOE&list=PLuv1FSpHurUfGeppX2QzPk3t-MeyJ_E6T&ab_channel=ArtificialIntelligence]]
* [[ACM SIGCHI|https://www.youtube.com/user/acmsigchi]]
!! [[Python]]
* [[PyCon India 2020 |https://www.youtube.com/watch?v=o8YjPB35GA4&list=PL6GW05BfqWIf5TzoTkQSwg-gDTuJVZk4a&ab_channel=PythonIndia]]
* [[PyCon US|https://www.youtube.com/channel/UCMjMBMGt0WJQLeluw6qNJuA]]
* [[ICML 2020|https://www.youtube.com/watch?v=qR7TFDPwsgs&list=PLuv1FSpHurUfabsekB9uGjIQTsanjpcnU&ab_channel=ArtificialIntelligence]]
!! List on [[Kaggle]]
*[ext[List of great ML/AI conferences!|https://www.kaggle.com/getting-started/115799#665732]]
!! [[Explainable AI]]
* [[IJCAI]]
* [[IEEE VIS|https://www.youtube.com/channel/UCBJDy-9NtG3Db0YcuqNugiw]]
,,Tags: [[AI/ML/DL Resources]],,
* [[Precision]] - Out of all predictions as 1 how many of them were correct
* [[Recall]] - Out of total 1s how many of them were classified as 1s
* [[Accuracy]] - total correct predictions by total predictions
<img src='https://2.bp.blogspot.com/-EvSXDotTOwc/XMfeOGZ-CVI/AAAAAAAAEiE/oePFfvhfOQM11dgRn9FkPxlegCXbgOF4QCLcBGAs/s1600/confusionMatrxiUpdated.jpg' width=600>
https://en.wikipedia.org/wiki/Template:Diagnostic_testing_diagram
!! Why use AWS CLI?
AWS CLI enables you to run commands that allow access to currently available AWS Services. We can also use AWS CLI to primarily create and check the status of our EMR instances. Mostly during your work, you would normally create clusters that are similar in sizes and functionalities, and it can get tedious when you use the AWS console to create a cluster. If you have a pre-generated script to generate EMR saved to your text editor, you can re-run as often as you’d like to generate new clusters. This way we can bypass setting security groups and roles through AWS console. You can embed all these features, including selecting number of cores, applications to install, and even custom script to execute at the time of cluster launch by using a pre-generated script.
!! How to use AWS CLI?
* We’ll be using AWS CLI to create an EMR cluster.
* Check to see if you have Python 3.6 or above
* You can check the Python version using the command line: `$ python --version`
* Install AWS CLI using `pip install awscli`.
* Check if AWS CLI is installed correctly by typing `aws` into your terminal.
* If you see the image below, you have installed AWS CLI correctly.
:<img src ='https://video.udacity-data.com/topher/2020/April/5ea0f839_unnamed/unnamed.png' width ='700'>
!! Setting up credentials using AWS IAM
Let’s set up AWS IAM. This is a service in AWS to create and manage your credentials for AWS services by creating a permission file and secret access key pairs.
The permission file and the secret access key pairs will be stored to your computer for accessing AWS services.
!! How to navigate to the AWS IAM page
* From the AWS console, type IAM in the search bar.
* This will direct to the Identity and Access Management page.
* Click on the Dashboard from left.
* Click on Management Security Credentials.
:<img src='https://video.udacity-data.com/topher/2020/April/5ea0f868_aws-iam-page/aws-iam-page.png' width='700'>
This should take you to the following page.
:<img src= 'https://video.udacity-data.com/topher/2020/April/5ea0f890_aws-iam-access-keys-dashboard/aws-iam-access-keys-dashboard.png' width ='700'>
!! Storing Key Pairs
Once you’ve created the Key Pairs, make sure you store the Secret Key into some secure place because you will not be able to view this again. Let’s save this into your computer as well so that AWS CLI can access these keys.
* Navigate to your home folder (simply type `cd` in your terminal)
* Create a directory `mkdir .aws`
* Make sure to have that period to denote a hidden directory.
* Create a file called `credentials` in the directory.
* Store the key pairs here as well as the default configuration for your AWS clusters.
:<img src ='https://video.udacity-data.com/topher/2020/April/5ea0f8ed_example-image-of-credentials-and-config/example-image-of-credentials-and-config.png' width = '400'>
! Create EMR Script using AWS CLI
!! Creating EMR Script
While creating EMR through AWS console has been shown, but if you know the specificity of your instances, such as which applications you need or what kind of clusters you’ll need, you can reuse the EMR script that we will create below multiple times
```bash
aws emr create-cluster --name <cluster_name> \
--use-default-roles --release-label emr-5.28.0 \
--instance-count 3 --applications Name=Spark Name=Zeppelin \
--bootstrap-actions Path="s3://bootstrap.sh" \
--ec2-attributes KeyName=<your permission key name> \
--instance-type m5.xlarge --log-uri s3:///emrlogs/
```
!! Learning Components on EMR Script
Let’s break down the code and go over each part of the code in the EMR script. It’s important that you know what each component does in order to launch a proper cluster and services attached to this script.
!! EMR Script Components
* `aws emr` : Invokes the AWS CLI, and specifically the command for EMR.
* `create-cluster` : Creates a cluster
* `--name` : You can give any name for this - this will show up on your AWS EMR UI. This can be duplicate as existing EMR.
* `--release-label`: This is the version of EMR you’d like to use.
* `--instance-count`: Annotates instance count. One is for the primary, and the rest are for the secondary. For example, if --instance-count is given 4, then 1 instance will be reserved for primary, then 3 will be reserved for secondary instances.
* `--applications`: List of applications you want to pre-install on your EMR at the launch time
* `--bootstrap-actions`: You can have a script stored in S3 that pre-installs or sets
* environmental variables, and call that script at the time EMR launches
* `--ec2-attributes KeyName`: Specify your permission key name, for example, if it is MyKey.pem, just specify MyKey for this field
* `--instance-type`: Specify the type of instances you want to use. [ext[Detailed list can be accessed here|https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-supported-instance-types.html]], but find the one that can fit your data and your budget.
* `--log-uri`: S3 location to store your EMR logs in. This log can store EMR metrics and also the metrics/logs for submission of your code.
!! Exercise: Create Your Own EMR Script
''NOTE 1: Do not forget to add the --auto-terminate field because EMR clusters are costly. Once you run this script, you’ll be given a unique cluster ID.''
''NOTE 2. Check the status of your cluster using aws emr --cluster-id <cluster_id>.''
''For this exercise, we will be creating an EMR cluster.''
//Step 1//. Install `awscli` using pip.
* You can get instructions for MacOS, Windows, Linux here on AWS Documentation.
//Step 2//. This will give you access to create an EMR cluster and EC2 cluster.
* The EC2 cluster shows a status of all the clusters with your keys, etc.
//Step 3//. Once it's installed, run the script below to launch your cluster.
* Be sure to include the appropriate file names within the <> in the code.
```python
# Add your cluster name
aws emr create-cluster --name <YOUR_CLUSTER_NAME>
--use-default-roles
--release-label emr-5.28.0
--instance-count 2
--applications Name=Spark
--bootstrap-actions Path=<YOUR_BOOTSTRAP_FILENAME>
--ec2-attributes KeyName=<YOUR_KEY_NAME>
--instance-type m5.xlarge
--instance-count 3 --auto-terminate`
# Specify your cluster name
`YOUR_CLUSTER_NAME: <INPUT NAME HERE>
# Insert your IAM KEYNAME -
# Remember, your IAM key name is saved under .ssh/ directory
YOUR_KEY_NAME: <IAM KEYNAME>
# Specify your bootstrap file. Please note that this step is optional.
# It should be an executable (.sh file) in an accessible S3 location.
# If you aren't going to use the bootstrap file,
# you can remove the `--bootstrap-actions` tag above.
# This file is provided in the zipped folder titled
# “Exercise_Creating EMR Cluster” at the bottom of this page.
# In this EMR script, execute using Bootstrap
YOUR_BOOTSTRAP_FILENAME: <BOOTSTRAP FILE>
```
A copy of the exercises are also available in the lesson git repo: Here is the [ext[Link to Github|https://github.com/udacity/nd027-c3-data-lakes-with-spark/tree/master/Setting_Spark_Cluster_In_AWS/exercises/starter]]
!! Desired Output
''The output should look like this:''
```python
{
"ClusterId": "j-2PZ79NHXO7YYX",
"ClusterArn": "arn:aws:elasticmapreduce:us-east-2:027631528606:cluster/j-2PZ79NHXO7YYX"
}
# Go to AWS EMR console from your web browser,
# then check if the cluster is showing up.
#Or you can type
aws emr describe-cluster --cluster-id <CLUSTER_ID FROM ABOVE>`
# You can run `aws emr describe-cluster --cluster-id j-2PZ79NHXO7YYX`
# to confirm if this cluster is ready to go.
```
!! Changing Security Groups
# Once you launch your instance, we will want to log in. Alternately you can use SSH protocol (allows secure remote login) to access your master node on the EMR cluster. Each cluster gets its own security setting.
# You’ll need to allow EMR to accept incoming SSH protocol so your local machine can connect to your EMR cluster in the AWS Cloud by changing the security group.
# Next, we’ll be making the SSH connection from your laptop to your EMR cluster. To allow this, we’ll need to change the Security Group on EC2.
Let’s log into AWS EC2 console.
:<img src='https://video.udacity-data.com/topher/2020/April/5ea0fe77_changing-security-group-on-ec2-console/changing-security-group-on-ec2-console.png' width = '700'>
!! Setting up Port Forwarding
# One last thing to do before using the Jupyter Notebook, or even browsing the Spark UI, is to set up proxy.
# Let’s install FoxyProxy on your Chrome or Firefox browser.
Here is the link to Amazon’s documentation on managing clusters using it’s web interfaces
!! Testing Port Forwarding
Let’s see if your port forwarding works!
```python
# SSH into your cluster first. Note that the port number matches
# what is in foxyproxy-settings.xml.
ssh -i ~/.aws/<YOUR_PEM_FILE>.pem hadoop@<YOUR IP> -ND 8157
# Open another terminal tab, then copy this code into your cluster
# with your PEM file .
scp -i ~/.aws/<YOUR_PEM_FILE>.pem hadoop@<YOUR IP>:/home/hadoop/
# Execute the file
python spark_test_script.py
# Open up Resource Manager Tab from AWS console
# If you’re able to see the Resource Manager from your browser,
# then you have successfully done port forwarding.
```
Click on the Spark UI from the cluster management site. If this is directed to another tab and shows you the Spark executor information, you have done port forwarding successfully!
You should be able to see those application names turn into blue - as in clickable link, then you can tell your port forwarding has been successful.
!! See below for the desired screen
<img src='https://video.udacity-data.com/topher/2020/April/5ea0ff3b_resource-manager-dashboard/resource-manager-dashboard.png' width='700'>
[ext[Exercise Create EMR Clusters - Supporting Material|https://video.udacity-data.com/topher/2020/April/5ea2af82_exercise-create-emr-clusters/exercise-create-emr-clusters.zip]]
[[Lesson 4 : Spark by Udacity]]
!! Principles
* ''the ability to stay away from dubious names is equally if not more important than the ability to discover a great company''.
* Look for 3 things in a company
** Look for clean promoters
** Look for monopolies; higher the barrier to entry $$ \rightarrow $$ higher the portfolio allocation
** Prudent capital allocation
!! Marcellus Portfolio Companies
''Non- Financial Companies''
* [[Dr Lal Path Labs]]
* [[Asian Paints]]
* [[Berger Paints]]
* [[Divis Lab]]
* [[Page Industries]]
* [[Relaxo Footwears]]
* [[Nestle]]
* [[Abott India]]
* [[Pidilite]]
''Financials''
* [[HDFC Bank]]
* [[Bajaj Finance]]
* [[HDFC Life]]
* [[Kotak Mahindra Bank]]
<embed src="https://marcellus.in/wp-content/uploads/2020/01/Marcellus_Creating_Consistent-Compounders_Jan-2020.pdf" width=700 height=300 type="application/pdf">
!! References
* https://marcellus.in/newsletter/little-champs/the-importance-of-accounting-quality/
```python
import toml
output_file = ".streamlit/firestore.toml"
with open(".streamlit/firestore_keys.json") as json_file:
json_text = json_file.read()
config = {"textkey": json_text}
toml_config = toml.dumps(config)
with open(output_file, "w") as target:
target.write(toml_config)
```
!! From [[Pandas]]
```python
import pandas as pd
df = pd.read_csv('train.csv')
df.to_parquet('train.parquet')
```
!! From [[PySpark]]
```python
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df.write.parquet("path/train.parquet")
```
,,[[Parquet]] | [[09 July 2022]],,
Convolutions are the fundamental building blocks of [[CNN]]
convolutional neural networks, also known as convnets, a type of deep-learning model almost universally used in computer vision applications
* https://www.copy.ai/
* AI copywriting
[[AI Businesses]] | [[AI copywriting]]
[[Book]] by [[Neil Gaiman]]
!!! Learnings
* Being Brave doesn't mean being scared. Being Brave means being scared, really scared, badly scared and doing the right thing anyway
,,[[30 May 2020]],,
The statistical relationship between two variables is referred to as their correlation. It quantifies the strength of the relationship between the features of a dataset. Sometimes, the association is caused by a factor common to several features of interest.
* ''Positive Correlation'': both variables change in the same direction.
* ''Neutral Correlation'': No relationship in the change of the variables.
* ''Negative Correlation'': variables change in opposite directions.
The performance of some algorithms can deteriorate if two or more variables are tightly related, called [[Multicollinearity]]
!!! Pandas
```python
pearson_corr_matrix = df.corr(method = 'pearson')
spearman_corr_matrix = df.corr(method = 'spearman')
kendall_corr_matrix = df.corr(method = 'kendall')
```
!!! References
* [ext[How to Calculate Correlation Between Variables in Python|https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/]] from [[Machine Learning Mastery]]
* [ext[NumPy, SciPy, and Pandas: Correlation With Python| https://realpython.com/numpy-scipy-pandas-correlation-python/]] from the blog [[Real Python]]
,,[[18 July 2020]],,
!! Summary
2D representation of the relationships (correlation) in a dataset. The correlation graph allows us to see groups of correlated variables, identify irrelevant variables, and discover or verify important, complex relationships that machine learning models should incorporate, all in two dimensions.
* ''nodes ''of the graph are the variables in a dataset
* ''edge weights'' (thickness) between the nodes are defined by the absolute values of their pairwise [[Pearson’s Correlation]]
* ''node size'' is determined by a node’s number of connections
* ''node color'' is determined by a graph community calculation
!! Applications
* [[Topic Models]] or [[Text Mining]] to detect relationships between entities
* Can be used for global and local understanding
* Model Agnostic
* Ideal with <1000 variables
!! References
* [[Github]] repo for [[Short example for creating a correlation graph with Pandas and Gephi|https://github.com/jphall663/corr_graph]]
,,Tags: [[08 August 2021]] | [[H2O.ai Machine learning interpretability Book]],,
* flashing; sparkling
* severely critical; scathing
Eg : A small, ''coruscating ''delight: I have made a series of face masks featuring wondrous centuries-old astronomical art and natural history illustrations I have restored and digitized from various archival sources over the years
,,[[Vocabulary]],,
Cosine Similarity for u & v is the inner product between u and v
$$
sim(u,v) = \frac{u^{\mathsf{T}}v}{||u||_2 ||v||_2}$$
<img src='http://blog.christianperone.com/wp-content/uploads/2013/09/cosinesimilarityfq1.png' width=600>
counterfactual method indicates the required changes in the input side that will have significant changes (e.g., reverse the prediction) in the prediction/output.
* Can explain individual predictions
!!! Cons
* suffers from [[Rashomon Effect]] - each counterfactual explanation tells a different story to reach a prediction
* does not work with categorical variables with many values
[[Course Certificate|https://www.coursera.org/account/accomplishments/certificate/6FAESFYLVRB6]]
!!! Welcome
* First course in [[Coursera: NLP Specialization]]
* Application to [[Sentiment Analysis]] and [[Word Translation]]
* Represent text anywhere as vectors
* Build simple [[Machine Translation]] system and use [[Locality Sensitive Hashing]] to improve the performance of [[Nearest Neighbor]] search
<<tabs "
[[C1W10: Optional Logistic Regression: Gradient]]
[[C1W101: Supervised ML & Sentiment Analysis]]
[[C1W102: Vocabulary & Feature Extraction]]
[[C1W103: Negative and Positive Frequencies]]
[[C1W104: Preprocessing]]
[[C1W105: Putting it all together]]
[[C1W106: Logistic Regression Overview]]
[[C1W107:Logistic Regression: Training]]
[[C1W108: Logistic Regression: Testing]]
[[C1W109: Logistic Regression: Cost Function]]
[[C1W11: Heroes of NLP: Chris Manning]]
[[C1W201: Probability and Bayes’ Rule]]
[[C1W202: Bayes' Rule]]
[[C1W203: Naïve Bayes Introduction]]
[[C1W204: Laplacian Smoothing]]
[[C1W205: Log Likelihood, Part 1 & 2]]
[[C1W207: Training Naïve Bayes]]
[[C1W208: Testing Naïve Bayes]]
[[C1W209: Applications of Naive Bayes]]
[[C1W210: Naïve Bayes Assumptions]]
[[C1W211: Error Analysis]]
[[C1W301: Vector Space Models]]
[[C1W302: Word by Word and Word by Doc.]]
[[C1W303: Euclidean Distance]]
[[C1W304: Cosine Similarity: Intuition]]
[[C1W305: Cosine Similarity]]
[[C1W306: Manipulating Words in Vector Spaces]]
[[C1W307: Visualization and PCA]]
[[C1W308: PCA Algorithm]]
[[C1W401: Overview]]
[[C1W402: Transforming word vectors]]
[[C1W403: K-nearest neighbors]]
[[C1W404: Hash tables]]
[[C1W405: Locality Sensitive Hashing]]
[[C1W406: Multiple Planes]]
[[C1W407: Approximate Nearest Neighbors]]
[[C1W408: Searching documents]]
" "[[MIT 6.S191 - LEC 1]]" "$:/state/strollhometabs" "tc-vertical">>
,,[[03 September 2021]],,
!! Learning Objectives
* Learn about [[StyleGAN]] - Synthesizing faces
* Alternatives to [[GAN]]s
* Evaluation of models
* Societal implications of GANs - [[Bias]] and Issue of [[DeepFake]]s
* StyleGAN ethical implications
!! About the Course
# Transaction Mechanics
# Supply & Ownership
# Loans & Swaps (Exchange)
# Joining DeFi - Creating a wallet in [[Metamask]]
Course 2 of [[Coursera: NLP Specialization]]
!! Introduction
learn about probabilistic models and how to use the to predict word sequences. This powers [[Auto-correction]] and [[Search Suggestions]]
Also, learn about [[Markov Model]]s and [[Diva-Turbie Algorithm]] - both of which are fundamental building blocks of many NLP systems
* WEEK1: Build auto-correct system by using probabilities of sequences as characters
* WEEK2: [[Hidden Markov Model]]s and implement [[Part of speech (POS)]] tagging system
* WEEK3: Build auto-complete system using probabilities of sequences of words
* WEEK4: Word Vectors - generate them using neural networks
,,[[11 September 2021]] | [[Natural Language Processing (NLP)]],,
Download data from -
* Pix2Pix - (https://www.coursera.org/learn/apply-generative-adversarial-networks-gans/programming/GJt70/pix2pix/lab)
* CycleGAN - Horse to Zebra (https://www.coursera.org/learn/apply-generative-adversarial-networks-gans/programming/BuKbz/cyclegan/lab)
part of [[Coursera: NLP Specialization]]
* [[Sentiment Analysis]] with [[Deep Neural Networks]]
* Language generators using [[RNN]]s
* Apply [[LSTM]]s for [[Named Entity Recognition]]
* [[Siamese Network]]s to identify duplicate questions - same questions with different wordings
part of [[Coursera: NLP Specialization]]
<<tabs "
[[WEEK1:01 What is a Neural Network?]]
[[WEEK1:02 Supervised Learning with Neural Networks]]
[[WEEK1:03 Why is deep learning taking off now?]]
[[WEEK1:04 Interview with Geoffrey Hinton]]
[[WEEK1:QUIZ1 Intro to Deep Learning]]
[[WEEK2:01 Binary Classification]]
[[WEEK2:02 Logistic Regression]]
[[WEEK2:03 Logistic Regression Cost Function]]
[[WEEK2:04 Gradient Descent]]
[[WEEK2:05 Derivatives]]
[[WEEK2:06 Computation Graph]]
[[WEEK2:07 Derivatives with a Computation Graph]]
[[WEEK2:08 Logistic Regression Gradient Descent]]
[[WEEK2:09 Gradient Descent on m examples]]
[[WEEK2:11 Vectorization]]
[[WEEK2:12 Vectorizing Logistic Regression]]
[[WEEK2:13 Broadcasting]]
[[WEEK2:QUIZ1 Neural Network Basics]]
[[WEEK3:QUIZ1 Shallow Neural Networks]]
[[WEEK4:QUIZ1 Key concepts on Deep Neural Networks]]
" "[[WEEK1:01 What is a Neural Network?]]"
"$:/state/strollhometabs" "tc-vertical">>
* ''WEEK1'' : Practical Aspects of [[Deep Learning]]
<<tabs "
[[WEEK1:01 Train/Dev/Test Datasets]]
[[WEEK1:02 Bias/Variance]]
[[WEEK1:03 Basic Recipe for Machine Learning]]
[[WEEK1:04 Regularization]]
[[WEEK1:05 Why does Regularization help with overfitting?]]
[[WEEK1:06 Dropout Regularization]]
[[WEEK1:07 Understanding Dropout]]
[[WEEK1:08 Other Regularization Methods]]
[[WEEK1:09 Vanishing/Exploding Gradients]]
[[WEEK1:10 Weight Initialization for Deep Networks]]
[[WEEK1:11 Numerical Approximation of Gradients]]
[[WEEK1:12 Gradient Checking]]
[[WEEK1:QUIZ1 Practical aspects of Deep Learning]]
[[WEEK2:01 Mini-Batch Gradient Descent]]
[[WEEK2:02 Understanding Mini-batch Gradient Descent]]
[[WEEK2:03 Exponentially Weighted Moving Averages]]
[[WEEK2:04 Understanding Exponentially Weighted Averages]]
[[WEEK2:05 Bias Correction in Exponentially Weighted Averages]]
[[WEEK2:06 Gradient Descent with Momentum]]
[[WEEK2:08 Adam Optimization]]
[[WEEK2:09 Learning Rate Decay]]
[[WEEK2:10 The Problem of Local Optima]]
[[WEEK2:11 Interview with Yuanqing Lin]]
[[WEEK2:QUIZ1 Optimization Algorithms]]
[[WEEK2:07 RMSProp]]
[[WEEK3:QUIZ1 Hyperparameter tuning, Batch Normalization, Programming Frameworks]]
" "[[WEEK:01 Train/Dev/Test Datasets]]"
"$:/state/strollhometabs" "tc-vertical">>
!!! Week 1 Learning Objectives
* Explain why Machine Learning strategy is important
* Apply satisficing and optimizing metrics to set up your goal for ML projects
* Choose a correct train/dev/test split of your dataset
* Define human-level performance
* Use human-level performance to define key priorities in ML projects
* Take the correct ML Strategic decision based on observations of performances and dataset
!!! Week 2 Learning Objectives
* Describe multi-task learning and transfer learning
* Recognize bias, variance and data-mismatch by looking at the performances of your algorithm on train/dev/test sets
<<tabs "
[[WEEK1:01 Why ML Strategy?]]
[[WEEK1:02 Orthogonalization]]
[[WEEK1:03 Single number evaluation metric]]
[[WEEK1:04 Satisficing and Optimizing Metric]]
[[WEEK1:05 Train Test and Dev set distributions]]
[[WEEK1:06 Size of dev and test sets]]
[[WEEK1:07 When to change dev/test set and metrics]]
[[WEEK1:08 Human level performance]]
[[WEEK1:09 Avoidable Bias]]
[[WEEK1:10 Understanding Human Level Performance]]
[[WEEK1:11 Surpassing human level performance]]
[[WEEK1:12 Improving your model performance]]
[[WEEK1:13 Andrej Karpathy Interview]]
[[WEEK1:QUIZ1 Bird Recognition in the City of Peacetopia (Case Study)]]
[[WEEK2:01 Carrying out error analysis]]
[[WEEK2:02 Cleaning up incorrectly labelled data]]
[[WEEK2:03 Build your first system quickly and then iterate]]
[[WEEK2:04 Bias & Variance on mismatched data distributions]]
[[WEEK2:06 Addressing Data Mismatch]]
[[WEEK2:07 Transfer Learning]]
[[WEEK2:08 Multi Task Learning]]
[[WEEK2:09 End-to-End Deep Learning]]
[[WEEK2:QUIZ1 Autonomous Driving (Case Study)]]
" "[[WEEK1:01 Why ML Strategy?]]"
"$:/state/strollhometabs" "tc-vertical">>
* WEEK1: [[Recurrent Neural Network]]s
* WEEK2: [[Natural Language Processing (NLP)]] and [[Word Embeddings]]
* WEEK3: Sequence Models and [[Attention mechanism]]
* WEEK4: [[Transformer Network]]
!! Taking Up
* [[COURSE3: Structuring Machine Learning Projects]]
* [[Introduction to Psychology]]
* [[COURSE1: Neural Networks & Deep Learning]]
!! Completed
* [[AI for Everyone]]
* [[An Introduction to Consumer Neuroscience & Neuromarketing]]
* [[Business Metrics for Data-Driven Companies]]
* [[Sequences, Time Series and Prediction]]
* [[Natural Language Processing in TensorFlow]]
* [[Convolutional Neural Networks in TensorFlow]]
* [[Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning]]
Course offered by [[Coursera]] on [[Statistics]] by [[Stanford]]
<<tabs "[[Intro to Statistics W101: Course Welcome]] [[Intro to Statistics W102: Meet Guenther Walther]] [[Intro to Statistics W103: Descriptive Statistics Introduction]] [[Intro to Statistics W104: Pie Chart, Bar Graph, and Histograms]] [[Intro to Statistics W105: Box and Whisker Plot and Scatter Plot]] [[Intro to Statistics W106: Providing Context is Key for Statistical Analyses]] [[Intro to Statistics W107: Pitfalls when Visualizing Information]] [[Intro to Statistics W108: Mean and Median]] [[Intro to Statistics W109: Percentiles, the Five Number Summary, and Standard Deviation]] [[Intro to Statistics W201: Introduction]] [[Intro to Statistics W202: Simple Random Sampling and Stratified Random Sampling]] [[Intro to Statistics W203: Bias and Chance Error]] [[Intro to Statistics W204: Observation vs. Experiment, Confounding, and the Placebo Effect]] [[Intro to Statistics W205: The Logic of Randomized Controlled Experiments]] [[Intro to Statistics W206: The Interpretation of Probability]] [[Intro to Statistics W207:Complement, Equally Likely Outcomes, Addition, and Multiplication]] [[Intro to Statistics W208:Four Rules Example: How to Deal with - At Least One]] [[Intro to Statistics W209: Solving Problems by Total Enumeration]] [[Intro to Statistics W210: Bayes' Rule]] [[Intro to Statistics W211: Bayesian Analysis]] [[Intro to Statistics W212: Warner's Randomized Response Model]] [[Intro to Statistics W2Q1: Producing Data and Sampling]] [[Intro to Statistics W301: The Normal Curve]] [[Intro to Statistics W302: The Empirical Rule]] [[Intro to Statistics W303: Standardizing Data and the Standard Normal Curve]] [[Intro to Statistics W304: Normal Approximation]] [[Intro to Statistics W305: Approximation]] [[Intro to Statistics W306: The Binomial Setting and Binomial Coefficient]] [[Intro to Statistics W307: The Binomial Formula]] [[Intro to Statistics W308: Random Variables and Probability Histograms]] [[Intro to Statistics W309: Normal Approximation to the Binomial, Sampling Without Replacement]]"
"[[Intro to Statistics W101: Course Welcome]]" "$:/state/strollhometabs" "tc-vertical">>
[[08 May 2022]]
!! Welcome to the Specialization
!!! Jonas -[[Stanford]] University
!!! Lucas - [[Google Brain]], Co-author of [[TensorFlow]] and Author for [[Transformer Network]]
!! Course 1
* [[Sentiment Classification]] using [[Logistic Regression]] and [[Naive Bayes Classifier]]
* Represent queries and words in documents as numbers and vectors
* Build first [[Machine Translation]] system
* Learn about [[Locality Sensitive Hashing]] - method for efficient search
!! Course 2
* Probabilistic Models in NLP - given a few words what is the probability of next word
!! Course 3
* Sequence Models
!! Course 4
* [[Attention Model]]s - used in chatbots
,,[[Coursera]] | [[03 September 2021]] | [[Natural Language Processing (NLP)]] ,,
* [[Deeplearning.ai Deep Learning Specialization]]
* [[TensorFlow in Practice Specialization]]
,,Tags: [[AI/ML/DL Resources]],,
<<<
Covariance is a measure of joint variability between two random variables
* Positive covariance - if greater values of one variable leads to greater values of other variable
* Negative covariance - if greater values of one variable leads to smaller values of other variable
* The sign shows the tendency in a linear relationship
<<< [[Covariance|https://en.wikipedia.org/wiki/Covariance]] on [[Wikipedia]]
Variables can be related by a linear relationship. This is a relationship that is consistently additive across the two data samples. This relationship can be summarized between two variables, called the covariance
`cov(X, Y) = (sum (x - mean(X)) * (y - mean(Y)) ) * 1/(n-1)`
* The use of the mean in the calculation suggests the need for each data sample to have a Gaussian or Gaussian-like distribution.
* A covariance value of ''zero indicates that both variables are completely independent''.
A problem with covariance as a statistical tool alone is that it is challenging to interpret. This leads us to the [[Pearson’s Correlation]] next.
!!! References
* [ext[How to Calculate Correlation Between Variables in Python|https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/]] from [[Machine Learning Mastery]]
,,[[18 July 2020]],,
!!! References
* [[Creating a Market Trading Bot Using Open AI Gym Anytrading|https://analyticsindiamag.com/creating-a-market-trading-bot-using-open-ai-gym-anytrading/]]
* Content in blog above is taken from this video
:<iframe width="560" height="315" src="https://www.youtube.com/embed/D9sU1hLT0QY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
IDEO founder and Stanford d.school creator David Kelley and his brother Tom Kelley, IDEO partner and the author of the bestselling The Art of Innovation, have written a powerful and compelling [[Book]] on unleashing the creativity that lies within each and every one of us.
!! The heart of Innovation
* This book is the opposite of [[Creativity myth]] - the foundation that everyone is creative
* Falsely equating ''Creativity'' with ''artistic''.
* At its core, creative confidence is about believing in your ability to create change in the world around you
* Creative confidence is like a muscle - it can be strengthened and nurtured through effort and experience
* Do schools kill creativity? - Sir Ken Robinson says, ''it is as important as education as literacy, and we should treat it with same status''
:<iframe width="350" height="200" src="https://www.youtube.com/embed/iG9CE55wbtY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* David founded the d.school (Hasso PLattner Institute of Design) to teach [[Design Thinking]] - to future entrepreneurs from Stanford's graduate school
<<<
Opening up the flow of creativity is like discovering that you've been driving a car with the emergency brake on - and suddenly experiencing what it feels like when your release the brake and can drive freely.
<<<
* We don't have to generate creativity from scratch - just need help rediscovering it
* Our belief systems can affect our actions called [[Self-efficacy]] by Albert Bandura
,,* [[Creative Confidence: Unleashing the Creative Potential Within Us All]] | [[31 May 2020]] [[Creative Confidence]],,
,,Chapter 2 of the book [[Creative Confidence]],,
!! FLIP - From [[Design Thinking]] to Creative Confidence
!!! Factors to Balance in Innovation Program
* ''Human Factors'' - these are not necessarily important, but being human is at the core of innovation process. Deep empathy for people = good source of inspiration
* ''Business or Economic Viability''
* ''Technical Factors or Feasibility'' -
:An example of human centered approach is the 'Adventure Series' MRI scanning experience designed for children. The children were afraid to lie still inside the machine for too long, which required them to be sedated. This also required anesthesiologists to be present.
:<img src="https://www.gehealthcare.com/-/jssmedia/100bc2d8adeb469e952120ffa889592d.jpg?h=400&la=en-US&w=1200&hash=461E7026D9E09DB25CB8EC1299089269" width=60% style="margin-top:1em">
!!! Design Driven Innovation
# ''Inspiration'' - empathy is go-to source
# ''Synthesis'' - [[Empathy Map]]. Reframe the problem. e.g. "how might we reduce customer waiting time?" to "how might we reduce perceived waiting time?"
# ''Ideation and Experimentation'' - be quick and dirty in exploring ideas without being invested in one idea
# ''Implementation'' - Refine the design and prepare roadmap to the market place. Beta testing
<<<
Failure Sucks but Instructs
<<<
* ''Flipping'' - Changing from one state of mind to another.
!!! Nurturing creative thinkers
* Articulation challenge - //redesign the experience of getting your morning coffee//
* ''Analytics thinkers'' snap instantly to problem solving mode, They leap for final answers and start defending
* ''Creative Thinkers'' are careful not to rush to judgement. They are willing to ''go wide'' first
!!! State of Mind
* [[Growth Mindset]] by [[Carol Dweck]] - let go of the belief "//I'm not good at that kind of thing//"
* ''Fixed mindset'' - prefer to stay behind in comfort zone. They sabotage their long-term chances for success rather than expose a potential weakness
* Design thinkers make everything a conscious and original choice - from arranging their bookshelf to presenting their work. Focused ''intentionality'' was one of the defining characteristics of ''Steve Jobs''
,,[[Creative Confidence: Unleashing the Creative Potential Within Us All]] | [[31 May 2020]]
,,Chapter 3 of book [[Creative Confidence]],,
* Overcome phobias - Experience the situation first hand to remove false beliefs. [[Guided Mastery]] - by Albert Bandura, psychologist
* [[Creativity Scar]]
* Embrace your failures - make a [[failure resume]]
* Drawing Confidence - [[The Back of the Napkin]] by Dan Roam; [[Napkin Academy]]
* [[Urgent Optimism]] - The belief that acting immediately one can tackle an obstacle with reasonable hope of success. borrowed from video gamers
<<<
Courage is only an accumulation of small steps
<<<
!!! The failure paradox
* Creative people simply do more experiments. Seasoned innovators would have an impressive collection of "war stories" about failures.
<<<
An experiment ending in failure is not a failed experiment as long as constructive learning is gained.
<<<
!!! Designing for courage
* Team members to complete multiple quick design project rather than one big project to maximize the number of learning cycles. This is called ''mileage''. This usually trumps years of experience.
* ''lessons from a juggler'' - while starting to juggle just toss the balls in the air and let them drop. because once you get comfortable with dropping, we address the fear of failure and juggling then becomes a lot easier.
!!! Permission to fail
Constructive failure happen more in some setting than others
* [[HackFWD's Geek Agreement]] - job security
* Lowering other's expectations
!!! Let go of comparison
* When self-worth is on the line, we are far more willing to be courageous and risk sharing out raw talents and gifts. If you are concerned about conforming or about how you measure up to others' successes, you won't perform risk taking inherent in creative endeavors
* Let go of insecurity
* ''Be resilient ''- In addition to being resourceful problem solvers, are more likely to seek help, have a strong social support and be better with colleagues, family and friends
!!! Drawing Confidence
* People see drawing as ''litmus'' test for creativity. Everyone can draw says [[Dan Roam]] the author of [[The Back of the Napkin]].
* 25% of the people are reluctant to even pick up a marker - [[Red Pen People]]
* Another 50% are only comfortable highlighting or adding details to other people's drawings
* Resist judging yourself - If you can just grab a pen you are halfway there.
* For those who draw too well - perception can be as crippling as lack of confidence in non drawers
,,Chapter 4 of the book [[Creative Confidence]],,
!! SPARK - From blank page to insight
* Story of the development of [[Embrace Infant Warmer]]
!! Cultivating a creative spark
<br>
!!! 1. ''Choose creativity''
* [[Psychologist]] [[Robert Sternberg]] has done extensive reasearch on intelligence, wisdom, creativity and leadership. He tells that creative people have something in common : ''they decided to be creative.''
* Creative people tolerate ambiguity when they are not certain that they are not on the right path
<<<
Being creative doesn't mean starting from scratch or being the sole originator - it's about adding what you can about making a creative contribution
<<<
!!! 2. ''Think like a traveller''
* Notice every little detail
* Engage ''Beginners mind'' - Think "Isn't that interesting?" rather than "I already know about that". Do it often, even commuting to work, preparing for a meeting. Look for new insights in familiar things
* Create a portfolio of short-term and long-term ideas with varying potential for risk and reward
* Keep your thinking fresh - read unsual magazines, listen to new music, read new blogs, watch a dozen ted talks
* Have [[Abundance Mentality]]
<<<
London's Great Ormond Street Hospital has been struggling with chaotic patient handoffs from surgery to ICU. ''So the head of pediatric ICU asked Ferrari pit crew to coach hospital staff members.''
<<<
!!! 3. Engage relaxed attention
# ''Empathize with end-use''
# ''Do observations in the field''
# ''Ask questions starting with WHY''
# ''Re-frame Challenges''
# ''Build a creative support network''
A book by Tom and David Kelly
!! Creative confidence
*''The ability to come up with new ideas and the courage to try them out''. It is the combination of thought and action that determines creative confidence
!!! Creativity is a phenomenon whereby something new and somehow valuable is formed
* No word in the Tibetan language for creativity or ''being creative''. The closest translation is "natural"
''What it means to be creative?''
<<<
Willing and able to solve interesting problems, even for other people
<<< [[Seth Godin]]
[[Creative Confidence - 01 - The heart of Innovation]]
!!What it means to be creative?
<<<
Willing and able to solve interesting problems, even for other people
<<< [[Seth Godin]]
!! Why is it so difficult at work
* You are already good at something. Like, Random house did not get the idea of organizing world's information, even though they would good at finding and disseminating information. It took two people to create google only 20 years ago. ''Distractions feel like distractions that keep us away from doing our work and not opportunities''
* People like being good at their jobs - you were hired because you are good at what you do.
!! Barriers that lie between you and your value creation
* You are here to make a change happen - that is what it means to be Innovative
* To be aware that leading into a possibility that might not work. Most highly functioning teams, are not organized around the idea of leaning into the unknown to make a change happen
* Who seek to innovate, ask
** What change are you making?
** Who is involved?
** how will you know if it worked?
If you can't answer these questions you have not established the conditions for the change to occur.
!! Tactic1 : Bringing Outside Voices Inside
* Inside the org, there are very few problems because any problems that were easy to solve has already been solved. Traditionally institutions are in a steady state
* The problems that are left aren't seen as problems, instead ''situations''. Like, Gravity, traffic jam
* Make the problem visible - put them in the format that is easy to share - Let's agree that there is a problem
!! Developing Practical [[Empathy]]
* The willingness to acknowledge that other people don't have what you have, see what you see, believe what you believe and that's okay
* ''Our job is to find problems to be solved, because no solution begins perfect, they are best available option.''
!! The difference between leadership and management
* Management is using power and authority to tell people what to do - It is mandatory
* Leadership is voluntary (being and following) - they lean into problems where there are no proven solutions - the direction may not be clear but the objective is
* Examples
** Hotmail - email was not free back then, somebody asked - What if email was free? - led to hotmail - bought by Microsoft at $0.5B
** Starbucks - Did not sell coffee, somebody ask - What if they sold espresso like they sell in Italy
* ''If your org has a creativity problem, then your org is having a relationship problem''
* Authority comes from org chart, but anyone can take responsibility
Lesson - ''If you care about being creative, you should care about taking responsibility'' - not to solve the whole thing, but to identify questions, the problems that you are trying to solve
!! Revolutions destroy the perfect before enabling the impossible
* Ask, ''where does the impossible lie, because it is coming for you, and certainly''. No one would have imagined Netflix streaming of movies when there were only two theaters in Hollywood
!! The commitment to failure
* What it means to be [[Creative]], is that you are committed to failure - on your way to better.
* Scientists do experiments because they ''might '' not work.
* Western Union turned down acquiring Telephone from [[Alexander Graham Bell]]
* It is hard to do this at work - because it is said that ''Be creative but do it right''
!! there is no such things as a writer's block
* Writer's block is a myth. It is anyone on team that says, I don't have any good ideas. It is why in a Brainstorming session - it is really hard to get people to speak up.
* [[Isaac Asimov]] has written 400 books in his lifetime. //He says he types 5:30 hours everyday//. When you do something for so long, the subconscious stops fighting, and it says, that I might as well type something good. It doesn't matter how it's written.
* There is a fear of bad writing. The organizations are bad at creativity because they are afraid of being wrong
* Do bad writing, have more bad ideas - ''I just learned one more thing that doesn't work''. 5,6 people in team meeting
* Win at Pictionary by guessing non stop as fast as you can
!! Learning how to juggle
* Juggle with one ball for 20 minutes from left - to - right and 20 minutes from right to left. you will be good at throwing in 40 minutes. If you are good at throwing, the catches will take care of themselves
* The idea is to identify the problem. The organization will do what is best - catch up
!! [[Imposter Syndrome]] is real
* Hunch that we are a fraud
* Feeling that it's not our business to be solving this problem
* When you feel like you are an imposter, that means you are onto something - that's good
!! Who becomes your competition
* What happens when you are about to say a creative idea? - ''You are inviting a bunch of people to become the competition.'' Like, [[Disney]] started from making movies to opening an amusement park in [[California]], they had a whole new bumch of competitors. Say, '''bring them on''' - because this problem is important enough to be solved using a creative approach
!! And then doing it all again
* After you solve a problem by being creative, you are not done
* Develop a practice to do this work regardless of the outcome - ''come to work without an attachment that the creative work we did is going to work or not''
!! Go be a ruckus
* in a generous way, show up and do the work that matters for the people who care
!! BONUS: SHIPIT Journal
* It works when you print out and use a pen
* How can we be creative and right at the same time - you'll have trouble being creative at work
<embed src='https://seths.blog/wp-content/uploads/2012/05/theshipitjournal.pdf' height=250>
that being creative is a fixed trait, that you're born with creative genes or you're not
* Mentioned in the book [[The Gifts of Imperfection]] by [ext[Brene Brown | https://brenebrown.com/]]
* https://jenwaldman.com/blog/creativity-scars
# Write down the opportunity
# List minimum criteria, the option need to pass in order to be considered. If it does not pass all criteria is a definite NO
# Extreme Criteria - Must pass 2 of 3 criteria for a definite YES
<style>
.t30 {width: 100px; height: 50px;}
.t3 {height: 50px;}
</style>
<table>
<tr>
<th>What is the opportunity being offered to you</th>
<td class="t3" colspan=3></td>
</tr>
<tr>
<th>What are the minimum criteria for this option to be considered</th>
<td class="t30"></td>
<td class="t30"></td>
<td class="t30"></td>
</tr>
<tr>
<th>What is the ideal criteria for this opportunity to be approved</th>
<td class="t30"></td>
<td class="t30"></td>
<td class="t30"></td>
</tr>
</table>
<<<
A cryptocurrency is a digital or virtual currency that is secured by [[cryptography]], which makes it nearly impossible to counterfeit or double-spend. It is a form of digital asset based on the network distributed across large set of computers
<<< [[Investopedia|https://www.investopedia.com/terms/c/cryptocurrency.asp]]
* A medium of exchange
* On decentralized networks based on [[Blockchain]] Technology
* Not issued by central authority - immune to regulators
* Allow for secure payments in the form of tokens
* Crypto - refers to encryption algorithm
* More than 5000 are out there
* ''No law in India makes buying or selling cryptocurrencies illegal'' - [[Coinswitch]] [[FAQs|https://coinswitch.co/?shortlink=49491a3&pid=ET%20Blogs&c=ET%20Blogs]]
* Built in [[Proof-of-work]] and [[Proof-of-stake]]
!! Types
* [[Bitcoin (BTC)]] - [[Blockchain]] based
* [[Altcoins]] - [[Litecoin]], [[Ethereum]]
* [[04 Cryptocurrency Investment Strategies]]
* [[05 Safely storing Crypto in 2021]]
* [[06 Future of Crypto in India]]
* Indian crypto exchange ran a full page ad on ET
* Companies include [[WazirX]], [[CoinDCX]], planning a [[Too-big-to-fail]] strategy which takes extreme regulations like complete ban off the table
* Is crypto a speculation - like the [[Tulipmania in the Netherlands]], may be no because
** Crypto has a fixed supply curve
** Tulipmania lasted only 3 years while crypto has been here for over a decade
** Tulipmania never brought down the economy, while crypto has [[Decentralized]] checks and balances
!! Duality of [[Cryptocurrency]]
* [[Security]]
** Too much regulation.
** [[Howey Test]] of Security in [[United States]] to determine whether something is security or not. It's a security if, ''"an investment of money in a common enterprise with a reasonable expectation of profits to be derived from the efforts of others"''
** For example, [[Initial Coin Offering (ICO)]], fell into this bracket and [[U.S. Securities and Exchange Commission (SEC)]] classified them as corporation selling stock, which had to be registered and financial statements to be made publicly available. Anyone involved with ICO abandoned ship
* [[Commodity]]
** Too less regulation
** Argument used in [[Supreme Court]] to lift virtual ban created by [[Reserve Bank of India (RBI)]] on the banks to deal with Cryptocurrencies
** Incentive for established commodity players now to come and implement tried and tested strategies to make money
Probable way forward in India is crypto is classified as [[Commodity]]
<<<
For a long time, it was believed that the government would launch a bill banning all forms of cryptocurrencies. However, according to one source, ''there’s a bill expected to be tabled before the budget which will define cryptocurrency as a commodity
''
<<<
!! Reference
* https://the--ken-com.eu1.proxy.openathens.net/the-nutgraf/cryptos-want-to-be-regulated-but-as-what/
* Compute Unified Device Architecture
* parallel computing platform and application programming interface model created by [[Nvidia]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/82DNYqurkxo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* https://www.cutout.pro/
* AI powered creative visual design platform
* Background removal, enhancement, upscaling
[[AI Businesses]] | [[AI Art]]
!!! Point 1
* What is baseline?
* Why do you need baseline?
* What is ADB?
* What approaches did you evaluate?
* What are time series? What are different kinds? Why do you think it will work best here?
!!! Point 2
* What is FRP?
* Purpose of FRP?
* What other relief programs were available?
* Why did you need another program?
* What variables did you use to build?
* How did you validate the model?
* What approaches did you try?
!!! Point 3
* What is OCC?
* What was involved in preparation for the exam?
*
* Asia’s first [[Law Firm]] to integrate [[AI]] software
!!! May 2020
* 30 May - Conceived [[Presentation Design]] blog idea; Finished reading [[Coraline]] by Neil Gaiman
!!! June 2020
* 13 Jun - Completed [[Week 1 - Sequences and Prediction]] of [[Sequences, Time Series and Prediction]] course on [[Coursera]]
* 14 Jun - Developed [[Android App]] using [[Kivy Python]];
* 15 Jun - Discovered [[Roam Research]]; Discovered [[TiddlyWiki]];
* 16 Jun - Discovered [[Stroll]];
* 17 Jun - Discovered [[Relanote]] note taking app
* 18 Jun - Discovered [ext[Jen Waldman|https://jenwaldman.com/]] blog;
* 19 Jun - [[Juneteenth]] in US
* 20 Jun - Completed [[Week 2 - Deep Neural Networks for Time Series]] of [[Sequences, Time Series and Prediction]] on [[Coursera]]
* 21 jun - Discovered [ext[brainpickings.org|https://www.brainpickings.org/]]; Started reading [[Dear Data]];
* 22 Jun - Completed [[Pan Card Link]];
* 24 Jun - Finished reading Chapter 2 - [[Think & Grow Rich - 02 - Desire]] of [[Think & Grow Rich]] by [[Napoleon Hill]]
* 26 Jun
** Course completion certificate for [[Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning]] on [[Coursera]]
** Course completion certificate for [[Convolutional Neural Networks in TensorFlow]] on [[Coursera]]
** Course completion certificate for [[Natural Language Processing in TensorFlow]] on [[Coursera]]
** Finished reading [[Mindset - 01 - The Mindsets]] of book [[Mindset]] by [[Carol Dweck]]
* 27 Jun
** Finished [[Darksiders 2]] game;
** Course completion certificate for [[Sequences, Time Series and Prediction]]; Completed [[TensorFlow in Practice Specialization]]
** Reading [[Mindset - 02 - Inside the Mindsets]] of the book [[Mindset]]
* 29 Jun
** Read about [[VGG16]] a [[Convolutional Neural Network]] architecture
!!! July 2020
* 3 Jul - Read about [[EfficientNet]] - a [[Convolutional Neural Network]] architecture
* 4 Jul - Read about [[Bayesian optimization]] and [[Hyperopt]] for automated [[Hyperparameter]] selection;
* 5 Jul - [[Spark by Udacity]] is a course offered by [[Udacity]] for [[Apache Spark]]
* 6 Jul - Completed [[Lesson 2 : Spark By Udacity]], a course offered by [[Udacity]] for [[Apache Spark]]
* 7 Jul - Completed [[Lesson 3 : Spark by Udacity]], a course offered by [[Udacity]] for [[Apache Spark]]
* 9 Jul - [[TFRecord]]
* 10 Jul - [[Stacking / Blending Models]] for ML/DL
* 12 Jul - Completed [[Chapter 1 - The Visual Display of Quantitative Information]]; Completed [[Mindset - 02 - Inside the Mindsets]]
[[Python]] based library to perform [[Distributed Computing]]
!! Parallelize for loops
```python
from dask import delayed, compute
def some_function(some_item):
computation = some_item*some_item
returns computation
results = []
for item in list_of_items:
output = delayed(some_function)(item)
results.append(output)
results = compute(results)
```
''Data augmentation is a strategy that enables practitioners to significantly increase the diversity of data available for training models, without actually collecting new data''. This augmented data is acquired by performing a series of pre-processing transformations to existing data, transformations which can include horizontal and vertical flipping, skewing, cropping, rotating, and more in the case of image data.
,,[[06 July 2020]],,
A model to produce and keep x variables (variables that require a custom logic) at a certain frequency and store in a particular place. This saved time and effort required in writing the custom codes in the deployed models. Also computation time is significantly reduced as one data model can serve multiple models
<img src='https://venturebeat.com/wp-content/uploads/2020/10/data_AI_landscape.jpg?fit=1331%2C887&strip=all'>
! Introduction
!! Science of story
* Stories engage senses - Engage the brain at all levels: Intuitive, Emotional, Rational and [[Somatic]]
* Stories bring us closer together - brain activations and behaviors become synchronized
* Stories makes us feel - ability to immerse listeners
* Stories move us to act - responses enacted by our brain can elicit a sense of [[Empathy]], urgency or even guilt affliction. ''Narratives compel us to act by physically altering our brain chemistry''
!! Transform Numbers into Narratives
* because facts aren't as memorable as stories. In an experiment, only ''5% remembered cold facts, individual statistics however, 63% remembered the stories''
!! Communicate data to lead
* [[Empathy]] is the foundation of effective communication. A chart that is clear to you could be perplexing to others simply because they have a different background and not because they are not smart.
* Truth seekers - explore data
* Leaders - Communicate future state through data
''Communicating data is not about creating sexy charts and showcasing your smarts, it's about knowing the right amount of information to share, in what way and to whom''
<img style='object-fit: cover; object-position: 100%' src='https://www.duarte.com/wp-content/uploads/2_Communicate-Data-to-Lead.png' width=700 height=700>
!! Invest time in communication skills
* because there is skill gap of about 71%
* Looking for individuals who can use their gut to formulate a point of view about data and invent alternate future based upon their discoveries
* This skill gap is high specially for data science jobs
<img src='https://media-exp1.licdn.com/dms/image/C4D12AQHaksLmxD3STQ/article-inline_image-shrink_1500_2232/0/1566996283702?e=1623283200&v=beta&t=K3yJJ-QeI8XOik4DtkOt3Z3KDm8rtTsxFNqDerAEXgk' width=500>
This book will help ''craft a recommendation and inspire action using story telling techniques''
,,Tags: [[Book: Data Story]] | [[12 April 2021]],,
! Becoming a communicator of Data
!! Invest in data communication skils
* Bigger challenge of data is to ''drive-decisions''
!! Explain data through storytelling
* Skill threshold between exploring and explaining
** Exploring - feels like a detective
** Explaining - people consider beyond their paygrade about making recommendations.
* Making a recommendation requires - Judge Data $$\rightarrow$$ Was that expected? $$\rightarrow$$ Should we keep going or change course $$\rightarrow$$
* Making a recommendation comes with great responsibility and accountability
!! Become like a mentor in a story
* [[Mufasa]]: [[Simba]] or [[Alfred]] : [[Batman]] or [[Dumbledore]] : [[Harry Potter]]
* your job as a mentor is to provide timely and critical guidance to decision makers. Data is a magical tool that gets them unstuck on their journey
!! Three levels of Decisions Made from data
* ''Discrete'' - require only one single data point to come to a conclusion. Tactical and low-risk decisions.
* ''Operational'' - continuous analysis to gauge performance, often in real time. Make informed decisions by evaluating how data changes over time.
* ''Strategic'' - determine the future path of an organization, industry, and beyond. You use current data to project where you should go in the future
what leaders need from you is not just data, but an explanation as to what the action you’re proposing will mean for business outcomes.
!! Move into creative process
* Overreliance on data leads to [[Analysis Paralysis]]
* Good Recommendations = [[Data Analysis]] + Intuition + Imagination + Argumentation
* ''change workspace from where you crunch numbers to help get into creative process''
* Analytical process $$\rightarrow$$ proves a point
* Creative process $$\rightarrow$$ incites action
!! Cultivate your intuition
<<<
I like to be data-driven, but I don't ignore the human instinct element of it. I roll around in the data, get to know it and understand it really well and then make a gut based call, which is often supported by data and a lot of hard-to-articulate factors, as well
<<< [[Marissa Mayer]]
<<<
An approximate answer to the right problem is worth a good deal more than an exact answer to an approximate problem
<<< [[John Tukey]]
!! References
* https://www.linkedin.com/pulse/3-types-decisions-made-from-data-nancy-duarte/
,,Tags: [[Book: Data Story]]|[[12 April 2021]],,
! Communicating to Decision-Makers
!! Know your decision maker
* Book about making decisions to executives
!! Speak Shorthand
* use familiar verbiage to get your team onboard
!! Respect their time; Executives are busy
* Executives bear the emotional load of responsibility that would scare most people
!! Know how execs are measured
* They drive success through six primary levels of performance. If your recommendation involves improvement in results in one of these areas, it will likely to be approved
<img src='https://miro.medium.com/max/2148/0*sSvrZwCTITjgck3T' width=700>
!! Understand how execs consume information
* they have personal preferences
*
,,tags: [[Book: Data Story]] | [[12 April 2021]],,
! PySpark Basics - Tutorial 3
!!! 1. General functions
General functions that are quite similar to methods of pandas dataframes:
* `select()` : returns a new DataFrame with the selected columns
* `filter()` : filters rows using the given condition
* `where()` : is just an alias for filter()
* `groupBy()` : groups the DataFrame using the specified columns, so we can run aggregation on them
* `sort()` : returns a new DataFrame sorted by the specified column(s). By default the second parameter 'ascending' is True.
* `dropDuplicates()` : returns a new DataFrame with unique rows based on all or just a subset of columns
* `withColumn()` : returns a new DataFrame by adding a column or replacing the existing column that has the same name. The first parameter is the name of the new column, the second is an expression of how to compute it.
!!! 2. Aggregate functions
* Spark SQL provides built-in methods for the most common aggregations such as `count()`, `countDistinct()`, `avg()`, `max()`, `min()`, etc. in the `pyspark.sql.functions` module. These methods are ''NOT'' the same as the built-in methods in the Python Standard Library, where we can find `min()` for example as well, hence you need to be careful not to use them interchangeably.
* In many cases, there are multiple ways to express the same aggregations. For example, if we would like to compute one type of aggregate for one or more columns of the DataFrame we can just simply chain the aggregate method after a `groupBy()`. If we would like to use different functions on different columns, `agg()` comes in handy. For example `agg({"salary": "avg", "age": "max"})` computes the average salary and maximum age.
!!! 3. User defined functions (UDF)
* In Spark SQL we can define our own functions with the `udf` method from the `pyspark.sql.functions` module. The default type of the returned variable for UDFs is ''string''. If we would like to return an other type we need to explicitly do so by using the different types from the `pyspark.sql.types` module.
!!! 4. Window functions
* Window functions are a way of combining the values of ranges of rows in a DataFrame. When defining the window we can choose how to sort and group (with the `partitionBy` method) the rows and how wide of a window we'd like to use (described by `rangeBetween` or `rowsBetween`).
!! Code
!!! 1. Initiate Session
```python
from pyspark.sql import SparkSession
from pyspark.sql.types import StringType, IntegerType
from pyspark.sql.functions import udf, desc, asc
from pyspark.sql.functions import sum as Fsum
from pyspark.sql import Window
import datetime
import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
spark = SparkSession \
.builder \
.appName("Wrangling Data") \
.getOrCreate()
path = "data/sparkify_log_small.json"
user_log = spark.read.json(path)
```
!!! 2. Data Exploration
```python
user_log.take(5)
user_log.printSchema()
user_log.describe().show()
user_log.describe("artist").show()
user_log.describe("sessionId").show()
user_log.count()
user_log.select("page").dropDuplicates().sort("page").show()
user_log.select(["userId", "firstname", "page", "song"]).where(user_log.userId == "1046").collect()
```
!!! 3. Calculating Statistics by Hour
* Defined a `udf` to compute hours from epochtime
* Applied the `udf` using `withColumn` method
```python
get_hour = udf(lambda x: datetime.datetime.fromtimestamp(x / 1000.0). hour)
user_log = user_log.withColumn("hour", get_hour(user_log.ts))
songs_in_hour = user_log.filter(user_log.page == "NextSong").groupby(user_log.hour).count().orderBy(user_log.hour.cast("float"))
songs_in_hour.show()
```
!!! 4. Dealing with Missing values
```python
user_log_valid = user_log.dropna(how = "any", subset = ["userId", "sessionId"])
user_log_valid.count()
user_log.select("userId").dropDuplicates().sort("userId").show()
user_log_valid = user_log_valid.filter(user_log_valid["userId"] != "")
user_log_valid.count()
```
!!! 5. Identify Downgrades (Paid to Free)
* Find when users downgrade their accounts and then flag those log entries. Then use a window function and cumulative sum to distinguish each user's data as either pre or post downgrade events.
```python
user_log_valid.filter("page = 'Submit Downgrade'").show()
user_log.select(["userId", "firstname", "page", "level", "song"]).where(user_log.userId == "1138").collect()
flag_downgrade_event = udf(lambda x: 1 if x == "Submit Downgrade" else 0, IntegerType())
user_log_valid = user_log_valid.withColumn("downgraded", flag_downgrade_event("page"))
user_log_valid.head()
windowval = Window.partitionBy("userId").orderBy(desc("ts")).rangeBetween(Window.unboundedPreceding, 0)
user_log_valid = user_log_valid.withColumn("phase", Fsum("downgraded").over(windowval))
user_log_valid.select(["userId", "firstname", "ts", "page", "level", "phase"]).where(user_log.userId == "1138").sort("ts").collect()
```
!! References
* [ext[Spark Python API|https://spark.apache.org/docs/latest/api/python/index.html]]
,,[[07 July 2020]],,
[[Apache Spark]] has two abstractions
* RDDs - distributed collection of objects
* dataframes - distributed collection of tabular data
Two things change with Pyspark
* Immutability - old versions don't change, always get new reference
* [[Lazy Evaluation]] - computation happens when output is called
!! [[Pandas]] vs [[PySpark]]
''Loading a dataframe''
<<<
```python
df = pd.read_csv('mtcars.csv') # pandas
df = spark.read.options(header=True,inferSchema=True).csv('mtcars.csv')
```
<<<
''Viewing a DataFrame''
<<<
```python
df # pandas
df.show() #pyspark
df.head(10) # pandas
df.show(10) # pyspark
```
<<<
''Viewing Columns & datatypes'' - exactly the same
<<<
```python
df.columns
df.dtypes
```
<<<
''Rename Columns''
<<<
Individual columns can be renamed only on at a time
```python
# pandas
df.columns = ['a', 'b', 'c']
df.rename(columns = {'old':'new'})
# pyspark - need to create copy because immutable
df.toDF('a', 'b', 'c')
df.withColumnRenamed('old', 'new')
```
<<<
''Drop Columns''
<<<
```python
df.drop('mpg', axis=1) # pandas
df.drop('mpg') # pyspark
```
<<<
''Filtering''
<<<
same for pandas and Pyspark
```python
df[df.mpg < 20]
df[(df.mpg < 20) & (df.cyl == 6)]
```
<<<
''Adding Column''
<<<
Division by zero in pandas gives `inf` but it gives `NULL` in PySpark
```python
df['gpm'] = 1 / df.mpg
df.withColumn('gpm', 1/df.mpg)
```
<<<
''Adding Column''
<<<
```python
df['gpm'] = 1 / df.mpg
df.withColumn('gpm', 1/df.mpg)
```
<<<
''Fill na''
<<<
Same for both pandas and PySpark. But [[Pandas]] has much more options
```python
df.fillna(0)
```
<<<
''Aggregation''
<<<
Same for both pandas and PySpark. But [[Pandas]] has much more options
```python
df.groupby(['cyl','gear']).agg({'mpg':'mean', 'disp':'min'})
```
<<<
''Standard Transformations''
<<<
Could have used numpy in pandas but need to use PySpark built in function, so execution happens only in JVM and no python is used, which makes it fast.
```python
# pandas
import numpy as np
df['logdisp'] = np.log(df.disp)
# pyspark
import pyspark.sql.functions as F
df.withColumn('logdisp', F.log(df.disp))
```
<<<
''Row Conditional Statements''
<<<
Same for both pandas and PySpark. But [[Pandas]] has much more options
```python
# pandas
df['cond'] = df.apply(lambda r: 1 if r.mpg > 20 else 2 if r.cyl == 6 else 3, axis = 1)
# pyspark
import pyspark.sql.functions as F
df.withColumn('cond', F.when(df.mpg > 20, 1).when(df.cyl == 6, 2).otherwise(3))
```
<<<
''Using UDF for complex transformation if Python is required''
<<<
The output of udf must be deterministic
```python
#pandas
df['disp1'] = df.disp.apply(lambda x: x+1)
# pyspark
import pyspark.sql.functions as F
from pyspark.sql.types import DoubleType
fn = F.udf(lambda x: x+1, DoubleType())
df.withColumn('disp1', fn(df.disp))
```
<<<
''Merge/Join DataFrames''
<<<
In Pandas join refers to merging on a common index. Since no indices in PySpark, Hence, below
```python
#pandas
left.merge(right, on='key')
left.merge(right, left_on='a', right_on='b')
# pyspark - default: inner join
left.join(right, on='key')
left.join(right, left.a == right.b)
```
<<<
''Pivot Tables''
<<<
```python
#pandas
df.pivot_table(index = ['a', 'b'], columns = ['c'], aggfunc='sum', values='d')
# pyspark - default: inner join
df.groupBy('a','b').pivot('c').sum('d')
```
<<<
''Summary Statistics''
<<<
PySpark `describe` only outputs `mean, count, stddev, min, max`
```python
df.describe() #pandas
# pyspark
df.describe().show()
df.selectExpr('percentile_approx(mpg, array(.25, .5, .75)) as mpg').show()
```
<<<
''Histogram''
<<<
```python
df.hist() #pandas
df.sample(False, 0.1).toPandas().hist() # pyspark
```
<<<
''SQL''
<<<
Pandas has no [[SQL]] support. PySpark has a lot of sql support. Also, you can switch back and forth between sql and pyspark dataframes
```python
df.createOrReplaceTempView('foo')
df2 = spark.sql('select * from foo')
```
<<<
!! Best Practices
* Use built in functions `pyspark.sql.functions`
* Use the same version of python and packages on cluster as driver. One way ensure this is to use `conda` environments
* Check out the built-in UI of spark at `http://localhost:4040/`
* Run notebooks off cluster using SSH ports - Jupyterhub
* Spark MLlib - equivalent of [[scikit-learn]]
!! What not to do
* Try to iterate through rows - it doesn't work
* Use `df.limit(5).toPandsa()` rather than converting first `df.toPandas().head()`
!! If things go wrong
* Don't panic, read the error, google and stackoverflow
!! References
<iframe width="560" height="315" src="https://www.youtube.com/embed/XrpSRCwISdk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,Tags: PySpark | [[28 August 2021]],,
* python package for exploring and preparing datasets
* `eda` module to explore datasets
* Create Report with `create_report(df)` where `df` is pandas dataframe
* [[Kaggle notebook prepared|https://www.kaggle.com/sumitkant/exploring-dataprep-package?scriptVersionId=71724479]]
!! Refrences
* [[User Guide|https://docs.dataprep.ai/user_guide/eda/introduction.html]]
,,Tags: [[15 August 2021]],,
Easy dataset exploration with [[Google]]'s tool for dataset search. It is a search engine that finds datasets hosted all over the web.
https://datasetsearch.research.google.com/
,,[[13 February 2022]],,
!! Main Ideas
* Generalists fare better in this world that demands specialists
* Starts with the stories of Tiger Woods (Specialized from the birth - 10,000 hours of practice) and Roger Federer (Specialized later in Tennis but played lot of sports early on)
* Specialized from early on better ''for kind learning environments'' where the moves are constrained and feedback is immediate or quick - Generalists fare better in ''wicked learning environments'', where feedback is not delayed and there are a lot of different variables at play - generalists can adapt if situations become different
* DeepBlue, AlphaGo, AlphaZero - surpassed human level intelligence - called tactical advantage of playing lot of moves - Humans are better for strategic advantage
* [[Raven's Progressive Matrices|https://en.wikipedia.org/wiki/Raven%27s_Progressive_Matrices]] have increased in general for everybody - people have gotten better at classifying the world through abstract concepts than pre-modern counterparts
<hr>
!! Summary
* Former [[Prime Minister]] of [[Iceland]]
* Identified by the [[Time Magazine]] as on of 25 people to blame for the [[2008 Financial Crisis]]. He let the balance sheet of banks to baloon to more than 10x of Iceland's [[GDP]]
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
DEAP is a novel evolutionary computation framework for rapid prototyping and testing of ideas.
Dear Data is a book by Giorgia Lupi and Stefanie Posavec who have tracked their lives for one year. Each week they selected a theme to track their routines and share their experiences via drawings on a post card. They sent each other these postcards with legends across the continent.
!!! Why this book?
Instead of using data just to become more efficient, we argue we can use data to become more humane and to connect with ourselves and others at a deeper level
Specialization on Decentralized [[Finance]] by [[Duke University]]
!! About DeFi
* Why are [[Savings]] rate 0 or negative? Why does it take to 3% to swipe a [[Credit Card]]? Why are borrowing rate so high? Why is the transfer of [[Money]] expensive, slow and insecure? Why do we need to [[Bail Out]] the institutions that caused the [[2008 Financial Crisis]]? Why does [[Stock]]s take 2 days to settle?
* [[Decentralized Finance]] is an emerging disruption. We transact among peers via [[Smart Contract]]s.
* No delay in [[Transaction]] settlement
* No middle person making a large spread
* Current [[Financial System]] is opaque. DeFi is transparent
!! About the Specialization
* [[Course 1: Decentralized Finance (DeFi) Infrastructure]]
** history of DeFi
** DeFi Foundations - [[Blockchain]], [[Cryptocurrency]], [[Smart Contract]]s, [[Oracle]], [[Stablecoins]] or decentralized Applications [[dApps]]
** Problems DeFi solves - limited access, centralization, interoperability,
* [[Course 2: Decentralized Finance (DeFi) Primitives]]
** [[Transaction]] Mechanics, [[Fungible]] and [[NFT]]s
** Custody supply adjustments
* [[Course 3: Decentralized Finance (DeFi) Deep Dive]]
** Credit and Lending - Feature maker DAO, Compounds and Aave
** Decentralized Exchange, UNiswap
** [[Derivatives]]
** [[Tokenization]] - wrapped [[Bitcoin (BTC)]]
* [[Course 4: Decentralized Finance (DeFi) Opportunities and Risks]]
** [[Smart Contract]] risk
** [[Governance]] and Oracle Risk
** Scaling Risk
** [[Decentralized Exchange (DEX)]] Risk
** Custodial Risk
** Environmental and Regulatory Risk
!! WHat this series is not?
* Does not teach [[Trading]] [[Bitcoin (BTC)]]
* Not renovation but rebuilding the current [[Financial System]]
* Course is based on [[DeFi Book]]
,,[[29 April 2022]],,
The latin root of the word decision - //cis// or //cid// - literally means "to cut" or "to kill."
!!! The more choices we are forced to make, the more the quality of out decision deteriorates
<img src='https://thedecisionlab.com/wp-content/uploads/2019/08/Untitled_Artwork-31-e1607701420447.jpg' width = 400>
Being off by a certain degree may not seem like a lot, but you can end up in a completely different spot in the long run. The quality of decision matters more overtime
!! Decision Intelligence
Turning information into better action at any scale, in any setting
''Decision making is a bit of an art, a lot of science and a skill that you can get better at''
! The most important lesson in decision analysis
!!! What is Decision?
''Irrevocable allocation of resources''. If you chose one option, the other options go away.
!! Outcome
How things turn out later. It has two components
# The quality of decision
# Randomness/Luck
If the outcome has always been good then it is that person is
# Very lucky - who never had a bad outcome ([[Survivorship Bias]])
# Inexperienced - Not enough chances for a bad outcome
!! Outcome Bias
> Society’s favorite form of mass irrationality
The outcome dictates future decisions. Don’t be oversensitive to the outcome. The decision can be good, but the outcome can be bad. This may trigger you to chose the worse decision next time leading to worse outcomes in the long run
__''Evaluating a decision''__
Always evaluate the decision on what was known at that time. Document for clarity, otherwise it leads to ''[[Hindsight]] Bias'' and you end up learning wrong lessons on what happens to you based on your decisions
# Which factors were considered?
# How did they gather information? - if the source and amount of information was right
!!! Why are some decisions more difficult than others?
# Number of options - Fewer options , simpler decision
# Similarity between options - No brainer vs very similar. Low stakes similar options is also easy.
# Clarity of objectives - criteria on which the decision is to be taken
# Cost - Low cost are easier - Cost of making mistakes, cost of carrying out the decision
# Reversibility - Ability to pivot and repivot and cost of pivoting
# Cognitive effort - Low effort decisions are easier. Holding a lot of things in memory to make the decision difficult
# Pressure - Low stress decisions are easier
# Emotional Triggers - Does the decision trigger you emotionally
# Information - Access to full and reliable information
# Risk and Ambiguity - No Risk and no ambiguity makes the decision easier
## Risk - Probability is known
## 2. Ambiguity - probabilities are unknown
# Timing - More free time makes the decision easier
# Number of decision makers - fewer stakeholders makes the decision easier - number of people making the decision and the consequences and effects of the decision onto the number of people
# Social affects - scrutiny
# Internal conflicts - When all incentives are aligned. E.g. Playing outside vs studying
# Adversarial Effects - Lack of competitors makes the decision easier
!! Goal Setting
What to think about in what order. Think about priorities and opportunities
* Forming priorities - Begin with non-priorities, that are not your concern and can help whittle down all of the options. How much do I care about this? Do others care about it as well
__''Goal setting mistakes''__
People often make them simultaneously
* setting goals that are too concrete - too easy to overfocus and follow that goal that might in turn harm your well being
* setting goals that are too vague - easy to deprioritize them
The trick is to have ''layers of goals that serve different purposes''
__''Three different kinds of goals''__
Wise to think in terms of all three when you are goal setting
# ''Outcome goals ''- The win that you are actually interested in. It might be vague and immeasurable. e.g. Be healthy as possible
# ''Performance goals ''- Aspirational north start that helps you stay motivated. Measurable and under your control if realistic
# ''Process goals ''- Measurable and fully under your control if realistic. **Never allow the process goal to be the most important thing. If it stops being useful to the outcome goal, then change the process goal. E.g. stop running if your knees hurt, will be harmful in the long run and jeopardizes the outcome goal**
!! Intuition and value of clairvoyance
''The Value of Clairvoyance'' is a term from decision analysis. How much effort, information and data to put toward in a decision
> //A good decision maker doesn’t underspend or overspend on a decision//
>
No need to have perfectionism on low value decisions
''How do you approach decision making?''
* Visualize reasonable best and reasonable worst case scenarios
* Value of clairvoyance - If someone knows the exact answer to your decision, what is the most in terms of resources that you are willing to spend towards to getting that perfect clarity. If the value is not high, use intuition and move on
** However practice it pedantically for low stake decisions to get better at decision making
* When intuition works? - Where you are an expert
* When do put more effort in decision?
** Decision lacks structure
** Lack of Expertise
** Have plenty of time
> ''A good decision does justice to what’s at stake''
!! The Hackable Human
About 100 years ago, people thought you could willpower your way through anything. But there has been subsequent research on ''[[Heuristic]]s & Biases'' Meaning we make systematically suboptimal irrational decisions
In a [[Parole Judges 2011 Study]] of parole hearings by judge, higher paroles were granted post lunch time. Because judges were hungry and it made the decision difficult.
This means pre-hack yourself, postpone the decision until the biological characteristics are better than suboptimal
!! Principal Agent Problem
there is a business that is owned by the principal but is run by the agent. Both of them can have conflicting incentives
* Create rules that constrains agents behavior against harming the interests of the principal’s incentives
** Principal (Long term You)
** Agent (Short term You)
!! Decisiveness
__''Why are people indecisive?''__
# ''Bad Habit ''- There is no such thing as NOT making a decision. By not making a decision, you are either implicitly delaying the decision or deprioritizing it
# Distracted by other decisions
# ''Grief and emotions ''- When all options are bad options, pick the least worst ones and move on. Grieve in parallel (RANT)
# ''Similar options ''- If the differences are tiny, don’t worry about getting everything optimal. Save energy for what matters more
!! Objective decision-making
!!! [[Confirmation Bias]]
What you already believe affects how your perceive information. Facts are perceived differently, remembered differently, pay different attention to it all based on what you already believe even before you see that number
> ''Don’t assume that data equals objectivity''
!!! [[Framing Effect]]
Presenting the exact same information in two different ways leads to different decisions. Changing wording and adding entirely irrelevant information can change behavior entirely
The principles should never be tossed out just because there are some numbers nearby
! Decision Intelligence Upgrades
!! Upgrade 1: Using data and technology
''Use data - not because of its objectivity but the value it brings due to memory''
* data is just a means to an end
* data allows us to have better memory, easily access and reshape it - similar to how books upgrade our memories basis the memories of people we have never met
Just like you don’t believe everything that you read, know that data may not always be true or useful
> Numbers never lie == If it’s written in a book it must be true
>
AI is based on the data ← data is made by the people ← objective biases of the human(s) to collect the data
''Most issues with AI biases is driven by which data to use''
!! Upgrade 2: Better questions
Analytics is how you get inspired to ask better questions. It is not decision making.
As a decision maker
* set priorities
* figure out which topics would be interesting
* determine which questions might we worth asking
* frame the decisions worth making
''Don’t punish your analyst for finding nothing interesting in the data. Direct them to go look elsewhere''
''The benefit of an analyst is in their speed. Analyst’s job is to maximize inspiration per minute''
Managing analytics is about investing time into exploration. There is no guarantee that you will find inspiration. Part of the process as a ''decision maker is to balance the cost and benefits of exploration''
!! Upgrade 2: Data-driven decisions
It is hardly the data that drives the decision. Turns out that decision-makers are prone to [[Confirmation Bias]]. That means that decision was already there. The numbers are just to support that decision.
> Decision-makers often use data to feel better about what they were going to do anyway
The more you slice the data - there more it is the breeding ground for confirmation bias
> ''When decision-makers lack fundamental skills, mathematics won’t fix it''
''If your decision-makers suffer from this, get to the most simplest analysis without wasting any time and money''. __The mathematical jiujitsu is generating nothing but dissipated heat XD__
!!! Antidote to confirmation bias
* Problem: move the goalposts after you analyze the data
* Solution: Set the goalposts in advance and resist the temptation to move them
!! Upgrade 4: Better answers
!!! how to frame a data-driven decision
# What would you do under no new information? - Selecting the default action
> The thing about statistical thinking is ''does the information change your mind?'' If your mind is set to nothing, then no need for complicated stuff
# What would you do will full information - easy as the data would reveal which decision would be better. Need to think of all possible outcomes
# What would you do in case of partial information - Approach your statistician. Don’t approach your statistician in the beginning, bad job at delegating it to them.
> Statisticians help you balance the probability of making the wrong decision, with the budget you are willing to pay for the data.
!! Upgrade 5: Decision automation
Data science is more interesting under uncertainty. Data science is the discipline of making data useful.
4 components in data science
# No decisions - Exploration stage - Analytics
# Few decisions - Statistics
# Many Decisions - AI/Machine Learning
# ''Negative one decisions - Data used for persuasion when you already know the answer. Data Storytelling, Data Journalism, Marketing → this is not decision making''
!!! Decision Automation
Using Ai models to automate the decisions for a large group of observations
* Clearly state the success criteria for automation task - framing questions, metrics
! Data-Driven Leadership
!! Group Decisions
''You need to practice the skill of diagnosing who the true decision makers are'' and how decision responsibility is shared among them
__''Benefits''__
* Protects against individual blind spots by adding new perspective
* Balances extreme tendencies
* Protects against biological factors like physical tiredness
* places guardrails on unwise decisions
* decisions more aligned with organization’s vision
__''Downsides''__
* ''Difficulty goes up'' - Good decision making requires each individual to have higher level of decision making skill - requires discussion and requires more skill than individual decision making. Not the same as one person making the decision and selling it to the organization
* ''Increases time''
* ''Lose the independence'' and unbalanced influence of extraneous factors like charisma, confidence, overconfidence and status.
** Notetaker in group settings has an outsized influence too
* ''Diffusion of responsibility'' - When responsibilities are not clearly assigned people may assume that their efforts are not needed, so they might sit back and relax making their participation a waste of effort. (''EXACTLY what happens in team meetings'')
__''Takeaways''__
* The more people involved in the decision, the higher their skills need to be.
* To create independence in the process - Limit the number of decision makers and increase the number of advisors.
!! The career-making question
Once you have identified the decision maker, how do you make yourself useful to the decision maker. Ask the career changing question -
> ''What would it take to change your mind?''
* First confirm whether there needs to be a decision making or the decision has already been made
* The question helps identify the default action and what it is set to
* Will tell the metrics and the criteria
__''Follow-up questions''__
* //How scared are you?// - Gets out the Value of Clairvoyance
* //How important is this decision?//
* //How badly could it go if we just tossed a coin?// - tells you about the relative difference between options
!! Building a data-driven culture
Prioritizing the effort on what to do with the data must not be left with inexperienced data scientists. Put breaks on their exuberance otherwise they will think that data is infinitely value and will do a lot of complicated yet very useless stuff
''Data Charlatans ''- They think that they are data driven but they are using complicated stuff to bamboozle you to buy your solution
> Without data, you are just a person with an opinion - Edwards Deming
__''With data you are still a person with an opinion - because people interpret facts in a way they want to interpret''__
Identify a data charlatan - Ensure their criteria was in place before they even looked at the data.
!! Barriers to organizational decision-making
* Data illiteracy - hard to communicate
* Lack of skill - experts hard to hire
* Lack of advocacy
* Responsibility spread unwisely
* Lagging overall investment in personnel, processes, data and infrastructure
> Most often, decision makers lack the skill, rather than the will to do the right thing
Get an understanding whether the decision making skills are well represented in the tell. That is an opportunity to either lend a hand or FLEE
!! Delivering value in a large organization
* Identify the decision makers at a higher level than you
* Understand their priorities
* Understand their information sources - data & who are they conversing with
* Understand - what would it take to change their mind?
* Understand what have been repeated and should be executed and optimized
* Work with decision makers to understand their needs and organizational needs
* Evaluate data sources and your org’s data infra
* Hire people and protect their careers - Data science tends to have leadership skill shortage
* Take principal agent problem and group decision making into account
* Perform good work and advocate for it
!! Are you a good decision maker?
A good decision maker
* Understands the difference between the outcome and a decision and knows how to mitigate outcome bias
* Understands confirmation bias and how to mitigate it
* Internalized the factors that make a decision easy vs hard
* Knows trick about the value of clairvoyance and knows how to accurately spend on a decision
* Remember decision framing and importance of having clarity on default action
* Can state what makes the decision data driven
* is able to identify the decision maker
* asks the career making question
* understand the importance of investing in tools and data
* Decision Tree-based models split the data multiple times based on a cutoff threshold at each node until it reaches a leaf node
* upper level nodes have higher [[Feature Importance]] than lower level nodes
!!! Pros
* Unlike [[Linear Regression]] or [[Logistic Regression]], these models work even when there are [[Feature Interactions]]. i.e. features have [[Correlation]]
* the cutoff point of a node in the Decision Trees provides counterfactual information—for instance, increasing the value of a feature equal to the cutoff point will reverse the decision/prediction
!!! Cons
* tree-based explanations cannot express the linear relationship between input features and output
* slight changes in input can have a big impact on the predicted output
* complex trees are challenging to interpret
!! Fit Model
```python
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=100 # child nodes
).fit(X,y)
```
!! Feature Importances
```python
model.feauture_importances_
```
!! Plot trees
```python
from sklearn import tree
tree.plot_tree(clf) # gives text representation
```
!!! Plot using [[graphviz]]
```python
dot_data = tree.export_graphviz(model, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph
```
<img src='https://scikit-learn.org/stable/_images/iris.png' width=300>
!!! References
* [[sklearn]] [[documentation|https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html]]
,,[[Decision Trees]],,
<embed src="https://drive.google.com/viewerng/viewer?embedded=true&url=https://yiqiaoyin.files.wordpress.com/2018/02/deep-learning-notes.pdf" width="1000" height="375">
* [[Deep Learning]] Playground using [[Streamlit]].
* No code just intuition based learning of deep learning algorithms
* Exploring playing with hyperparamters
* Already implemented models - Minimal training
,,Tags: [[Idea Book]] | [[05 June 2021]],,
This [[Book]] was written for anyone who wishes to explore deep learning from scratch or broaden their understanding of [[Deep Learning]]. Whether you’re a practicing machine-learning engineer, a software developer, or a college student, you’ll find value in these pages.
!!! Who is this book for?
* people with [[Python]] programming experience
* technically minded people who don’t code regularly will find this book useful as an introduction to both basic and advanced deep-learning concepts.
!!! Structure
* ''Part 1'': Part 1 is a high-level introduction to deep learning, providing context and definitions, and explaining all the notions required to get started with [[Machine Learning]] and [[Neural Network]]s
* ''Part 2'': Part 2 takes an in-depth dive into practical applications of deep learning in [[Computer Vision and ]][[<hr>]][[Natural Language Processing (NLP)]]
!!! References
* [ext[Live Book|https://www.manning.com/books/deep-learning-with-python#toc]] available
* [ext[Codes|https://github.com/fchollet/deep-learning-with-python-notebooks]] available at [[Github]]
:<iframe src="https://drive.google.com/file/d/1NdNcrXOMix4KUGAEDRao5dkE1iMadrIc/preview" width="700" height="300"></iframe>
!! Part I
Gives a brief introduction to Deep Learning & how to approach this [[Book]]. Also introduces Theano, TensorFlow, Keras and getting access to GPU using [[Amazon Web Services]]
<<tabs
"
[[Chapter - 01 - Deep Learning with Python]]
[[Chapter - 02 - Deep Learning with Python]]
[[Chapter - 03 - Deep Learning with Python]]
[[Chapter - 04 - Deep Learning with Python]]
[[Chapter - 05 - Deep Learning with Python]]
[[Chapter - 06 - Deep Learning with Python]]
[[Chapter - 07 - Deep Learning with Python]]
[[Chapter - 08 - Deep Learning with Python]]
[[Chapter - 09 - Deep Learning with Python]]
[[Chapter - 10 - Deep Learning with Python]]
[[Chapter - 11 - Deep Learning with Python]]
[[Chapter - 12 - Deep Learning with Python]]
[[Chapter - 13 - Deep Learning with Python]]
[[Chapter - 14 - Deep Learning with Python]]
[[Chapter - 15 - Deep Learning with Python]]
[[Chapter - 16 - Deep Learning with Python]]
[[Chapter - 17 - Deep Learning with Python]]
[[Chapter - 18 - Deep Learning with Python]]
"
"[[Chapter - 01 - Deep Learning with Python]]"
"$:/state/strollhometabs" "tc-vertical">>
,,[[Speciality Chemicals Segment]] | [[06 September 2021]],,
!! Reference
* [[DeepAR Forecasting Algorithm|https://docs.aws.amazon.com/sagemaker/latest/dg/deepar.html]]
!! Definition
<<<
DeepDream
is an artistic image-modification te
chnique that uses the representations
learned by convolutional neural networks. It
was first released by Google in the sum
mer of 2015, as an implementation written
using the Caffe deep-learning library
<<< [[Deep Learning with Python - François Chollet]]
<<<
DeepDream is an experiment that visualizes the patterns learned by a neural network. Similar to when a child watches clouds and tries to interpret random shapes, DeepDream over-interprets and enhances the patterns it sees in an image
<<< [ext[DeepDream - TensorFlow|https://www.tensorflow.org/tutorials/generative/deepdream]]
<<<
Deep Dream is a computer vision program created by Google engineer Alex Mordvintsev which uses a [[Convolutional Neural Network]] to find and enhance patterns in images via algorithmic pareidolia, thus creating a Dream-like hallucinogenic appearance in the deliberately over-processed images.
<<< [ext[Exploring Deep Dream using TensorFlow 2.0|https://medium.com/towards-artificial-intelligence/exploring-deep-dream-using-tensorflow-2-0-93ecd1091fa3]]
!! How it works?
* DeepDream is identical to convnet filter visualization technique done in reverse. Doing gradient descent on the input of the convnet in order to maximize the activation of a specific filter.
* The convnet used in the original DeepDream release was an Inception model.
```python
model = inception_v3.InceptionV3(weights='imagenet',include_top=False)
```
* Specifically, you’ll maximize a weighted sum of the L2 norm of the activations of a set of high-level layers.
** Layers that are lower in the network contain more-local, less-abstract representations and lead to dream patterns that look more geometric
** Layers that are higher up lead to more-recognizable visual patterns based on the most common objects found in ImageNet, such as dog eyes, bird feathers, and so on.
!!! Hyperparameters
* ''Step Size'' - Gradient ascent step size
* ''Num Octave'' - Number of scales at which to run gradient ascent
* ''Octave scale'' - Size ration between each scale
* ''Iterations ''- Number of ascent steps to run at each scale
* ''Max loss'' - if the loss grows by more than this number, interrupt the gradient ascent process to avoid ugly artifacts.
!! References
* [ext[DeepDream - a code example for visualizing Neural Networks|https://ai.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html]]
* [ext[Inceptionism: Going Deeper into Neural Networks|https://ai.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html]]
* [ext[DeepDream - TensorFlow | https://www.tensorflow.org/tutorials/generative/deepdream]]
* [ext[Deep Lucid Dreaming|https://towardsdatascience.com/deep-lucid-dreaming-94fecd3cd46d]] from [[Medium]]
[[AI]] is the new electricity. It has the potential to bring about the transformation of industries similar to electricity. Part of it is already being done by [[Deep Learning]]
''Specialization''
* [[COURSE1: Neural Networks & Deep Learning]]
* [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]
* [[COURSE3: Structuring Machine Learning Projects]]
* [[COURSE4: Convolutional Neural Networks]]
* [[COURSE5: Sequence Models]]
!! Resources
* [[Slide notes on Slideshare |https://www.slideshare.net/TessFerrandez/notes-from-coursera-deep-learning-courses-by-andrew-ng]]
* [[Deep Learning Notes in LATEX]]
* [[Programming Assignments|http://phylab.fudan.edu.cn/lib/exe/fetch.php?media=home:whyx:training:ml:programming_assignments_of_deep_learning_specialization_5_courses_1_.pdf]]
[[06 May 2021]]
* the best AI script writer and story generator.
* https://www.deepstory.ai/#!/
[[AI Businesses]] | [[AI copywriting]]
! Evolution
* Earliest method of [[Transaction]] was [[Barter]] - which was [[Peer-Peer (P2P)]] [[Technology]].
* Very inefficient, due to matching problem which was solved by introduction of [[Money]]
!! Purposes of Money
* Primary
** unit of account - way to compare value of goods and services
** Medium of Exchange (imp) - allows for non-barter transactions
* Secondary
** Store of value - goods could spoil, money wont
** Transfer of value or defer a value
!! Characteristics of Money
* durability - paper money not so much , but a system of recycling is present
* portability - ease of use. [[Gold]] is not very portable for large amounts
* divisibility - 1$ to 100 cents
* Uniformity - version printed last year and this year are of same value
* Limited supply - unlimited supply has zero value and can cause [[Hyper-Inflation]]
* Acceptability -
* Stability - if unstable, people will look for alternatives
!! History of Money
* 9000 BCE - [[Barter]] System - Very infficient
: <img src='https://d1rwhvwstyk9gu.cloudfront.net/2017/07/agriculture-in-ancient-times.jpg' width=300>
* 600 BCE - Introduced [[Gold]] coins in [[Lydia]]. They had tangible value. 70% of the gold is used in [[Jewelry]]
: <img src='https://coinweek.com/wp-content/uploads/2014/09/colosseo_lydia.jpg' width=300>
* 1290 - [[Marco Polo]] from [[China]] introduced the idea of Bank notes to [[Europe]]
: <img src='https://pbs.twimg.com/media/CLw24feUsAAY_Qh?format=jpg&name=small' width=300>
* 1871 - First [[Wire Transfer]] by [[Western Union]] - Fees was 3% even at that time. We have gone 150 years without changing the fee rate
:<img src='https://assets-global.website-files.com/5d7e7bbbcad517dd46cb55d3/5f1f813e1984d9987ea3abbc_westernunion.jpg' width=300>
* 1950 - [[Credit Cards]] were introduced by [[Diners's Club]]
:<img src='http://newnumismatics.weebly.com/uploads/4/1/3/2/41323823/4474661.jpg?331' width=300>
* 1967 - First [[ATM]] introduced in north [[London]] by [[Barclays]] Bank
* 1983- [[Bank of Scotland]] introduced telephone [[Banking]]
* 1994 - [[Internet]] Banking by Stanford Federal Credit Union
* 1997 - Contactless Payment introduced by [[Mobil]] (Speedpass) using [[RFID]]
* 2005 - Chip and Pin - with Credit cards - Pin not for [[United States]]
* 2008 - [[Bitcoin (BTC)]] introduced by [[Satoshi Nakamoto]] - Identity unknown
* 2014 - [[Apple Pay]] - Much more secure than chip and pin
* 2021 - All leading banks have [[Blockchain]] initiatives
** [[Office of Comptroller of Currency (OCC)]] grants permission to use [[Stablecoins]]
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[29 April 2022]],,
!! Where does [[Cryptocurrency]] value comes from?
!!! Story of Iraqi Swiss Dinar and Intangible Value
[[Iraq]] was divided into north (under [[Kurds]]) and south (under [[Saddam Hussein]]) post [[Gulf War (1990)]] - After which sanctions were applied to the south due to which Iraqi Swiss Dinars could not be imported, so Saddam Hussein created new printing facility in house and asked central bank for Iraq to recognize the new currency and gave 3 weeks time to replace Iraqi swiss dinar with the new one through banks. Iraqi swiss dinar was still being used as a currency in North. Due to overprinting, Saddam's currency inflated to 300 Dinars to 1 Swiss Dinar
''Iraqi Swiss Dinar had no official backing yet it was still being used as money - because people were willing to accept it''
[[USD]] is not being backed by gold since 1971. It has got tangible value because it is legal tender and must be accepted. [[United States]] moved from [[Manufacturing]] [[Economy]] to creating intangible value
Decentralized Finance opens up the possibility of returning to barter
,,Tags: [[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[30 April 2022]],,
!! 5 Problems with Centralized Finance
''1. Centralized Control''
* [[Banking]] system is highly concentrated, and large banks have significant influence
* Central national banks have control of [[FIAT]] Currencies
* Non-Financial centralization by tech-giants like [[Facebook]] are interested in using [[Cryptocurrency]] to save credit card fees
''2. Limited Access''
* 1.7 Billion people are unbanked and many more underbanked
* [[Entrepreneur]]s are limited to use [[Credit Card]]s to finance their business with fees close to 20% or more
''3. Inefficiency''
* Credit card swipe fees, [[Wire Transfer]] fees
* 2 day settlement for [[Stock]]s, slow transfer of funds
* No microtransactions
* It is easy to pay but difficult to get paid
''4. Lack of Interoperability''
* Siloed institutions
* In US, moving money from one bank to another is difficult
* [[Visa]] attempted to acquire [[Plaid]] - interoperable payment system
''5. Opacity''
* Marketing higher savings rate than other banks - may be doing because in distress - up to the regulators to keep monitoring these banks
!! Result of these problems is
''1. missed growth opportunities''
* Project ROI - 25%
* [[cost of capital]] - 24% (Credit Card debt)
* Result: Project does not get funded. These projects have potential to improve GDP growth which are stuck had <3% for developed economies
* Amount of [[Government]] debt / [[GDP]] ratio is at all time high - cannot pay back unless
** Taxes are raised - not stimulative for economic growth
** Print money - causes [[Inflation]]
** Increased Economic Growth -
Outcome is current financial system is locking the global economy into low growth environment
''2. Inequality of Opportunities''
* Projects should be financed based on the quality of idea and soundness of execution plan
* Unbanked can't contribute to economic growth
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[30 April 2022]],,
!! [[Fintech]]s are early Centralized Decentralized [[Finance]]
* Banks earn [[Spread]] by quoting different interest rates for loans and savings
* Another way to think about lending money is look at it as a customer matching problem - Two customers use the same bank can be matched to fund the other person - banks earn small fee for managing credit quality and worthiness (This will greatly reduce costs for customers but will also significantly reduce profits for banks)
* Pitch to Board of Directors of Big Bank - Innovation for customer matching algorithm to match customers, take small fee and remove spread - Difficult pitch for board to agree. ''But banks will hear this pitch because otherwise customers will go to fintech companies''
!! [[Dark Pool Trading]]
* [[Trading]] [[Stock]] on a designated platform - but was [[Peer-Peer (P2P)]]. Now almost half of stock trading is done on dark pools
* Paypal founded in 2000 as a way to speed up [[Payments]]. Other systems like [[Zelle]] are also being implemented - Problem is they are using the legacy banking structure
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[30 April 2022]],,
!! Bitcoin and [[Cryptocurrency]]
* [[Blockchain]] was invented in 1991 to keep track of stamping of documents
* [[Proof-of-work]] was invented in 2002 by [[Adam Back]] - was a task aimed at reducing junk mail, so the sender had to perform computation to send email to you ([[Spam]]ming would become difficult if an email is being sent to millions)
* [[Satoshi Nakamoto]] put together these ideas and introduced [[Bitcoin (BTC)]] as a [[Peer-Peer (P2P)]] electronic cash system
** Would be a [[Transaction]] Mechanism. First transaction was 10,000 Bitcoins for 2 Pizzas
** It is successful as a store of value and for very large scale transaction
* Idea of digital currency was there since 1980s, the big problem was Digital currency is similar to a digital photo or music, it can be replicated exactly.
** Double spend problem was removed with Blockchain tech - it is a decentralized ledger open for everyone to see
** Ledger was also distributed, replicated on nodes
** ''Algorithmic scarcity'' - total production capped at 21 Million. Currently 18Million present , last of the bitcoins will be generated in 2140
** User sovereignty - owner determines how to spend, nobody else does it for you
** High Portability - quick and cheap, no physical transfer
!! Comparison to [[FIAT]]
* [[USD]] is a pure fiat currency since 1971
* Economic conditions impact the value
* Fed has the ability to inflate
* Demand comes from
** Taxes
** purchase of goods in USD
** repayment of debt in USD (Incarceration if not accepted USD)
!! Bitcoin vs fiat
* scarcity is coded in the algorithm
* main fiat currencies are linked to they economy
!! [[Ethereum]]
* [[Ethereum]] was founded in 2015 by [[Vitalik Buterin]] and can run small program called [[Smart Contract]]. Contract will also run on all other nodes
* ''Ethereum is the backbone of decentralized finance''
!! [[dApps]]
* Mobile app is centralized. Decentralized App puts together peers to interact directly through a [[Smart Contract]]
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[30 April 2022]],,
# Both early barter trading and modern day DeFi are peer-to-peer systems of market exchange - ''True''
# Which of the following is NOT a primary or secondary role of money?
#* Unit of account
#* ''Method to earn interest''
#* Medium of exchange
#* Store of value
#* Transfer of value
# Iraqi Swiss Dinars were an example of a currency that had intangible value - ''True''
# Which of the following are TRUE about centralized finance as per the lecture, "Brief overview of CeFi problems"?
#* Every person without exception has access to banks -'' most unbanked or severely unbanked''
#* ''Fund transfer are not instantaneous''
#* Costs of transacting are low - ''3% credit card swipe''
#* Perfect interoperability of commercial banking institutions - ''centralized structure restricts interoperability''
# Why do small entrepreneurs have to fund their businesses with credit cards?
#* ''Size of these entrepreneurs’ businesses is too small to interest institutional channels of finance.''
#* They want to use their credit card so they can build credit history by increasing the volume of their credit card transactions
#* They are afraid that the banks may fail.
#* Although credit card borrowing is costly, the return on business is always higher than that; thus, profits are mostly assured.
# Which of these early DeFi ideas made trading stocks cheaper?
#* 3-day settlement
#* ''Dark pools''
#* [[Demat]] accounts
#* Brokers
# Which are the problems the plague centralized finance? Hint: You can choose more than one.
#* ''Limited access''
#* ''Centralized control''
#* ''Inefficiency''
#* ''Opacity''
#* ''Lack of interoperability''
# Most current Fintech initiatives use legacy banking infrastructure? ''- True''
# Which ideas did Satoshi Nakamoto combine to introduce Bitcoin?
#* Proof of stake
#* ''Blockchain''
#* Mining pools
#* ''Proof of work''
# Which of the following statements are FALSE with respect to the bitcoin blockchain?
#* ''Mistakes can be edited and fixed''
#* Censorship resistant
#* Computational platform for smart contracts
#* Allows for portability of Bitcoin
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[07 May 2022]],,
!! What is Blockchain?
* [[Blockchain]] is a software protocol was invented by Haber and Stornetta in 1991 not by [[Satoshi Nakamoto]]
* Blockchain is not [[Bitcoin (BTC)]]. And there can be multiple blockchains.
* multiple parties can operate under shared assumptions and data without trusting the party. Trust is an idea central to legacy financing. Trust is within the blockchain technology
* Blockchain allows easy audit - retrace the steps of transactions or the lifecycle of manufactured products
!! Basic Structure
* ''No single point of failure''. Blockchain is a distributed ledger. There is extreme redundancy. Copies available at all nodes. If one block were to get corrupted, block in that node will be replaced with a working copy
* Blockchain is also ''immutable''. You can add but not edit
* A block has a fingerprint called [[Cryptographic Hash]]. The last line fingerprint of the previous block is replicated and added as the first line when the new block is generated
<img src='https://www.researchgate.net/profile/Osama-Hosam/publication/331204356/figure/fig1/AS:729783038119937@1551005243313/Blockchain-contains-a-chain-of-blocks-Each-block-has-a-list-of-transactions-nonce.ppm' width=700>
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[07 May 2022]],,
* [[Cryptographic Hash]]ing is a
!! Simple hashing [[Algorithm]] example
* Want to send an email - "Hello"
* Encode the words using (a = 1,b = 2, ... z= 26), so 8 5 12 12 15
* Multiply the numbers = 86,400
* Post this number on website. The receiver opens the email with the text - perform the hash and check the number sender posted on website
* If the number does not match, the message was corrupted
* ''Con'': This has is too simple and can lead to [[Collision]] meaning two words with different meanings can have the same has (hello = ohell)
* hashing does not mean [[Encrypt]]ion
!! [[SHA 256]]
* Hashing Algorithm used by [[Bitcoin (BTC)]]
* the output of the algorithm is 256 bits or 64 alphanumeric characters no matter how big the input
* The output of string [[Doctor Strange]] is "49b5695e9e4b9e5d0cb2f27e7177449ff94bd960d81134930ca52897682ce983"
* An 8GB movie would also have 64 character long hash
http://emn178.github.io/online-tools/sha256.html
!! [[Keccak-256]]
* Hashing algorithm used by [[Ethereum]]
* The string "Doctor Strange" will have different output this time
These kind of hashes does not suffer from collision. These are currently being used to send and receive emails
!! How do [[Proof-of-work]] blockchains work?
* don't want adversary to corrupt a block and also propagate through the entire network by changing all future blocks
* [[Miner]]s gather transactions that are sitting unverified in memory pool. Miners check whether the person spending has the token to spend
* Miners check this by adding [[Nonce]] to the data and cycle through nonces to get a hash with a lot of leading zeros. There are trillions of cycles and the cost is enormous
* No one person or even a nation state can overpower the network
* The computing power are also specialized - [[Mining Rig]]
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[07 May 2022]],,
!! What can [[Blockchain]] technology do?
* allows us to verify ownership
* efficient exchange of ownership without middle person
* No categorization is relevant - retailer, banker, customer
!! Why is Blockchain Special?
* [[Blockchain]]s have consensus protocols to determine what is considered as truth
* Blockchain is immutable - mistakes can be reversed
* Resistant to tampering
!! [[Proof-of-work]]
* [[Bitcoin (BTC)]] and [[Ethereum]] uses [[Proof-of-work]]
* An attacker can theoretically come up with 51% of the network with their version but is extremely unlikely. And the value of the network will plummet
* Main [[Cryptocurrency]]s like [[Bitcoin (BTC)]] and [[Ethereum]] have strong blockchain networks that couldn't be attacked, but smaller ones are vulnerable
!! Mining
* Many different miners trying to find a [[Cryptographic Hash]] with lot of leading zeros. The reward is new [[Bitcoin (BTC)]] + earn transaction fees. This reward is halved in every 3 years
* How difficult is mining?
** [[Duke University]]'s Antminer S17 performs 53 Trillion hashes per second ~ 0.002% of hashing power of the network
** Can be centuries you win a lottery if you mine alone
** Be part of [[Mining Pool]] with the entire pool winning a lottery and that being distributed across the network
* [[Proof-of-work]] is both strength and weakness of [[Blockchain]]
** Strength - because of security
** Weakness - electricity cost is enormous
* [[Ethereum]] will move to different consensus technology called [[Proof-of-stake]] which is more energy efficient, likely to happen in 2022. [[Bitcoin (BTC)]], likely to stick to [[Proof-of-work]]
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[07 May 2022]],,
!! What is [[Cryptocurrency]]
* is a digital token - [[cryptography]]icaly secured and transferred
* Asymmetric key [[cryptography]] is a crucial component - owners have a private key
* Public key is derived from private key - one way operation - used to determine an address
* Receiver generates a random number -> pass through algorithm to get public key -> convert to address -> Sender signs over crypto to the receiver. The private keys are not transferred, they are generated at random every time to carry out the transaction
!! What if you lose your private key?
* Private key is a [[QR Code]] that you can scan and spend the crypto. Don't share private keys in public
* Keep it unconnected to the internet, USB or hard copy
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[07 May 2022]],,
!! Smart Contracts
* [[Ethereum]] is an example of [[Smart Contract]] platform. ''A smart contract is a code that can create and transform arbitrary data or tokens on top of the blockchain of which it is a part''
* This allows the users to trustlessly encode rules over any type of transaction or create assets from smart contracts
* The value of [[Ethereum]] is much more than what it is trading for, because it does not count all of the associated tokens that are associated with [[Ethereum]]
* Bitcoin is not worth more than Ethereum because it doesn’t count all of the associated tokens with [[Ethereum]]
!! Trustless
* Standard business contracts like in [[Options Trading]] are easy to code
* REdundant: It runs on every node on the Ethereum network. An infinite loop would be a disaster for a network because every node will run it
* Finance is the low hanging fruit
!! Gas
* Pay a [[Gas]] fee for a transaction for [[Smart Contract]]s
* Gas fees help protect attacks on the system with infinite loop code, know as the [[Halting Problem]]
* when it runs of gas, the smart contract stops. Prevents attackers from taking down the network because of the gas fees
* [[Turing Complete]]
* Gas required for simple contract is low and it increases with complexity
* 1 GWEI = 1 billionth of an [[Ether (ETH)]]
* Price of gas depends on network congestion
** [[Miner]] gets the transaction fee - another incentive
** Sending more gas than needed, residual refunded. But less gas, you lose that gas value because the program has run halfway
* Increasing gas prices creates of problem of increased transaction cost - problem to solve as simple transactions get expensive
* [[Ethereum Improvement Protocol 1599]] - Burning of gas to take ETH out of circulation
* [[Ethereum Request for Comment (ERC)]]
** [[ERC 20]] - Delivers a token interface. Most popular. Fungible token. Each token has same value
** [[ERC 721]] - [[NFT]]. The value is unique to that token. Deeds.
!! [[Oracle]]s
* Blockchain is doesn’t use outside information
* [[Oracle]] is a way to bring information from outside a [[Blockchain]] construct to the [[Blockchain]]. Example, price of gold, or stock. Information should be reliable
* Challenge to get reliable oracle
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[07 May 2022]],,
* Volatility of [[Bitcoin (BTC)]] and [[Ether (ETH)]] is ~ 5x the volatility of [[Stock Market]]
* [[Stablecoins]] are intended to maintain price parity with some target asset like gold, USD. It is only as stable as the underlying asset
!! [[Stablecoins]]
* Idea is not new
* Banks issued their own currency backed by Public stocks.
:<img src='https://slideplayer.com/slide/17312458/100/images/16/Boone+County+Bank+note%2C+Lebanon%2C+Indiana+During+this+era+the+U.S.+had+no+central+bank+and+paper+money+was+issued+by+a+variety+of+private+banks.+Some+was+even+issued+by+manufacturing+and+retail+companies.+This+money+was+backed+by+gold%2C+silver%2C+real+estate%2C+stocks%2C+bonds%2C+and+a+wide+variety+of+other+assets..jpg' width=400> <img src='https://i.ebayimg.com/images/g/8NAAAOSw1ZBbh~qR/s-l300.jpg' width=300>
** Recent example - Euro Dollar - no longer subject to federal regulations but linked to dollar. US dollar bank deposits held outside of US. Massive daily market volume
!!! [[Fiat-Collateralized Stablecoins]]
* Deposit $100 in the vault, company will mint 100 stable coins
* [[Tether (USDT)]] has the largest Market Capitalization, even higher than [[Bitcoin (BTC)]].
** Complicated history. No checking whether the reserves are there or not
** [[USDC]] is the second largest and backed by [[Coinbase]] and [[Circle]]
** Both these coins are centralized
!!! [[Crypto-Collateralized Stablecoins]]
* [[MakerDAO]] DAI is most popular.
* Collateralized with [[Cryptocurrency]]. Truly [[Decentralized]]
* Requires over-collateralization. 100 coins, $150 deposits as collateral
!!! [[Non-collateralized stablecoins]]
* Not backed by underlying asset, uses algorithmic expansion and contraction of supply to shift the price to peg
!!! Decentralized Applications [[dApps]]
* look and feel like a normal mobile app - but live on a centralized [[Smart Contract]] platform
* Applications are permissionless and censorship-resistant. Nobody can ban you
!!! [[Decentralized Autonomous Organization (DAO)]]
* The Organization is an [[Algorithm]]
* No CEO, No Financial Statements, No TAX
* Rules are encoded in [[Smart Contract]]s
* Governance Token - gives the owner some percentage vote on the future outcomes
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[18 May 2022]],,
[[Course 1: Decentralized Finance (DeFi) Infrastructure]]
! Inefficiency
!! Volumes and Frictions
* DeFi can accomplish financial transactions with high volumes that generally would be large burden for an organization
* The size of transaction does not matter. It takes the same amount of effort. Though the high gas prices make it inefficient for smaller transactions, a problem that can be solved in future
* the [[Smart Contract]]s in DeFi are reusable
!! No organizational Overhead
* No middleman. No brick and mortar. The contract once written lives on the [[Blockchain]] forever
!! Keepers
* [[Keepers]] are external participants that are incentivized to maintain a service DeFi protocols such as monitoring a collateral.
* the Keepers are paid market price for their service, often structured as an auction
* Pure open competition
!! [[Forking]]
* Forking allows you to copy an existing code base and make adjustments according to your usecase
!! [[Vampirism]]
* Vampirism is making an exact/near exact copy of the DeFi platform and providing high incentives to switch to the copy often designed to poach liquidity and users. In the end users get the best deal
* Risk - Rewards could be flawed, and people may lose money.
* Risk - May lead to vulnerability
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[20 May 2022]],,
! Limited Access
* DeFi gives unbanked and underbanked the ability to operate in the internet of value
* 18M unbanked in [[United States]]
* centralized finance provides access to the most profitable customers, while DeFi allows access to its entirety of its financial infrastructure regardless of the wealth or geographic location. DeFi does not have labels (Retailer, Banker, Institutions) they are all the same
!! Yield Farming
* FD interest rates are not even covering inflation, due to high fixed cost
* Take a coin and deposity into a [[Liquidity Pool]], a reward for doing it, Reward can also be deposited somewhere - money multiplier. Savings rate are much higher than traditional banks pay and meets or beats inflation
* Risk - Some interest rates can be unrealistic
!! [[Initial DeFi Offering (IDO)]]
* Small number of companies are listed on stock exchange due to limited access
* Launch a token and set a floor of an exchange rate decided by the first liquidity provider
** Say a token named DFT has total supply of 2million
** The user can make each DFT worth 0.1 USDC by opening the market with 1M DFT & 100,000 USDC
** An ERC-20 token holder can purchase DFT which drives up the price. The user receives all of the trading fees
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[21 May 2022]],,
!! Traditional Finance is Opaque
* Transparency of CeFi is with some regulators, however DeFi is transparent for everyone
** It is possible to read contracts
** Eases threat of legal burdens due to fine prints
** [[Solidity Codes]] - contract codes used for [[Smart Contract]]s
* Users can fork the contract and improve it for their use case, if unfavourable
* [[Staking]]
** Incentivizes for good behavior
** Punishes for bad behavior
!! Token Contracts
* Transparent. 100s of 1000s of tokens linked to [[Ethereum]] [[Blockchain]]
* Supply is fixed at the time of launching token. Where as in CeFi money printing can happen at any time and in certain scenarios leading to hyperinflation
[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[21 May 2022]]
!! Monopoly in traditional finance
* Govt institutions have monopoly over things like [[Inflation]]. However in DeFi, open protocols have control. They have transparency and are immutable. These are built into [[dApps]]
* There could be some decentralization, as the authors of code can make special previledges for the author. But this is known to everyone and can always fork and improve
!! Trade-offs
* In CeFi, during issues, we can act quickly. Sometimes can cause over-reaction. DeFi requires pre-planning of every nuance to be baked into a smart contract
[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[21 May 2022]]
* CeFi has unintegrated products like Unsecure and slow wire transfers
* DeFi legos changes that but using two simple protocols and combining them together into a single protocol. These can interact with existing protocols with each other
!! Tokenization for interaction
* Can wrap a token inside a token
* defi relies on shared interfaces, apps can directly plug into other's assets, repackage and subdivide positions as needed
!! Tokenization of Assets
* Illiquid assets like pieces of art, land can be create and easily traded. For example [[NFT]]s
* Introducing new assets opens up the markets and allows for diversification and unlocks value
* Bundles can also be created for tokens. For example, a token can represent a stock on stock market, can bundle them together in an [[ETF]] equivalent on blockchain, which can be traded and will have lower [[Expense Ratio]]s
!! Challenges in tokens
* Tokenization for virtual assets is easy
* For hard assets - requires auditing, legal restrictions and cost of maintaining that collateral
!! Pluggable derivative assets
* An asset created with a [[Smart Contract]] that is linked to another asset potentially on another platform
!! [[Compound Protocol]]
* Token on a token
* Allows for lending
* represented with cToken like. derivative of [[Ether (ETH)]] token will be called [[cETH]]
* Can be used in place of base asset
* cETH is a derivative of ETH
!! Networked Liquidity
* Users can deposit tokens and earn interest
* the share of deposit can be converted into another token which can also be put to work. It can also act as a collateral
[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[21 May 2022]]
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[22 May 2022]],,
!Myths
!! 1. DeFi is smaller than CeFi and it will never overcome it
* True. Defi is < 1% of CeFi, but the vector of growth is positive. The questions is not if, but how long will it take to overcome
* It is in the interest of incumbents like banks to delay, postpone and excessively regulate DeFi
!! 2. DeFi is difficult to use and will never have widespread adoption
* True it is difficult to use now, but user experience will improve overtime. It is similar to what the internet used to be in 1980s with clunky emails and file transfer rates
!! 3. [[Cryptocurrency]] is mainly used for Illegal activity
* Yes early on crypto was used for illegal activity, like buying drugs on [[Silk Road]] on the [[Dark Web]]
* Main cryptos are not totally anonymous but cash is. Cash can be easily used to for illegal activity
** 70% of the [[United States]] currency is in $100 bills
** [[El Chapo]] - mexican drug lord cash stash
::<img src='https://m0.joe.ie/wp-content/uploads/2014/02/22Billion.jpg' width=300>
!! 4. Govt. [[Central Bank Digital Currency (CBDC)]] will put cryptos out of business
* It is in favor of the govt to launch CBDCs because
** it is impossible to evade taxes
** Instant monetary policy
** But also, every transaction has central bank's overwatch
** You can be censored, meaning your money could disappear if govt wishes
!! 5. [[Blockchain]]s are not secure. Govt hacked the hackers in [[Colonial Pipeline Ransom]]
* Attack on [[Blockchain]] network is technologically infeasible
* Govt, did not hack but they accessed the computers on which the private keys were stored. Hackers made the mistake of storing private keys in a computer connected to the internet
!! 6. All cryptos are [[Bubble]]s. They have no fundamental value
* Not true
* [[Stablecoins]] provide tangible value while being pegged to a dollar, or being collateralized
* Other cryptocurrencies offer services/utility like smart contracts which provide intangible value
!! 7. Mining is a waste of energy
* [[Proof-of-work]] is both strength and a weakness
* Strength because it provides unprecedented security but weakness because it is envirnmentally reckless
* [[Proof-of-stake]] is much more environmental friendly and [[Ethereum]] is already making a move to shift to proof-of-stake
!! 8. Cryptos are too volatile to be useful
* True cryptos are volatile, but there are stocks as well the are volatile more than [[S&P 500]] Index
* Two things that drive volatility
** Uncertainty over the actual value of [[Bitcoin (BTC)]] etc
** Relative illiquidity - a large scale could drive the price
!! 9. [[Quantum Computing]] will render the whole space irrelevant
* Quantum computing is irrelevant for [[Cryptographic Hash]]ing. [[Proof-of-stake]] is even more irrelevant
* One issue is, quantum computing can derive private keys from public keys. But there exists Hashing algorithms that are Quantum computing resistant
!! 10. Transactions are slow and expensive and DeFi is not going anywhere
* True for now but not for long
!! 11. You need a smartphone and internet to make this work and billions does not have either
* Internet will be commoditized in future - will be made essentially free
* You can get smartphone now for as low as $20 and will get cheaper in the next couple of years
!! 12. Pump and Dump and [[Ponzi Scheme]]s making DeFi unattractive for investors
* Ponzi schemes are not new to crypto. They exist everywhere
* Pump and dump stocks are a common phenomenon as well
* The idea is to have some discipline while investing. If you don't understand, don't invest
* [[Investment]] discipline
** Does it solve a problem?
** Is the problem big enough to be solved?
** Is DeFi the right way to solve the problem?
** What is the competitive landscape
** What are [[Barriers to Entry]] or Moats
** Does the idea scale horizontally and vertically
*** Horizontally meaning - the idea can be implemented across different markets and even globally
*** Vertically meaning - Same technology can be used for different application
!! 13. DeFi is hard to understand
* True. But taking this course. It is also rapidly changing
!! 14. DeFi is too risky
* If you want risk free, invest in [[T-Bills]] which does even give an [[Inflation]] beating return
* Every new technology is risky
!! 15. Defi to early, so i should wait
* Get in early as the upside post development will significantly reduce
* Not a good reason to wait
!! 16. DeFi requires degree in [[Computer Science]]. I don't have it, so i'll avoid
* Most prominent people in DeFi space does not have a degree in Computer science
* What is important which as important in any field is [[Creativity]]. The execution is important as well, you may not be able to write the code, but creativity is more important
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[22 May 2022]],,
!! Vision
* Secure, efficient, immutable and indisputable transactions and functionality through [[Smart Contract]]s
* Removing middleman and putting them in more productive jobs
* A near zero transaction costs - can lead to instant payments, payment per usage, don't have to do monthly bills
* Possibility of creation of new assets
* Trust shifted from central parties to the network
* [[Tokenization]] of everything
* [[Financial Inclusion]] of the unbanked
,,[[Course 1: Decentralized Finance (DeFi) Infrastructure]] | [[22 May 2022]],,
The bought shares sit in the Depository Account or DEMAT account. This is maintained electronically by two companies
* Central Depository Services Limited (CDSL)
* National Securities Depository Limited (NSDL)
Their main job is to ''safe keep securities (shares) and settlement against all client transactions''
* [[Depository]] is not client facing
* Depository Participant to open and maintain a DEMAT account on your behalf
* [[Zerodha]] is a depository participant registered with CDSL
* A way of finding human needs and creating new solutions using the tools and mindsets of design practioners
* Design thinking approach means paying attention to more than just aethetics. It is a methodology
!!! Design Thinking @ IDEO and d.school
*Seeking the sweet spot of feasibility, viability and desirability as you take into account the real needs and desires of your customers
!! Summary
* Uses difference in the performance of two models as a measure of quantifying interactions - interaction is considered significant if the difference between performance of the unrestricted and restricted models is more than $$\Delta$$
* ''Unrestricted Model'' - ''allowed to model a given interaction''
* ''Restricted Model '' - ''not allowed to model this interaction''
** If the unrestricted model performs much better, then we conclude that modeling the interaction was crucial for good performance and hence there is an interaction between the variables
* This approach is applicable to real world datasets
* Used custom [[Loss Function]]
* Defined custom way of variable split selection
* Stresses on [[Feature Selection]] - For identifying interaction between v1 and v2, if v3 correlates with v2, v1 may pick v3 if v2 is removed thus nullifying any interaction because the performance will not drop (hence need to remove v3 before detecting interactions)
** ''Fast Selection'' - Using # of times the variable is used in the node as a measure to select top 50 features
** ''Slow selection'' - Remove variable one by one until the performance drops by $$\Delta = 3 * \sigma $$, where $$\sigma $$ is the [[Standard Deviation]] of estimated distribution
!! General Insights
* statistical interaction describes only the effect of variable values on the response function and should not be confused with any dependencies between the variables themselves, e.g. [[Correlation]]
* Log is a [[non-linear transformation]] which can add extra interactions not present in the original data
* [[RMSE]] penalizes absolute deviation from the true response value. For example, predicting 25 birds instead of 20 will be penalized as heavily as predicting 5 birds when there were none. This is not desirable because the estimation error for the smaller response value is much more serious.
* [[Partial Dependence Plot]]s should be used for visualization only, when we already have confirmed the presence of interaction in the data by comparing restricted and unrestricted models.
!! Reference
[[Detecting and Interpreting Variable Interactions in Observational Ornithology Data|http://www.cs.cmu.edu/~daria/papers/rmbo_full.pdf]]
,,Tags: [[Feature Interactions]] | [[08 August 2021]],,
* when data has trend multiplicative with time
$$
y_t = \beta_0 + \beta_1 t + \epsilon_t \\
\epsilon_t \sim N(0, \sigma^2)
$$
:<img src='https://www.aptech.com/wp-content/uploads/2019/09/ts-pp-trending.jpg' width=500>
* Can be transformed into [[Stationary time series]] by subtracting trend
:$$\tilde{y}_t = y_t - \beta_0 - \beta_1t = \epsilon_t$$
A book by [[Marcellus Investment Managers]]. Marcellus is founded on the premise that ''to understand the stock, you must understand the company''
This book lays out the underlying principles of successful [[Investing]], learn about deceptive [[Accounting]] practices, learn the nature of competitive advantage and the sources by which these are sustainable and take control of your own [[Wealth Management]]
,,[[Saurabh Mukherjea]] | [[12 October 2022]],,
* A [[Regression]] technique to estimate the differential impact of the treatment
!! References
* [[Introduction To The Difference-In-Differences Regression Model|https://timeseriesreasoning.com/contents/introduction-to-the-difference-in-differences-regression-model/#:~:text=The%20DID%20model%20is%20a,group%20of%20individuals%20or%20things.]]
!! Deodrant vs Perfumes
* Deodrant suppresses body odor while perfumes enhance body odor
!! Types by Concentration
* higher concentration longer lasting
* Diluted by alcohol
<img src='https://cdn.shopify.com/s/files/1/1833/7915/files/Heres-the-Difference-Between-EDP-EDT-and-EDC-in-Perfumes.png?v=1504701013'>
!! Notes
* Top Note (30-45 minutes)
* Mid/Base Note - Longer lasting
!! Categories
* Fruity
* Citrus
* Woody
!! Clones
* Copy of Fragrances by Companies like ARMAF/ZARA
* Creed Aventus (30K/100ML) - Copy by Armaf - [[Club de Nuit Intense|https://armafperfume.com/collections/perfume-1/products/armaf-club-de-nuit-intense-pure-parfum-for-man-150ml]] (80% to 85% replica)
* Blue de Chanel - Clone by Armaf - [[Tag Him|https://armafperfume.com/products/armaf_tag_him_pour_homme_eau_de_toilette_100ml?_pos=1&_sid=f49a5ad21&_ss=r]]
!! Application
* on skin preferred. On clothes if perfume causes skin irritation or allergy
* apply Where body temperature is high - neck, armpits
* Night Time - 4 sprays - 2 on the side of the neck, one on the back f the neck and one just above wrist and tap (do not rub)
* Day time - 6 sprays - night time + one on chest and one opposite to elbows
!! For my stand-up act, I require help from a video, But before that I need to put some disclaimers so that I don't get fired
!! Content Warning
The following video contains material that can be offensive to some audiences. Viewer discretion is advised.
!! Trigger warning
It's not my fault if you get triggered by this
!! Photosensitive warning
This video contains flashes of light that could trigger people with visual sensitivities.
!! One more disclaimer
This video is work of fiction. Even if they are real they are entirely based on fiction. Trust me!
!! You have to swear that you would not sue me
You have the following options
* Least favorite person in this webex
* Amber Heard
<img src='https://storage.googleapis.com/afs-prod/media/5ab5981e0f6e42fd829496553c836022/3000.jpeg' width=500>
!! My cover [[YouTube]] video that failed to load - My original submission
!! Closing
On that terrible disappointment - Thank you!
!! For those of you who are disappointed
This is what you get when you ask a data analyst/scientist to forcefully do stand-up
<img src='https://miro.medium.com/max/1000/1*xDIevNE7HEMiJQVTYg0qDQ.png' width=500>
* Free [[MOOC]]s
* https://www.discudemy.com/
[[Free Resources]]
!! Initiate pyspark session
```python
import pandas as pd
import numpy as np
import pyspark
from pyspark.sql import SparkSession
import datetime
import os
sqlContext = SparkSession \
.builder \
.appName("PysparkProphet") \
.config("spark.executor.memory", "10g") \
.config("spark.driver.memory", "10g") \
.config("spark.executor.cores", "5") \
.config("spark.sql.shuffle.partitions","1000") \
.config("spark.network.timeout","1200") \
.config("spark.dynamicAllocation.enabled","true") \
.config("spark.shuffle.service.enabled","true") \
.config("spark.dynamicAllocation.minExecutors","50")\
.config("spark.dynamicAllocation.maxExecutors","100")\
.config("spark.authenticate.enableSaslEncryption","true")\
.config("spark.authenticate","true")\
.config("spark.sql.orc.filterPushdown","true") \
.config("spark.sql.parquet.binaryasstring","true") \
.enableHiveSupport() \
.getOrCreate()
```
!! Load Data
```python
df = pd.read_csv('file.csv')
sp_df = sqlContext.createDataFrame(df)
```
* ''Note'': `sp_df` can be a spark dataframe loaded directly from hive table containing 3 columns `pk, ds, y`
!! pandas_udf
* function - this is just a big groupby function over all pk computing the function - `ForecastCustomerSpend()`
```python
from pyspark.sql.functions import col, pandas_udf, PandasUDFType
from fbprophet import Prophet
@pandas_udf("pk string, ds string, trend double", PandasUDFType.GROUPED_MAP)
def ForecastCustomerSpend(history_pd):
pk = list(set(history_pd.pk))[0]
prophet_basic = Prophet()
prophet_basic.fit(history_pd[['ds','y']])
future_pd = prophet_basic.make_future_dataframe(periods=12, freq='M', include_history=False)
future_pd = pd.to_datetime(future_pd.ds.dt.strftime('%Y-%m-01')).to_frame()
results_pd = prophet_basic.predict(future_pd)[['ds','trend']]
results_pd['ds'] = results_pd.ds.astype(str)
results_pd['pk'] = str(pk)
return results_pd[['pk','ds','trend']]
```
!! Invoke Function
```python
distributed_df = sp_df.groupby("pk").apply(ForecastCustomerSpend)
distributed_df.write.format("com.databricks.spark.csv").options(delimiter = ',', header = True).save(os.path.realpath(save_path), mode='overwrite')
```
,,[[fbprophet]] | [[PySpark]] | [[Pandas]],,
* Dividends are cash payouts made to distribute profits made by the company to stockholders
* Company may pay dividends in case of extra cash and less growth opportunities
* Dividend percentage payout is expressed as percentage of [[Face Value]].
: `% payout = (Dividend * 100%)/Face Value`
!!! Dividends Cycle
# Dividend Declaration - Annual General Body meeting declares dividends will be distributed
# Record Date - Identifying share holders eligible for distribution. This is at least 30 days after the declaration
# Ex-dividend date - 2 days before the record date. Shareholders should have bought shares on or before this date. Shares are said to be CUM DIVIDEND till this date.
# Payout date - Money credited to the account linked with [[DEMAT Account]]
Stock goes ex-dividend, usually stock drops to the extent of dividend paid.
<<<
!! Info
* founder, Murali Krishna Prasad Divi
* supplies of active pharmaceutical ingredients (APIs) — raw materials used to make medicines
!! Business Structure
* Focus on small number of big partners - US Based Merck,
* Most contracts with double digit market share
* While a clutch of Indian drug makers have floundered on the US Food and Drug Administration (FDA) inspections, Divi’s has resolved issues within a shorter time
!! API Industry
* China is the biggest API player, with 30% market share globally at USD59 billion
* API market to grow at 8% CAGR in 6 years
!! Competitive Advantages
* Divi’s leads the global market in nine generic APIs. The revenue mix is maintained roughly at 60:40 for generic APIs and custom chemical synthesis (CCS).
* Cost leadership
* Automation focussed
!! Weaknesses
* narrow Management bandwidth - vision limited to 10 years - only hires fresh graduates
* Trust on people within the same region
!! Hiring
* Hiring young chemistry graduates has helped Divi’s in two ways. First, it can get them at a relatively low pay and second, while giving an opportunity to grow, it inculcates the same culture in its employees
!! Philosophy
* ''We are never satisfied with the technology we developed. Is there a better way of doing it? Will somebody come up with one? With raw materials better than us? Will somebody give less solvent than us, [or] increase the yields better than us?” he said. “If [it is to be done], why not today? That is the philosophy we follow.''
!! Projections
* 14%-17% CAGR in the API by 2025
* Based on the capex plans underway, we expect earnings growth to sustain at over 20% CAGR over the next three to five years - Divis by B&K Securities
<<< [ext[Divi’s Labs won big in a low-value segment with a curated portfolio. Will its dream run sustain? | https://economictimes.indiatimes.com/prime/pharma-and-healthcare/divis-labs-won-big-in-a-low-value-segment-with-a-curated-portfolio-will-its-dream-run-sustain/primearticleshow/84597729.cms]]
* World's first Robot [[Lawyer]]
* https://donotpay.com/
[[AI Businesses]]
A dot map is a map used to illustrate geographic densities and distributions of a phenomena, where one dot has a value of a certain number. Below is one famous dot map of Dr. John Snow, who plotted the location of deaths from cholera in central London for September 1854.
* Deaths are marked by dots
* 11 water pumps are marked by crosses
<img src='https://www.sapanalytics.cloud/wp-content/uploads/2017/02/cholera-snow-map.jpg'>
[[Data Visualization Techniques]]
* [ext[Kaggle article | https://www.kaggle.com/general/74235]]
* [ext[Medium article | https://towardsdatascience.com/setting-up-kaggle-in-google-colab-ebb281b61463]]
```python
!pip install kaggle
!mkdir .kaggle
import json
token = {"username":"sumitkant","key":"1ec48678bd582ede493b33a0823c5476"}
with open('/content/.kaggle/kaggle.json', 'w') as file:
json.dump(token, file)
!cp /content/.kaggle/kaggle.json ~/.kaggle/kaggle.json
!kaggle config set -n path -v{/content}
!chmod 600 /root/.kaggle/kaggle.json
!kaggle datasets list
```
* Download Datasets
```bash
!kaggle competitions download -c 'name-of-competition'
```
* Unzip Datasets
```bash
!mkdir train
!unzip train.zip -d train
```
!! Gradient Boosting - Theory
* [[Decision Tree]]s work well with [[non-linear]] data - easily prone to [[Overfitting]] if we build deep decision trees - which is why we build ensembles
* [[Gradient Boosting]] is an ensemble technique
** Fit shallow model
** Fit another model on residuals and repeat
* How [[XGBoost]] works
** Objective = Training Loss + Regularization Term
** Final prediction is the sum of prediction of all the trees
** Regularization term consists of lambda ([[L1 Regularization]]), alpha ([[L1 Regularization]]L2 Regularization]])& gamma
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/5CWwwtEM2TA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!! Week 1 Learning Objectives
* Explain why Machine Learning strategy is important
* Apply satisficing and optimizing metrics to set up your goal for ML projects
* Choose a correct train/dev/test split of your dataset
* Define human-level performance
* Use human-level performance to define key priorities in ML projects
* Take the correct ML Strategic decision based on observations of performances and dataset
!!! Week 2 Learning Objectives
* Describe multi-task learning and transfer learning
* Recognize bias, variance and data-mismatch by looking at the performances of your algorithm on train/dev/test sets
<<tabs "
[[WEEK1:01 Why ML Strategy?]]
[[WEEK1:02 Orthogonalization]]
[[WEEK1:03 Single number evaluation metric]]
[[WEEK1:04 Satisficing and Optimizing Metric]]
[[WEEK1:05 Train Test and Dev set distributions]]
[[WEEK1:06 Size of dev and test sets]]
[[WEEK1:07 When to change dev/test set and metrics]]
[[WEEK1:08 Human level performance]]
[[WEEK1:09 Avoidable Bias]]
[[WEEK1:10 Understanding Human Level Performance]]
[[WEEK1:11 Surpassing human level performance]]
[[WEEK1:12 Improving your model performance]]
[[WEEK1:13 Andrej Karpathy Interview]]
[[WEEK1:QUIZ1 Bird Recognition in the City of Peacetopia (Case Study)]]
[[WEEK2:01 Carrying out error analysis]]
[[WEEK2:02 Cleaning up incorrectly labelled data]]
[[WEEK2:03 Build your first system quickly and then iterate]]
[[WEEK2:04 Bias & Variance on mismatched data distributions]]
[[WEEK2:06 Addressing Data Mismatch]]
[[WEEK2:07 Transfer Learning]]
[[<hr>]]WEEK2:08 Multi Task Learning]]
[[WEEK2:09 End-to-End Deep Learning]]
[[WEEK2:QUIZ1 Autonomous Driving (Case Study)]]
" "[[WEEK1:01 Why ML Strategy?]]"
"$:/state/strollhometabs" "tc-vertical">>
Dropout is a regularization technique for neural network models proposed by Srivastava, et al. in their 2014 paper [ext[Dropout: A Simple Way to Prevent Neural Networks from Overfitting|https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf]]. Dropout is a technique where ''randomly selected neurons are ignored during training'', in other words, dropped-out randomly.
This means that their contribution to the activation of downstream neurons is temporally removed on the forward pass and any weight updates are not applied to the neuron on the backward pass.
The effect is that the ''network becomes less sensitive to the specific weights of neurons''. This in turn results in a network that is capable of better generalization and is less likely to overfit the training data. ''Dropout is only used during the training of a model and is not used when evaluating the skill of the model''.
!!! 1. Using Dropout on Visible layer
A dropout value of 0.2 means one in five inputs will be randomly excluded from each update cycle.
```python
from keras.layers import Dropout
def create_model():
model = Sequential()
model.add(Dropout(0.2, input_shape = (60,)))
model.add(Dense(60, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
return model
```
!!! 2. Using Dropout on Hidden Layers
```python
def create_model():
model = Sequential()
model.add(Dense(60, activation = 'relu', input_shape = (60,)))
model.add(Dropout(0.2))
model.add(Dense(30, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
return model
```
!!! 3. Tips For Using Dropout
* Generally use a small dropout value of 20%-50% of neurons with 20% providing a good starting point. A probability too low has minimal e↵ect and a value too high results in under-learning by the network.
* likely to get better performance when dropout is used on a larger network, giving the model more of an opportunity to learn independent representations.
* Use dropout on input (visible) as well as hidden layers. Application of dropout at each layer of the network has shown good results.
* Use a large learning rate with decay and a large momentum. Increase your learning rate by a factor of 10 to 100 and use a high momentum value of 0.9 or 0.99.
* A large learning rate can result in very large network weights. Imposing a constraint on the size of network weights such as max-norm regularization with a size of 4 or 5 has been shown to improve results.
!!Use the following steps
# Compute absolute value of correlation between features in df
# Get upper triangle since [[Correlation]] matrix is a mirror image across diagonal
# identify variables with corr > threshold
# drop variables identified in step 3
```python
cor_matrix = df.corr().abs()
upper_tri = cor_matrix.where(np.triu(np.ones(cor_matrix.shape),k=1).astype(np.bool))
to_drop = [column for column in upper_tri.columns if any(upper_tri[column] > 0.95)]
df1 = df.drop(df.columns[to_drop], axis=1)
```
!! References
* [[How to drop out highly correlated features in Python?|https://www.projectpro.io/recipes/drop-out-highly-correlated-features-in-python]]
[[Adam Grant]] calls the [[Awestruck Effect]] as Dumbstruck effect because the sage-on-stage often preaches new thoughts but rarely teaches how to think for ourselves. Thoughtful lectures might prosecute inaccurate arguments and tell us what to think instead
,,[[Adam Grant: Think Again]] | [[14 November 2021]],,
* The Dunning–Kruger effect is a hypothetical cognitive bias stating that people with low ability at a task overestimate their ability
<<<
The first rule of Dunning-Kruger Club is you don't know you're a member of Dunning-Kruger Club
<<< [[Adam Grant: Think Again]]
<img src='https://cdn.slidemodel.com/wp-content/uploads/dunning-kruger-effect-curve.png' width=700>
* Get your business online in 30 seconds
* The AI-powered platform for solo business owners. Generate a website, automate your marketing, and manage your finances. Try it free for 30 days.
* https://durable.co/
[[AI Businesses]]
[[Research Paper]] on [[word2vec]] by [[Google]]
!! Context
* [[n-gram]] is simple and can be trained on all available data but it has its limitations and scaling up will not increase progress
** limited availability of specialized datasets for example [[Speech Recognition]] and [[Machine Translation]]
** [[Neural Network]] based [[Language Model]]s significantly outperform [[n-gram]] models
!! Goal
To introduce techniques that can be used for learning high-quality word vectors from huge data sets with billions of words, and with millions of words in the vocabulary.
It is possible to train high quality word vectors from simple architectures compared to popular NN models
!! Previous Work
Representation of words as continuous vectors
* [[Neural Network Language Model (NNLM)]]
* Learn Word Vectors + construct NNLM - this paper extension of first part
!! Model Architectures
For continuous representations of words
* [[Latent Semantic Analysis (LSA)]] - proposed distributed approach better than this
* [[Latent Dirichlet Allocation (LDA)]] - computationally expensive on large datasets
Compare different model architectures by first defining model complexity - the goals is to maximize accuracy while minimizing computational complexity
Training Complexity = Epochs * # Words in training * Q
!!! 1. Feedforward Neural Net Language Model (NNLM)
* Input $$\rightarrow$$ Projection $$\rightarrow$$ Hidden $$\rightarrow$$ Output
* Q = Params from input to Projection (N X D) + Parameters from Projection to Hidden (N X D X H) + Parameters from Hidden to Output (H X V)
* V = Size of Vocabulary (in millions)
* N = Number of previous words encoded
!!! 2. Recurrent Neural Net Language Model (RNNLM)
* No need to specify context length
* Theoretically, [[RNN]]s can create more complex representation of words than Feed Forward NNs
* Input $$\rightarrow$$ Hidden $$\rightarrow$$ Output
!! Parallel Training of [[Neural Network]]s
* Uses [[Mini-batch gradient descent]] asynchronus
* [[Adagrad]] - Adaptive learning rate procedure
!! Less Computationally Complex Models - New Log Linear Models
* [[Continuous Bag of Words (CBOW)]]
** Predicts the missing center word given surrounding words
** Order of words in the history does not influence the projection
** Context half-size = 4 (best performing)
** Input $$\rightarrow$$ Projection $$\rightarrow$$ Output
** All vectors projected in the same position are averaged
** Q = N X D + D x $$\log_2$$(V)
* [[Continuous Skip-Gram Model]]
** Predicts the surrounding words in a certain range, given a center word
** Q = C x (D + D X $$\log_2$$(V))
** C = maximum distance of the words
!! Results
!!! 1. Measurement
* Can understand the outcomes of word-vectors intuitively
* Can also ask analogy based questions
* Syntactic Word Relationship text - contains 5 types of semantic questions and 9 types of syntactic questions a total of 8869 semantic and 10675 syntactic questions.
* Performance is measured using accuracy metric. Since the words can have multiple correct answers, 100% accuracy is unlikely
!!! 2. Maximizing Accuracy
* Trained using 6B Google news corpus
* [[Vocabulary]] size = 1M most frequent words
* increment in Computational complexity through increasing number of dimensions = increment in Computational complexity through increasing amount of training data
!! References
* [[Google Code C++ implementation of CBOW and Skip-Gram Model|https://code.google.com/archive/p/word2vec/]]
EfficientNet is a type of [[Convolutional Neural Network]] architecture designed to improve accuracy and be efficient at the same time.
There are [[Three scaling Dimensions of a CNN]]: ''depth, width'' and ''resolution'' on which a CNN can be scaled on. Efficient net proposes a compound scaling framework of scaling these dimensions while keeping the [[FLOPS]] in check.
<img src ="https://1.bp.blogspot.com/-oNSfIOzO8ko/XO3BtHnUx0I/AAAAAAAAEKk/rJ2tHovGkzsyZnCbwVad-Q3ZBnwQmCFsgCEwYBhgL/s1600/image3.png" width ="600">
!! Proposed Compound Scaling
* ''(ɸ) Compound coefficient''- a user-specified coefficient that controls how many resources are available
* ''α, β'', and ''γ'' specify how to assign these resources to network depth, width, and resolution respectively
<img src="https://miro.medium.com/max/1128/1*iYn6_BvI2mFk6rls8LopVA.png" width="300">
<<<
In a CNN, Conv layers are the most compute expensive part of the network. Also, [[FLOPS]] of a regular convolution op is almost proportional to ''d, w², r²'', i.e. doubling the depth will double the FLOPS while doubling width or resolution increases FLOPS almost by four times. Hence, in order to make sure that the total FLOPS don’t exceed 2^ϕ, the constraint applied is that (α * β² * γ²) ≈ 2
<<<
!! Architecture
The authors obtained their base network by doing a [[Neural Architecture Search (NAS)]] that optimizes for both accuracy and FLOPS. The architecture is similar to [[M-NASNet]].
* BASE NETWORK
<img src = "https://miro.medium.com/max/1400/1*OpvSpqMP61IO_9cp4mAXnA.png" width="600">
* The [[MBConv]] block is nothing fancy but an [[Inverted Residual Block]] (used in [[MobileNetV2]]) with a [[Squeeze and Excite]] block injected sometimes.
* Total four parameters to search for: α, β, γ, and ϕ
** Fix ϕ =1, assuming that twice more resources are available, and do a small grid search for α, β, and γ. For baseline network B0, it turned out the optimal values are α =1.2, β = 1.1, and γ = 1.15 such that α * β² * γ² ≈ 2
**Now fix α, β, and γ as constants (with values found in above step) and experiment with different values of ϕ. The different values of ϕ produce [[EfficientNet]]s B1-B7.
!!! Reference Link
* [ext[EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks|https://medium.com/@nainaakash012/efficientnet-rethinking-model-scaling-for-convolutional-neural-networks-92941c5bfb95]] on [[Medium]]
,,[[3 July 2020]],,
Higher level cognitive areas involved in executive function and planning get fatigued. Will power is a limited resource and we run low on it, just like a tank of fuel. The tank is refueled by eating something like a sandwich or a fruit.
A [[Psychology]] term for the tendency of the problem solvers to employ only familiar methods even if better ones are available.
!! References
* [[David Epstein: Range]] - Chapter 8
* An EEG is a method for eavesdropping on he overall electrical activity that arises from activation of [[Neurons]].
* Small electrodes are placed on the scalp to measure [[Brain waves]]
* German Psychologist and psychiatrist Hans Berger recorded the first human EEG in 1924
* Several types of brain waves
:<table>
<tr>
<th>Wave</th>
<th>Frequency</th>
<th>Association</th>
</tr>
<tr>
<td>Delta</td>
<td>< 4Hz</td>
<td>Sleep</td>
</tr>
<tr>
<td>Theta</td>
<td>4 - 7 Hz</td>
<td>Deep sleep, relaxation and visualization</td>
</tr>
<tr>
<td>Alpha</td>
<td>8 - 13 Hz</td>
<td>Relaxed and calm</td>
</tr>
<tr>
<td>Beta</td>
<td>13 - 38 Hz</td>
<td>Active thinking and problem solving</td>
</tr>
</table>
* using the embed tag in `html`.
* embeds google drive pdf viewer to view pdf
!! Alternative 1
```html
<embed src="https://d2z0k43lzfi12d.cloudfront.net/blog/vcdn302/wp-content/uploads/2019/02/stick-with-it-challenge_en-3.pdf" width="500" height="375">
```
!! Alternative 2
```html
<iframe src="http://docs.google.com/gview?url=http://www.bci2experian.com/library/BCI-Experian-SBCS-Sample.pdf&embedded=true" style="width:718px; height:700px;" frameborder="0"></iframe>
```
!! Alternative 3
```html
<embed src="https://drive.google.com/viewerng/viewer?embedded=true&url=http://example.com/the.pdf" width="500" height="375">
```
Example : [[Stick with it Workout Challenge]]
!! Problem
Solving the global [[Infant Mortality Rate]]. Each year 15M premature and low-birth-weight babies are born. A million of them often perish within one 24 hours of birth. The biggest preventable cause of death is ''Hypothermia''. These babies are so tiny that don't have enough fat to regulate their own body temperature. In India nearly half of the world's low-birth-weight babies are born. Hospital incubators can save lives but the cost $20,000 each.
!! Solution
An easy to use medical device that costs 99 percent less than a traditional baby incubator and has the potential to save millions of newborns in developing countries.
Part of ''Extreme'' - a multidisciplinary melting pot taught by [[Stanford Graduate School of Business]] professor Jim Patell, in which students from departments all over the university come to the [[d.school]] to develop solutions for daunting, real world problems.
<iframe width="560" height="315" src="https://www.youtube.com/embed/sMXnhrWgS_k" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Tendency to undervalue things that we don’t own and overvalue things that we own
,,[[06 April 2021]],,
<<<
coined by French [[Economist]] J.B. Say in 1800 to denote one who shifts economic resources out of an area of lower into an area of higher yield
<<< [[The 4-Hour Workweek 01: My story and why you need this book]]
Excess Post-Exercise Oxygen Consumption is a phenomenon which happens when red blood cell (RBCs) are primed to burn calories alternatively called afterburn. This can be triggered by [[interval training]].
EPOC refers to the elevation in metabolism (rate that calories are burned) after a [[Workout]] session ends. The increased metabolism is linked to increased consumption of oxygen, which is required to help the body restore and return to its pre-exercise state
Buying shares of publicly listed companies
[[Error Analysis]] is a [[Responsible AI]] toolkit designed by [[Microsoft]] that enables you to get a deeper understanding of [[Machine Learning]] model errors.
!! Summary
<<<
* Identifies cohorts of high errors than overall benchmark by creating a [[Decision Tree]] or Error [[Heatmap]]
*
<<< [[https://erroranalysis.ai/]]
<img src='https://raw.githubusercontent.com/microsoft/responsible-ai-widgets/main/img/responsible-ai-toolbox.png' width=900px>
!! Installation
```bash
pip install raiwidgets
```
!! Running
```python
from raiwidgets import ErrorAnalysisDashboard
ErrorAnalysisDashboard(
dataset=X_test,
true_y=y_test,
features=feature_names,
pred_y=predictions,
model_task='regression',
metric='mean_absolute_error'
)
```
!! Example
* [[Google Colaboratory]] - [[Notebook|https://colab.research.google.com/drive/1s41acaPT7BHXPGMNPlaJfBarsGMBSjXG]]
* [[Github Responsible AI toolbox|https://github.com/microsoft/responsible-ai-toolbox#getting-started]]
* [[Github page for Error Analysis|https://github.com/microsoft/responsible-ai-toolbox#getting-started]]
! Leadership Essentials
[[LinkedIn]] CEO [[Jeff Weiner]] uses the acronym ''FCS''
* ''F''ewer things done better
* ''C''ommunicating the eight information to the right people at the right time
* ''S''peed and quality of decision making
!! Clarity == Success
* Team thrives with clarity
* Non-essential managers try to drive teams doing too many things.
<style type="text/css">
table.tableizer-table {
border:0;
font-size: 12px;
border: 1px solid #CCC;
}
.tableizer-table td {
padding: 4px;
margin: 3px;
border:0;
border-bottom: 1px solid #CCC;
}
.tableizer-table th {
border:0;
background-color: #104E8B;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><td></td><th>Non-Essentialist</th><th>Essentialist</th></tr></thead><tbody>
<tr><td>''MINDSET''</td><td>Everything to everyone</td><td>Less but better</td></tr>
<tr><td>''TALENT''</td><td>Hires people frantically. Creates "Bozo Explosion"</td><td>Selective in talent. Removes people who hold the team back</td></tr>
<tr><td>''STRATEGY''</td><td>Pursues a straddled strategy where everything is a priority</td><td>Defines essential intent by answering the question, If we could do onlyy one thing, what would it be?</td></tr>
<tr><td>''EMPOWERMENT''</td><td>Ambiguity in roles. Decisions are capricious</td><td>Focuses on each team member's highest goal and contribution</td></tr>
<tr><td>''COMMUNICATION''</td><td>Talks in code</td><td>Listens to get what is essential</td></tr>
<tr><td>''ACCOUNTABILITY''</td><td>Checks in too much or checks out altogether. Sometimes does both: Disrupting the focus of the group or being absent from the group</td><td>Checks in with people in a gentle way to see how he/she can remove obstacles and enable small wins</td></tr>
<tr><td>''RESULT''</td><td>A fractured team that makes milimeter of progress in million directions</td><td>A unified team that breaks through next level of contribution</td></tr>
</tbody></table>
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[11 April 2021]],,
! The [[Essentialist]]
<<<
Stay! But do what you would as a consultant and nothing else. And don't tell anyone.
<<<
The feeling of
* Saying "no" to someones' request
* Both overworked and underutlized
* Majoring in minor activities
* always in motion and never getting anywhere
* trying to learn it all, do it all
* new obsession everyday
requires us to move to way of an ''Essentialist''
!! The way of [[Essentialist]]
<<<
//Weniger aber besser//(German) - meaning //Less but better//
<<<
The way of the [[Essentialist]] is
* ''relentless pursuit of less but better''.
* about pausing constantly to ask, "''Am I investing in the right activities?"''.
* not about how to get more things done, but about how to get ''right'' things done
* making the wisest possible investment of your time and energy in order to operate at your highest point of contribution by doing only what is essential
* ''living by design, not by default''
* getting rid of obvious time wasters, but cutting some really good opportunities as well
:<img src='https://headhearthand.org/uploads/2014/06/Screen-Shot-2014-06-18-at-6.02.52-PM.png' width =200>
!! The Model
:<img src='https://i.pinimg.com/originals/cc/13/4f/cc134fe695cbbaeef7fd2f702fc77218.png'>
!! Why Non-[[Essentialism]] is everywhere
* ''Too many choices'': We have lost our ability to filter what's important due to overwhelming number of choices. This is called [[Decision Fatigue]]
* ''Too much social pressure'': Information Overload + Opinion Overload (because hyperconnected world, lower barriers to share opinions)
* ''Idea that you can have it all'': This myth peddled for so long. embedded in corporations and sold in advertising. It's damaging and leads to increased choices and expectations and multiple [[Priority]](ies)
!! Organizing Life's Wardrobe
* ''1. EXPLORE & EVALUATE''
** T-Shirt - Do i look great in it? Do i love it?
** Activity - Will this activity or effort make the highest possible contribution towards my goal?
:Essentialist actually explore more options that non-Enssential counterparts. They deliberately do this to pick the right one later and commit to one or two ideas and go big.
:* What do I feel inspired by?
:* What am I particularly talented at?
:* What meets a significant need in the world?
* ''2. ELIMINATE''
** Clothes - divided into "must keep" and "should get rid of". But are you really ready to give off those clothes?
** Activity - not enough the determine highest possible contribution but also eliminate that do not
:Saying no to anyone takes courage and compassion. Eliminating non-essentials is not just about ''mental discipline'', its about ''emotional discipline'' necessary to say no to social pressure.
* ''3. EXECUTE''
** Clothes - Regular routine for organizing wardrobe
** Activity - Make executing intentions as effortless as possible
:Instead of forcing execution, essentialists invest time they have saved into creating a system for removing obstacles and making execution as easy as possible.
[[Essentialism - The Disciplined Pursuit of Less]]
!Clarify
* Clarity of purpose consistently predicts how people do their jobs
* motivation and cooperation deteriorate when there is lack of purpose
* Lack of clarity leads to confusion, [[Stress]] and frustration.
* People waste time on trivial many, when there is lack of clarity
* Two common patterns emerge with lack of clarity
** ''Playing Politics'' - focused on winning the attention of the manager. Effort in attention to look better than their peers
** ''It's all Good (which is bad)'' - people pursue things that advance their own short term interests
!! Clarity of purpose comes with deciding Essential Intent
* [[Essential Intent]] is simple, concrete, inspiring and measurable
* One big decision made, all subsequent decisions come into better focus. Like deciding to become a doctor instead of a lawyer.
<style>
.t30 {width: 200px; height: 100px; text-align:center;}
.t3 {height: 50px;}
.purple {background-color:#34495e; color:white;}
.big {font-weight: bold; font-size:16px}
</style>
<table>
<tr>
<td class="t3"></td>
<th>General</th>
<th>Concrete</th>
</tr>
<tr>
<th>Inspirational</th>
<td class="t30"><span class='big'>Vision/Mission</span> <br>
We want to change the world</td>
<td class="t30 purple"><span class='big'>Essential Intent</span><br> (makes one decision that eliminates 1000 later decisions)</td>
</tr>
<tr>
<th>Bland</th>
<td class="t30"><span class='big'>Values</span><br> Innovation, leadership, teamwork</td>
<td class="t30"><span class='big'>Quaterly Objective</span><br>Increase profits by 5% over last year's results</td>
</tr>
</table>
!! Crafting a statement of Purpose both concrete and inspiring
''Stop Wordsmithing & Start deciding''
* If we could be truly excellent at one thing, what would it be?
''Ask, how will we know when we are done?''
* Actor/Social Entrepreneur [[Brad Pitt]] appalled by lack of progress in rebuilding New Orleans after Hurricane Katrina, started an organization called "Make it Right" with the [[Essential Intent]] - ''to build 150 affordable, green storm resistant homes for families living in the Lower 9th Ward''.
Tags:
* [[Essentialism - The Disciplined Pursuit of Less]]
*[[05 April 2021]]
! Dare
<<<
The right ''no'' at the right time can change the course of history.
<<<
Have you ever felt a tension between what you felt was right and what someone was pressuring you to do?
* Courage is the key to the process of elimination
* Reasons to fear saying no
** Missing an opportunity
** Can't bear the thought of disappointing someone
** scared of burning bridges
<<<
''The main thing is to keep the main thing the main thing
''
<<< [[Stephen R. Covey]]
!! Why is it hard to choose essential vs non-essential in the moment?
* We are unclear what is essential
* Fear of social awkwardness - we feel guilty, we don't want to let someone down, we are worried about damaging the relationship
[[Peter Drucker]] said no to [[Mihaly Csikszentmihalyi]] when MC wanted to reach out to him for an interview on series of creative individuals. Peter Drucker's reply
<<<
...I say that one of the secrets of [[Productivity]] (in which I beleive whereas I do not believe in creativity) is to have a VERY BIG waste paper basket to take care of ALL invitations such as yours - productivity in my experience consists of NOT doing anything that helps the work of other people but to spend all one's time on the work the Good Lord has fitted one to do, and to do well.
<<<
!! Scripts to delivering a graceful no
* ''Separate the request from relationship'' - Denying the request is not denying the person.
* ''Saying NO doesn't have to necessarily use NO''
** I am afraid I don't have bandwidth
** I would very much like but I am overcommitted
* ''Focus on the trade-off'' - A graceful "no" grows out of clear but unstated calculation of trade-off
* ''Remind yourself that everyone is selling something''
* ''Saying NO requires trading popularity for respect''
** When initial annoyance or disappointment or anger wears off, respect kicks in
* ''Clear NO more graceful than a vague YES'' - delaying the eventual no will make it more harder
!! The "NO" Repertoire
* ''The awkward pause'' - pause and count to 3, before delivering your verdict
* ''The "soft-no" or "no but"'' -
* Let me check my calendar and get back to you
* Use email automatic replies - most socially acceptable no
* Yes, What should I deprioritize? - when saying no to senior leader
* Say it with humour
* Use the words "You are welcome to X. I am willing to Y" - supporting to do something but not throwing the full weight behind
* "I can't do it, but X might be interested" - It is tempting to think that our help is uniquely valuable, but the person receiving help does not really care how he/she gets help when he/she gets help.
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[05 April 2021]],,
!Uncommit
[[Sunk Cost Bias]] makes it hard for us to let go of something we have invested considerably in. The sunk cost for developing and building the [[Concorde]] were around $1 billion
An [[Essentialist]] has the courage and confidence to admit his or her mistakes and uncommit, no matter the sunk costs.
!! Avoiding Commitment Traps
* ''Beware of the endowment effect'' - sense of ownership is a powerful thing. The [[Endowment Effect]] explains the saying
<<<
Nobody in the history of the world has washed their hire car!
<<<
*''Pretend you don’t own it yet'' - Antidote to endowment effect - Instead of asking “How much di I value this item?”, we should ask “If I did not own this item, how much would i pay to obtain it?”
* ''Get over the fear of waste'' - Adults are much more vulnerable to [[Sunk Cost Bias]] than young children? - because as of lifetime exposure to “Don’t Waste” rule
* Admit Failure to begin success
* Stop trying to force a fit - don't try to be a character you are not
* ''Get a neutral second opinion'' - Sharing your frustration with a friend who has the advantage of being emotionally removed from the project - someone who isn't burdened with the sunk cost could evaluate a decision with some perspective
* ''Beware of [[Status Quo bias]]'' - It's all too easy to blindly accept and not bother to question commitments simply because they have already been established.
** ''Apply [[Zero-Based Budgeting]]'' - detects exaggerated budget requests and draws attention to obsolete operations
* Stop making casual commitments
* From now on, pause before you speak - ''pausing for 5 seconds before offering your services can greatly reduce the possibility of a commitment you'll regret.''
* ''Get over FOMO'' of something potentially great
* Run a [[Reverse-Pilot]] - Evaluate commitments that you are making that you assumed made a big difference to them but in fact they barely notice.
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[06 April 2021]],,
!Edit
Editing involves the strict elimination of the trivial, unimportant, or irrelevant - is an [[Essentialist]] craft.
An editor is not merely someone who says no to things, in fact actually adds life to ideas, setting , plot and characters using ''deliberate subtraction''
!! Editing non-essentials from life
* ''Cut out options'' - cutting out things that confuse the reader and cloud the message or the story
<<<
To write is to human, to edit is to divine
<<< [[Stephen King]]
* ''Condense'' - An editor is ruthless in pursuit of making every word count. It doesn't mean doing more at once, but less waste, it means lowering the ratio of words to ideas, square feet to usefulness or effort to results
* ''Correct'' - An editor also has to make something right. that means correcting gramattical errors to adjusting flaws in the argument. Editor must have clear sense of purpose of the work that is being edited.
* Edit less - ''The best surgeon is the not the one who makes more incisions.'' becoming editor of our lives includes showing when to show restraints. We can resist our usual temptation of first to reply, or adding our two cents to the meeting. We should wait and observe and see how things develop.
[[Essentialism - The Disciplined Pursuit of Less]]
!Limit - The freedom of setting boundaries
* Work boundaries have not only blurred but also moved into family territory.
* [[Clay Christensen]], author of [[Innovator's Dilemma]] said - ''If I had made an exception then I might have made it many times.''
<<<
Boundaries are like walls of sandcastle. The second we let one fall over, the rest of them come crashing down
<<<
Clay's unwillingess to work at weekends could have limited his career. Boundaries come at a high price. However not pushing back costs more: ''which is our ability to chose what is most essential in life.''
* If you don't set any boundaries, there won't be any. Or worse, they will be set by default, or by design
!! Their problem is not your problem
How often do you feel your weekend is hijacked by someone else's agenda? Follow below guidelines
* ''Don't rob people of their problems''
** When you make other people's problem your problem, you are taking away their ability to solve it
** You need to put up your fences in advance, clearly demarcating what's off limits
* ''Boundaries are a source of liberation''
** When we don't set boundaries, we are imprisoned by the limits others have set for us
* ''Find your dealbreakers''
** Find activities that you simply refuse to say yes to unless they somehow overlap with your own priorities
** Write any request whenever you feel violated by someone's request - unwanted invitation, unsolicited opportunity, request for small favor
* ''Craft Social Contracts''
** Simply having an understanding and up front about what we were really trying to achieve and what our boundaries were kept us from wasting each other's time
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[07 April 2021]],,
!Buffer - The unfair advantage
<<<
Give me six hours to chop down a tree and I will spend the first hour sharpening the axe
<<< [[Abraham Lincoln]]
A ''buffer'' can be define literally as something that prevents two things from coming into contact and harming each other. We can reduce the friction of executing the essential in our work and live simply by creating a buffer. We all have experienced how tasks and projects - despite our best efforts - fill the amount of allotted time.
The non-[[Essentialist]] tends to always assume a best-case scenario. The Essentialist always plans ahead and prepares for contingencies.
non-Essentialists receives windfall, she tends to consume it rather than set it aside for the rainy day. Essentialist, however, use the good times to create a buffer for the bad.
Norway received windfall gains in taxes, so unlike [[Britain]], they invested in endowment. It now acts as world's largest Sovereign [[Wealth Fund]] and providing a cushion against unknown future scenarios.
!! Few tips to create a buffer
* Use extreme preparation
** People who acknowledge that they cannot predict the unexpected prepared better
* Add 50% to your estimate
** [[Planning Fallacy]] - we frequently underestimate the time it would take for a task to complete. One way to protect against the planning fallacy is to add 50% to the estimate
*** It relieves stress about being late
*** We realize that we did it faster
* Conduct scenario planning - Developing [[Risk Management]] strategies
*# What risks do we face on this project?
*# What is the worst case scenario
*# What would the social effects of this be?
*# What would the financial impact of this be?
*# How can you invest to reduce the risks or strengthen financial or social resilience? - this will lead to adding buffers and perhaps adding another 20% to project's budget
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[09 April 2021]],,
! Progress - The power of small wins
non-Essentialist goes big on everything. The [[Essentialist]] however starts small and celebrates small success
* Positive tickets system was implemented by Richmond police for cracking down crime rates. Reduced recidivism rates from 60% to 8% after 10 years.
* By catching and rewarding people in the midst of "small wins" - catching the youth doing something good, Ward Clapham's approach tapped into power of celebrating progress. Each time a young person was recognized, he/she was much more motivated to continue doing good until it became natural efforts
* [[One More Time: How Do You Motivate Employees?]] -from [[Harvard Business Review]] says ''two primary internal motivations for the people are achievement and recognition for the achievement. Of all things that can boost emotions, motivations and perceptions during the workday, the single most important is making progress in meaningful work''.
* [[Standford prison experiment]] tells us that simply being treated in a certain way conditioned these graduate students to gradually adopt negative behaviors. Similar kind of positive conditioning is being done by [[Phillp Zimbardo]] on [[Heroic Imagination Project]]
!! Reducing screen time and increasing reading time for kids
* Use token system. 10 tokens at the beginning. each could be traded for 30 min screen time or 50 cents.
* at the end of the week, the tokens can add up to $5 or 5 hours of screen time
* reading a book - earns additional token
* Screen time went down by 90%; reading went up by same amount
!! Focus on Minimum Viable Progress
* [[Minimal Viable Product]]
* Rip off Minimal Viable Progress - smallest amount of progress that will be useful and valuable to the essential task we are trying to get done?
* Minimal Viable Preparation - ''Often 10 mins invested in a project 2 weeks before can save much frantic and stressed out scrambling at the 11th hour.''
!! Visually Reward progress
* Like in a fund raiser the thermometer goes up with each donation
:<img src ='https://www.qgiv.com/blog/wp-content/uploads/2016/03/Qgiv-P2PFundraising-Thermometer-1.png' width=200>
* ''when we start small and reward progress, we end up achieving more than when we set big, lofty and often impossible goals.''
!! References
* [ext[Positive tickets: a new way to police|https://www.theguardian.com/commentisfree/2013/feb/20/positive-tickets-police-alternative]] from [[Guardian]]
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]]| [[08 April 2021]],,
!Flow - Genius of Routine
The way of non-[[Essentialist]] is to think that the essentials only get done when they are forced. The execution is a matter of raw effort alone. You push through
''The [[Essentialist]] designs a routine that makes achieving what you have identified as essential to the default position''. Essentialists also work hard, but effort yields exponential results with the right routine
!! Making it look easy
* Routine powerful for removing obstacles - Instead of consciously pursuing the essential, it will happen automatically
* Routine makes difficult things to become easy. Repetition allows [[Neurons]], or nerve cells to create strong connections to get easily activated
* With routine the process becomes fully unconscious. Mental work shifts to [[Basal Ganglia]], mental space is freed to concentrate on something new. The brain can completely shut down
* Embedding our decisions in routine allows us to channel that discipline to essential activity
* [[Creative Individuals]] use strict routines to free up their minds.
* ''Planning meetings ahead'' - Eliminates the mental cost of planning the meeting and thinking about who would be there. Instead people can focus on the problem
!! Power of Right Routine
* 40% of our choices are deeply [[Unconscious]]
** ''Opportunity'' - can develop new abilities that become instinctive
** ''Danger'' - can develop counterproductive routines
!!! Replacing bad routines with good ones
* [[The Power of Habit]] by [[Charles Duhigg]] says that all habits are made of ''Cue + Routine + Reward''
** ''Cue'' - trigger that tells your brain to go in automatic mode (stress)
** ''Routine'' - the behavior itself (Pulling facial hair) - can be physical, mental or emotional
** ''Reward'' - which helps the brain figure out whether this activity is worth remembering for future.
* Cue becomes neurologically intertwined over time
* Instead of changing the behavior associate the cue that leads to that behavior with something else
!!! Create new triggers
* Keeping this Neural-Notework - Write few lines everyday at the exact same time. Associate this with seeing a book after coming from work
!!! Most difficult things first
* establish a routine to do the most difficult things first
!!! Mix up your routines
* Doing same things again and again every day can get boring. Start dividing up weeks into themes and follow routine every week
* [[Twitter]] co-founder [[Jack Dorsey]], has themes for each week
** Monday - Management meetings/ running the company
** Tuesday - Product development
** Wednesday - for marketing comms & growth
** Thursday - for developers
** Friday - company and culture
!!! Tackle routines one by one
* DON'T try to overhaul multiple routines at the same time, because many of our non-essential routines are deep and emotional
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[08 April 2021]],,
!Focus - What's Important Now?
There is a difference between losing and being beaten. ''Losing means you lost focus''. It means you didn't concentrate on what was essential. To operate on highest level of contribution requires that you deliberately tune in to what's important here and now.
!! There is only now
Busy trying to prepare for the next meeting? Next chapter in your life?
* Focusing on future and past distracts us
Greeks had two words for time
* //[[Chronos]]//
** the chronological order of time.
** Quantitative
* //[[Kairos]]//
** time that is opportune, right, different.
** Qualitative
** experience only when immersed fully in here and now
!! Multi tasking vs Multi-focusing
* We can easily do two things at the moment, talking while washing dishes. What we can;t do is ''concentrate on more than one thing.''
<<<
Multi tasking itself is not the enemy of essentialism; pretending we can multi-focus is.
<<<
!! How to be in the Now
# ''Figure out what's important right now''
#*Take a deep breath
#* Make a list of all things vying for your attention
#* Cross off anything that's not important right now
# ''Get the future out of your head''
#* Write things down that might have been essential but not right now
# ''Prioritize''
#* Work on the list one at a time
!! The pause that refreshes
<<<
In work, do what you enjoy. In family life, be completely present.
<<<
:[[Thich Nhat Hanh]] - world's calmest man - a Buddhist monk - to live in //[[Kairos]]// -[[Mindfulness]] or maintaining a beginner's mind.
:Pay attention to through the day for your own [[Kairos]] moments and notice what triggered them and try to recreate. It will help make higher level of contribution.
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]]| [[09 April 2021]]
,,
! Choose
<<<
It's the ability to choose which makes us human
<<< [[Madeleine L'Engle]]
* When we surrender our ability to choose, something or someone else will step in to choose for us.
* Choice is not a thing. Our options may be things, but a choice is an ''action''. So, while we may not have control over our options, we ''always'' have control over how we choose among them
!!! The Invincible power of choosing to choose
* For too long, we have overemphasized the external aspect of choices (our options) and underemphasized our internal ability to choose (our actions).
* ''Options (things) can be taken away, while our core ability to choose (free will) cannot be. It can only be forgotten.
''
* We forget our ability to choose because of [[Learned Helplessness]]
<<<
My first act of free will shall be to believe in free will
<<< [[William James]]
''The [[Essentialist]] knows that when we surrender our right to choose, we give others not just the power but our explicit permission to choose for us.''
,,[[Essentialism - The Disciplined Pursuit of Less]],,
!BE - The essentialist life
[[Mahatma Gandhi]] did not read newspaper for 3 years because it added non-essentialist confusion to his life. He eliminated everything from his life and reduced himself to zero.
!! Living Essentially
There are two ways to think about Essentialism.
# First is to think of it as something you ''do'' occasionally. Non essentialist at the core but applying some essentialist principles
# Second is to think of it as something you ''are''. Essentialist at the core but occasionally slipping back to non-essential.
Focusing on the essentials is a ''choice''. It is ''your choice''.
!! Being an Essentialist can change the lives by
# Giving more clarity
# More control
# More joy in the journey
!! The Essentialist Life
<<<
A man lost his 3 year old daughter -> Had made a lot of memories in video -> Realized that very less footage of her daughter herself.
<<<
Learnings from this story
* Importance of family in our life
* Pathetically tiny amount of time we have left of our lives
This story is not depressing, but thrilling because it removes the fear of choosing the wrong thing. It challenges you to be more selective about time.'' The life of an Essentialist is a life lived without regret. If you have correctly identified what really matters, if you invest your time and energy in it, then it is difficult to regret the choices you make. You become proud of the life you have chosen to live.''
!! One takeaway from this book
<div style="font-size: 15px; color: green;">
Whatever decision or challenge that you face in your life, simply ask, "What is Essential?"
</div>
,,Tags: [[Essentialism - The Disciplined Pursuit of Less]] | [[11 April 2021]],,
! Discern
What really counts is the ''relationship between time and results''. Working hard is important, but more effort does not necessarily yield more results.
<<<
EL Bulli has somewhere in the range of 2 million requests for dinner reservations each year, it serves onl fifty people per night and closes for six months of the year
<<<
* [[Pareto Principle]] - 20% of our efforts produce 80% of results.
* In, [[Tao of Warren Buffet]], [[Warren Buffet]] decided early in his career, that it would be impossible for him to make hundreds of right investment decision, so he decided that he would invest only in the business that he was absolutely sure of, and bet heavily on them. he owes 90% of his wealth to just 10 investments.
<<<
You cannot overestimate the unimportance of practically everything
<<< [[John Maxwell]]
!! A non-essentialist thinks almost everything is essential. An Essentialist thinks almost everything is non-essential
,,[[Essentialism - The Disciplined Pursuit of Less]],,
! Trade-Off
Trade-offs are not something to be derided, they are something to be embraced and made deliberately, strategically and thoughtfully.
<<<
Strategy is about making choices, trade-offs. It's about deliberately choosing to be different.
<<< [[Michael Porter]]
[[Southwest Airlines]] decided to only economy class, without serving meals and offering select destinations with point to point travel. The trade-off was covering all destinations vs covering few. Jacking prices to cover the cost of meals vs not serving. their competitor [[Continental Airlines]] decided to have a [[Straddling]] strategy by keeping the business intact and introducing Continental Lite which followed Southwest's principles.
When companies claim their mission is to serve all stakeholders - clients, employees, shareholders - equally. This leaves management with no clear guidance on what to do when faced with trade-offs between the people they serve.
<<<
There are no solutions, there are only tradeoffs
<<< [[Thomas Sowell]]
A non-[[Essentialist]] approaches evert trade-off by asking, "How can i do both?". [[Essentialist]]s ask the tougher but ultimately more liberating question, "Which problem do I want?"
,,[[Essentialism - The Disciplined Pursuit of Less]],,
! Escape
* escape to think and talk, because people can’t figure out what is essential of they’re constantly on call.
* If people are too busy to think, they are too busy, period.
* While non-essentialist automatically react to the latest idea and jump on the latest opportunity, the latest email, [[Essentialist]] choose to create space to explore and ponder
!! Space to Design
* [[d.school]] at [[Stanford]] has foam cubes that you can sit on - uncomfortably, that forces students to walk and interact with people.
* [[Booth Noir]] - a windowless, soundproof room to think
<<<
In order to have focus we need to escape to focus
<<<
* Creating intended space for intense concentration - Newton did this for 2 years for writing [[Principia Mathematica]]
* [[Paradox]] - The faster and busier the things get, the more we need to build thinking time in our schedule. And noisier the things get, the more we need to build quiet reflection spaces where we can truly focus.
!! Space to Read
* [[Bill Gates]] regaurly took a week off just to think and read
* [[Advice]] - Read something that was written before our hyper connected era and yet seems timeless. Such writings can challenge our assumptions about what really matters
Tags : [[Essentialism - The Disciplined Pursuit of Less]], [[29 March 2021]]
! Look
* [[Journalism]] was not just about regurgitating the facts but about figuring out the point. It wasn’t enough to know who, what, when and where; but understand what it meant and why it mattered?
!! The Big Picture
* Being a journalist of your own life will force you to stop hyper-focussing on all the minor details and see the bigger picture
!! Filter for the fascinating
<<<
Listen for what others do not hear.
<<<
* [[Essentialist]]s are powerful observers and listeners. Knowing the reality of trade-offs they can’t possibly pay attention to everything, they deliberately listen for what is not being explicitly stated.
* Non-Essentialists listen too. But they listen while preparing to say something. They get distracted by by extraneous noise.
<<<
They run around with fire-extinguishers in times of flood. They miss the lead
<<< CS Lewis for Non Essentialists
!! Keep a Journal
* For becoming a journalist of your own lives, keep a journal
* Storage Device for backing brain’s faulty hard drives. THe faintest pencil is better than the strongest memory
!! Get on in the field
[[d.school]] class called [[Design for extreme affordability]], [[Embrace Infant Warmer]] was designed by getting out in places where pre-mature births happen and realising that it should not require electricity to run.
!! Clarify the question
* Answering difficult questions can be done in two ways. Evading it and another clarifying it.
* Evasiveness only sends us down a non-essential spiral of further vagueness and misinformation.
Tags: [[Essentialism - The Disciplined Pursuit of Less]], [[29 March 2021]]
! Play
Defined as anything we do to simply for the joy of doing rather than as a means to an end.
<<<
A little nonsense now and them, is cherished by the wisest men
<<< [[Roald Dahl]]
* As children we figure out how to play, but as we get order we are introduced to the idea that play is trivial, waste of time and unnecessary.
* Modern [[School]] system, born in industrial revolution, has removed much of the pleasure and leisure of learning
* Early managers, looked to military for inspiration. (Front line and company itself are term for a military unit)
* PLay leads to brain [[Plastic]]ity, adaptability and creativity. Nothing fires up the brain like play
!! A mind invited to play
* Play, plays a role in species survival. Bears that played the most tended to survive the longest. It prepares them for a changing planet. Animals are especially prone to behaving in flexible and creative ways
* Play broadens the range of options available to us.
* Play is an antidote to stress which is an enemy of productivity and which shuts down the creative, inquisitive and exploratory parts of the brain.
* [[Stress]] increases the activity in [[Amygdala]] while reducing activity in [[Hippocampus]] as a result we can’t think clearly
* Play stimulates the parts of brain involved in both careful, logical reasoning and carefree, unbound exploration.
!! Of work and play
* CEO of [[Twitter]], [[Dick Costolo]] promotes play through comedy; he instigated improv class to stretch their minds and think more flexibly, unconventionally and creatively.
* [[IDEO]] conducts meetings in microbus
!! Tags
* [[Essentialism - The Disciplined Pursuit of Less]]
* [[29 March 2021]]
! Sleep
!! Protect the asset
The best asset we have for making a contribution to the world is ourselves. If we underinvest in ourselves (mind, body and spirit) we damage the very tool that can make the highest contribution.
The way of the non-essentialist is to sleep as yet another burden in one’s already overextended, overcommitted, busy-but-not-always-productive life. Essentialists see sleep as necessary for operating at high levels of contribution most of the time.
!! Shattering Sleep Stigma
* Best violists spent more time practicing than merely good students
* Best violinists slept an average of 8.6 hours/24 hours - an hour longer than good students. They also spend 2.8 hours napping in the afternoon - 2 hours more than good students.
* Sleep deficit is equivalent to drinking too much alcohol. Pulling an all-nighter induces an impairment equivalent to blood alcohol level of 0.1%
* [[Experiment: Sleep depriviation]] - brains are hard at work encoding and restructuring information during sleep. Our brains may have made new neural connections literally overnight.
<<<
Sleep is the new status Symbol for Successful Entrepreneurs
<<<
<<<
Our highest priority is to protect the ability to prioritize
<<<
[[Essentialism - The Disciplined Pursuit of Less]], [[29 March 2021]]
! Select
* [[90 Percent rule]] - while selecting an option if option score < 90, then 0 else 1
* Sometimes you will have to turn down seemingly good opportunities and have faith that a perfect option will come.
* Act of applying selective criteria forces us to choose which perfect option to wait for rather than anyone else choose for you.
* Non-Essentialist may operate by the implicit criterion, “If my manager asks me to do it, then i should do it.”
!! Selective explicit and also right
* Hiring decision - better to be understaffed than hiring wrong person quickly
* First, ''interview someone by phone - strip away all visual cues forming first impressions. Tell, whether prospective employee was organised enough to find a quiet place at an allotted time''. Weeding out many at this stage in time efficient manner.
* Interviewed by multiple people through the company. Would he/she love working here and would we love having him or her work with us?
* One day of work
* Will this person be an absolutely natural fit?
!! Opportunity Knocks
* Sometimes we get a job offer we didn’t expect. Saying an easy yes because it is an easy reward, we run the risk of having later to say no to a more meaningful one.
* [[Criteria for Selecting Opportunities]]
* Good career opportunity - carry out an adavanced search and ask 3 questions.
** What am I deeply passionate about
** What taps my talent?
** What meets a significant need in the world
* We are not looking at plethora of good things to do. We are looking for the one where we can make our absolutely highest point of contribution.
Tags: [[Essentialism - The Disciplined Pursuit of Less]], [[29 March 2021]]
You can think of this book doing for your life and career what a professional organizer can do for your wardrobe. Essentialism is about creating a sytem for handling the wardrobe of life. This is not a process that you undertake once a year/month/week. it is a ''discipline'' you apply every time you are faced with a decision to whether say yes or politely delcine. Tough trade-offs between a lot of good things and a few really great things.
!! One takeaway from this book
<div style="font-size: 15px; color: green;">
Whatever decision or challenge that you face in your life, simply ask, "What is Essential?"
</div>
<<tabs
"[[Essentialism - Chapter 1]]
[[Essentialism - Chapter 2]]
[[Essentialism - Chapter 3]]
[[Essentialism - Chapter 4]]
[[Essentialism - Chapter 5]]
[[Essentialism - Chapter 6]]
[[Essentialism - Chapter 7]]
[[Essentialism - Chapter 8]]
[[Essentialism - Chapter 9]]
[[Essentialism - Chapter 10]]
[[Essentialism - Chapter 11]]
[[Essentialism - Chapter 12]]
[[Essentialism - Chapter 13]]
[[Essentialism - Chapter 14]]
[[Essentialism - Chapter 15]]
[[Essentialism - Chapter 16]]
[[Essentialism - Chapter 17]]
[[Essentialism - Chapter 18]]
[[Essentialism - Chapter 19]]
[[Essentialism - Chapter 20]]
[[Essentialism - Appendix]]
"
"[[Essentialism - Chapter 1]] "
"$:/state/strollhometabs" "tc-vertical">>
# ''estimate'' the temperature using anonymous voting- project the results
# ''Talk'' on the points where convergence is required and where the room disagrees
# ''Estimate'' convergence by gathering votes again
* World's second largest [[Cryptocurrency]] by market cap as of 2021 second only to [[Bitcoin (BTC)]]
* Doesn't have a fixed cap on coins - grows constantly by demand. [[Ethereum]] [[Blockchain]] is larger than [[Bitcoin (BTC)]] blockchain
* Was never intended to alternative currency or to replace other mediums of exchange - but facilitate and monetize operations on Ethereum platform
* Ethereum network is a decentralized, open-source [[Blockchain]] with [[Smart Contract]] functionality
* [[Ether (ETH)]] is the currency of the network to pay for the requested operations executed on the Ethereum network
* Unlike bitcoin's blockchain which uses it as just of record keeping, Ethereum blockchain can execute contracts in the transactions
* Ethereum block can be confirmed in seconds unlike minutes in bitcoin blockchain
!! Summary
!!! 3 rules for optimization
# Don't
#* Focus on writing code that runs
#* Unless you have good reasons to optimize, don't do this
# Don't... yet
#* Finish your code have tests and then think about it
#* You will end up breaking things, and jumping around the code.
#* Cannot even measure if you don't have the first version of running code
# Profile
#* Using profile tools to understand where in the code you need optimization
#* Optimization not about making it run faster, but more efficient to consume resources available to it. Usually there is a tradeoff
#* cProfile - How much time each function is called
#* pstats - advanced formatting
#* RunSnakeRun, Snakeviz libraries for more graphical representation
!!! levels of Optimization
* Design
* Algorithms and data structures
* Source Code
* Build level -skip
* Compile Level
* Runtime level
<<<
Always code as if the guy who ends up maintaining your code will be a violent psychopath who know where you live
<<< John Woods
!! Faster [[Python]]
* Counting elements in a list - don't use `for` loops - just use `len()` built-in function. There are several built in functions [[in the documentation|https://docs.python.org/3/library/functions.html]]
* Filtering in a list - use [[List Comprehension]] than using `for` and `if`
* Use `try` and `except` statements instead of `if else` statements - faster. Much useful when checking for multiple conditions
* Use `in` to check whether an item belongs to a list, than using `for` and `if` statements
* Use `set` function to remove duplicates from a list. This set is not ordered. Take a look at OrderedDict from collections module
* `sorted(some_list)` is slower than `some_list.sort()`
* Checking for `True`, Use `if variable` instead of `if variable == True`
* Checking for `False` - Use `if not variable`
* Initializing a list - Use `[]` than `list()`
* Similarly for dict - Use `{}` than `dict()`. In both cases a function is being called
!!! Don'ts
* Don't do parallel variable assignments in a single line , even though it is faster
* Local variables are faster to access than global variables - but will complicate the code
<iframe width="560" height="315" src="https://www.youtube.com/embed/YjHsOrOOSuI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Eu is a Greek word for good. Getting together with the members of the group to help and survive. They are safe, more productive and better able to overcome challenges.
This allows building of tribes, groups and nations
''Building intuitive explaianable models 1 variable at a time''
* Select one variable
* Build 4 models - [[Linear Regression]], [[XGBoost]], [[CatBoost]], [[Neural Network]]
* Measure results at overall level and segment level - measure closing in of errors
* Introduce another variable
* Replicate the benchmark such as [[NIFTY ETF]]
* Have very minimal expense ratios
* Don't offer active fund management
* almost like a tech platform
* [[Expense Ratio]] - 0.05 - 0.15% compared with active equity funds charge > 2%
* Passively managed funds
** Funds with Brains ([[Smart Beta Funds]])
** Funds without Brains (Index ETF)
[[Psychologist]] named Edward Thorndike studied the behavior of cats by putting them in the box. Beside the box there was food and inside the box there was a lever that opened up the gate for the box. Cat would want to get out of the box to have food. It tried poking nose, clawing objects and randomly pressed the lever tha opened the gate first time. Cats were put in the same cage again. Over time cats learned to push the lever to escape and have food.
Cat learned to associate pressing of lever with the reward of escape and having food
Scientists played loud sounds in nursing ward. Some babies turn towards it and some babies turn away. Those who turned away were likely to be growing as [[Introvert]]s while those who turned towards were more likely to grow as [[Extrovert]]s
!! Setup
* [[Control Group]]: Asked to track how often they exercise
* Motivation Group: Asked to track + read material about the benefits
* Third Group: asked to track + read material about benefits of exercise + asked to formulate a plan as to when and where they would exercise
!! Results
* Control group - Exercised ''35%'' of time at least once a week
* Motivation Group - exercised ''38%'' (No significant impact of benefit reading material)
* Third Group - exercised ''91%'' (worked because of [[Implementation Intention]])
* [[Dopamine]] is a [[Neurotransmitter]] and its role is to feel pleasure
* Scientists James Olds and Peter Milenr planted electrodes to rats that blocked the release of dopamine. The rats lost the will to live, eat, have sex and they died of thirst in a few days
* The ability to experience pleasure remained, but without dopamine, the desire died and the action stopped
!! Youtube
[[IUI2019 keynote : DARPA’s Explainable Artificial Intelligence (XAI) Program|https://www.youtube.com/watch?v=nX-4ClxWXYg&ab_channel=ACMSIGCHI]]
!! Summary
* talk given by Murat Vurucu - Founder of Latentine
* Definition considered - AI can detect patterns and find insights for situations too complex for humans to understand
* Machines require teaching to learn reasoning - the bottleneck is data
* Organizations make assumptions that [[AI]] is not working for them is partly due to the fact that the data is not AI ready
* Hand-labelling - Making data AI ready
** Obvious - easy - can be outsourced by crowd
** Complex - difficult - require experts - created a tool called ''Assembel'' where engineers can pose questions about the data and email within the organization - the questions can have multiple labels and the expert can answer the reasoning for each label for each data point. After about 50 answers for reasoning, AI with weak supervision can label the entire dataset and makes the data trainable for further usage - this labelling is equivalent of building a [[Machine Learning]] model with 100K observations
<iframe width="560" height="315" src="https://www.youtube.com/embed/A34h4swRmgc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Tags: [[Conferences for AI/ML/DL]] | [[25 July 2021]] | [[Machine Learning Conference]]
!! Explainable AI (XAI) Methods
!!! 1. Intrinsically Interpretable Methods
* [[Linear Regression]]
* [[Logistic Regression]]
* [[Decision Trees]]
* [[Decision Rules]]
* [[Generalized Linear Models (GLMs)]]
* [[Generalized Additive Models (GAMs)]]
* [[Naive Bayes Classifier]]
* [[k-Nearest Neighbors]]
!!! 2. Model Agnostic Methods
* [[Partial Dependence Plot]]
* [[Individual Conditional Expectation (ICE)]]
* [[Accumulation Local Effects (ALE)]]
* [[Feature Interactions]] - [[Friedman’s H-statistic]]
* [[Feature Importance]] - [[Permutation Importance]]
* [[Global Surrogate]]
* [[Local Surrogate]]- ([[LIME]])
* [[SHAP Values]]
!!! 3. Example-Based Explanations
Use particular instances from the dataset to explain the behavior of the model and the distribution of the data in a model agnostic way
* [[Counterfactual]]
* [[Adversarial]]
* [[Prototypes]]
* [[Influential Instances]]
* [[k-Nearest Neighbors]]
!!! 4. Other Techniques
* [[Knowledge Infusion Techniques]] - Asserts that the infusion of domain knowledge leads to better explainability of the prediction with negligible compromises. For example [[TCAV]] for CNN
*
<img src='https://lh3.googleusercontent.com/dqFX08rfIwAcdHLsDgCPSwtEnS7MlBYcS1k5fZzmld3qoHNcDVo9jV9utJdr18-TVUY0K6JK34UDq7GmZNz-k2ABml7N6g5CKp3IHjYfw7VA2p2UOMn0tO3ChawplXWYI8Hf9mihCzoxpYJE3qdqvT37VepXIuvR9zQDWZ9TnamJIzRepqRe1-uR3aO02rHdULQg_iva4bMsaEl50eiJbDXhlXzIhrCBXMRZ041stHb-niKD3bP5taefxFavsmcpMVVX4LPVqbEWOyi8CnGljvyEdi3Wn4N-30_vqxJInq4qefY32HUQ2jw8w0DV-n96ceLG_Re6sndnx-lEQemZIdjkotJiiNiyAXq7Pew10u2rcnWQbm_ea6SPpULtw8G4nZAbHMN9Ziym_ICjA-xL4bEGsV_H7nDrrY1UTcaylhcTZCP17aH5LqL_p-wzDQzSIwNf1CuZ5E2Ag5H7qoOln_EAdFEBWZZYotHxhvunL1q9UA6PY2lTK94HfEF77ZfjqZt4FlWdeDqdyH5Lio2t8ZUWk3ZdaAlGJ0oLShFKHo8rDaNZ37nnnCmZNCmZyT24SkHjSFytDOF44FU23UA5Jk4JhJLEYop-E--KAzh_Pvd60ZGHD1WdAlDkwYbuIJ939LAzwVU-wmQzUOg0qnRxj5Vydslk7STuTDzu0OBtVckqpTI36SYRdd5psfeP1SX-glJgYlBQyK9Y4vUWcCqFFXqekg=w1591-h758-no?authuser=0' width=700>
* Approx - whether model approximates the black-box model behavior
* Inherent - inherently interpretable
* ante-hoc - incorporates explainability into a model from the beginning
* post-hoc - explainability is incorporated after the regular training of the actual model
This paper focuses on exploring the internal structure of LSTM so as to learn accurate forecasting and importance measures simultaneously.
!!! Related Work
* ''attention methods'' - Current attention based methods seldom provide variable-wise temporal interpretability.
* ''post-analyzing on trained models''
The F1 score can be interpreted as a weighted average of the [[Precision & Recall]], where an F1 score reaches its best value at 1 and worst score at 0.
$$
F1 = 2 \times \frac{precision \times recall}{precision + recall} = \frac{TP}{TP + \frac{1}{2}(FP + FN)}
$$
where,
* $$\mathrm{TP}$$ = number of true positives
* $$\mathrm{FP}$$ = number of false positives
* $$\mathrm{FN}$$ = number of false negatives
!! Code
```python
from sklearn.metrics import f1_score
f1_score(y_true, y_pred, average='macro')
f1_score(y_true, y_pred, average='micro')
f1_score(y_true, y_pred, average='weighted')
f1_score(y_true, y_pred, average=None)
```
!! Average
* `binary`
** Only report results for the class specified by pos_label. This is applicable only if targets `(y_{true,pred})` are binary.
* `micro`
**Calculate metrics globally by counting the total true positives, false negatives and false positives.
** computed by using each instance
** Large Micro output means better overall
** micro-average can be particularly ''misleading when the class distribution is imbalanced''
** The micro-average is not sensitive to the predictive performance for individual classes
* `macro`
**Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.
** large macro means classifier performance well for individual class
** ''suitable for imbalanced classification''
* `weighted`: Calculate metrics for each label, and find their average weighted by support (the number of true instances for each label). This alters ‘macro’ to account for label imbalance; it can result in an F-score that is not between precision and recall.
* `samples`: Calculate metrics for each instance, and find their average (only meaningful for multilabel classification where this differs from `accuracy_score`).
!! References
* [[Sklearn|https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html]]
* https://www.datascienceblog.net/post/machine-learning/performance-measures-multi-class-problems/
* Much harder problem than [[Face Verification]]
* For a database of k persons, output ID of the person else output not-recognized
* 1:K problem
Verify that the input image is of the claimed person. 1:1 Problem
''In factor analysis, variables are grouped by their correlations, i.e., all variables in a particular group will have a high correlation among themselves, but a low correlation with variables of other group(s)''
* Use [[AI]] to detect fake reviews and scams
* Free to use as [[Chrome]] extention
It is overriding passion to position and power
Falling victim to fat-cat [[Syndrome]] means resting on our laurels instead of pressure testing our beliefs
<img src='https://pbs.twimg.com/media/ExQhaXIWUAA_fU8.jpg' width=300>
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
!! Research Paper
* ''Motivation for research'' - Analysts have deep domain expertise but less time series knowledge to do forecasting at scale
* Problems addressed
** Forecasting at scale - large number of forecasts & variety of forecasts and building trust as to what went wrong
** reasonable forecasts with time series that are automated
* Literature Review - Use case on Facebook events dataset
** `forecast` package in R -
** `auto.arima` - fits range of [[ARIMA]] models and automatically selects the best one. This is prone to large trend errors and they fail to capture seasonality
** `ets` - fits a collection of exponentially smoothing models and selects the best one. miss longer team seasonality
** `snaive` - a random walk model that makes constant predictions with weekly seasonality - miss longer team seasonality
** `tbats` - both weekly and yearly seasonalities
* ''Prophet Forecasting Model''
** Decomposable time series model - $$y(t) = g(t) + s(t) + h(t) + \epsilon_t$$
*** $$g(t)$$ = trend function that predicts non-periodic changes
*** $$s(t)$$ = represents periodic changes
*** $$h(t)$$ = represents effect of holidays - potentially irregular intervals
*** $$\epsilon_t$$ = idiosyncratic changes not accommodated by the model - assumed to be normally distributed
** Similar to [[Generalized Additive Models (GAMs)]]
** Framed forecasting problem as curve fitting excercise
*** Provides flexibility
*** Fitting is fast
*** has interpretable parameters
* ''Trend Model'' - Two models implemented for cover range of forecasting problems at Facebook
** Nonlinear, Saturating Growth - modelled as logistic growth model
*** time varying carrying capacity - number of FB users dependent on access to internet (carrying capacity) which is not fixed
*** Growth rate is not fixed - New products can alter the growth rate of region
** Linear trend with Change points - for which saturating growth is not applicable
** Automating change points selection - the change points can be specified or it can be inferred from the data. ''Large # of change points (one per month for several year data)''.
** Trend Forecast Uncertainity - ''Future change points are randomly sampled such that average frequency of changepoints matches that in the history''
* ''Seasonality Model''
* ''Holidays''
* ''Automating Evaluation of Forecasts''
** Compare to set of baseline methods - last value and simple mean
** [[MAE]], [[MAPE]]
** Simulated Historical Forecasts - higher the number of forecasts more correlated the error. In extreme cases, the model will have very high correlation between errors with just additional day of data in SHF
*:<img src='https://lh3.googleusercontent.com/kiN-IxV5LEWAeDTzmSlYRiouPlpIGna__buvLlxZUW9vioa3_VQ8Ce-w8EKyV62sYJ8a69LZnuWXUn30ZNmPWBS5mXg0rKLdnnzawZ-GFtQDbg4A8I9xpfUt5_JCR681t4c2RrvPX78OTWHE4fPvFiXnKNIHIpJOCDbP9-al53TLIirHSNLIzfJrq2nGEyG9qW6TV8X9qRKxTOWR1crqrgRSqDeUdWbsvtssPnahbA-4bunfmVQV9cYk1J-ne28GbKwhHfU6B7zLqKvlgcL6Wkz0FE91ZbbnK1Y3Uwj8sBbNSvh3byF_TW67hqcX26_EKprS12frpJVAXn1Ung4CW4T_WjIn3OcTdRcMmO5bcpxu5ta2fR9afyvb9vcJ7ZzoLWe6eCG0DjYlICXnfQqoqeBkPpcBhhi__UF7udF6rj_6E81DNep0urDYN6zocQLuzgv6BtvPyK6QeAWOoTqaQZgTWp9KprbcOAs0Ifwl52WmmOnEShtCvxqR1kG57Cip8NSL16PgiKNwfzUocdxiMFWyjvzegQyALrdUYJikZ-ZPYv2sgvNWnXdTzB9Ri1Qa7YZOApxRzJPTAWFhqVH8oIfqgQlFHOxdAl_kBmqm3LRnztxRYJZLy4nIpEKQOI6pDW3-5Aq7Uo6fsPe845z_V9V9NiUfPNevvnp6h1-ubNV5CMRzDHrl5sBX-W-8ErEzI6OIBBsw7NEN_oo253GKTclj4w=w1063-h919-no?authuser=0' width=600>
!! References
* [[Research Paper |https://peerj.com/preprints/3190.pdf]]
* [[Standardization]]
* [[Normalization]]
* [[Signal enhancement]] -The signal-to-noise ratio may be improved by applying signal or image-processing filters. These operations include baseline or background removal, de-noising, smoothing, or sharpening
* [[Extraction of local features]] - can bring significant improvement.
* [[Linear and non-linear space embedding methods]] - decreasing dimensions
** [[Principal Component Analysis]]
** [[Multidimensional Scaling (MDS)]]
* [[non-linear transformation]] - increase variable complexity to solve complex problems when linear features not able to solve
** computing product of features
* [[Discretization]]
A [[Python]] library for [[Feature Engineering]] and [[Feature Selection]]
!! Useful Functions
!!! Feature Selection
* SmartCorrelatedSelection() finds groups of correlated features and then selects, from each group, a feature following certain criteria:
** Feature with least missing values
** Feature with most unique values
** Feature with highest variance
** Feature with highest importance according to an estimator
* DropHighPSIFeatures: selects features based on the [[Population Stability Index (PSI)]]
!! reference
[[https://feature-engine.readthedocs.io/en/latest/]]
Feature engineering is the process of using your own knowledge about the data and about the machine-learning algorithm at hand (in this case, a neural network) to make the algorithm work better by applying hardcoded (nonlearned) transformations to the data before it goes
into the model.
!! Feature Engineering Techniques
''Combing Columns''
<<<
Sometimes one column does not have good predictive power on its own, but when combined with a another column can lead to more [[Information gain]]
<<<
''Categorify''
<<<
Convert categories of strings or different product ids into a number based column with values ranging from 0 to C, where C is the number of unique categories. Can use `df.col.factorize`
Also group the values that occur less frequently say < 5 into a separate group called ''others''
<<<
[[Target Encoding]]
<<<
Compute the ''mean for each category in categorical variable, then replace the category with the encoded mean in the column.'' You should also create a new column while you do this as best practice
''Smoothing ''is generally done, for cases which occur only once where the target mean could either be 0 or 1. Smoothing enables us to use global mean when the category occurs less frequently
$$
TE_{target}([C]) = \frac{count([C]) * mean_{target}([C]) + w_{smoothing} * mean_{target}(global)}{count([C]) + w_{smoothing}}
$$
where C is Categories.
A simple way is to calculate a weighted average of the category value mean $$(mean_{target}[C])$$ and the global mean ($$mean_{target}(global)$$).
We add a smoothing weight $$w_{smoothing} \in \mathbb{N}$$. A bigger $$w_{smoothing}$$ relates to that Target Encoding is closer to the global mean.
<<<
''Binning''
<<<
Binning is done to divide the numeric variables into intuitive buckets
<<<
''Normalizing''
<<<
* MinMaxScaler
* StandardScaler
* [[Gaussian Rank]]
<<<
!! Reference Video
<iframe width="560" height="315" src="https://www.youtube.com/embed/uROvhp7cj6Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,Tags: [[ACM RECSYS]] | [[25 July 2021]] | [[Feature Engineering]],,
<table>
<thead>
<tr>
<td>Data Types</td>
<td>Methods Specific</td>
<td>Common Methods</td>
</tr>
</thead>
<tbody>
<tr>
<td>Numeric</td>
<td>Transformation, Discretization, Outlier treatment, Scaling, mathematical operations</td>
<td rowspan="2">Missing Imputation, Time Series</td>
</tr>
<tr>
<td>Categorical</td>
<td>Encoding</td>
</tr>
</tbody>
</table>
!! Encoding
* [[Feature Engine]]
* [[GPlearn]]
* compressed an ''global'' insight into [[Machine Learning]] model's behavior
* takes into account both the individual feature effect and [[Feature Interactions]]
When features interact, individual feature effects do not sum up to the total feature effects from all features combined
!! references
* https://christophm.github.io/interpretable-ml-book/interaction.html
* https://statisticsbyjim.com/regression/interaction-effects/
* https://www.sciencedirect.com/science/article/pii/S0360544215001590
* http://www.cs.cmu.edu/~daria/papers/rmbo_full.pdf
* Federated learning is learning from users data on devices without transferring data to a centralized location and thus enabling user privacy.
* Each user can only contribute a certain amount so that it doesn't memorize single user or overfit
* Training is done on the user's device, on the devices which are eligible
* Training results are then transferred using [[secure aggregation]], that means on the aggregated results can be viewed
* For training only certain percentage of users are selected and some users are used for testing in real-time
* The deployed model is a static model until the update, but it is still powerful because of training on large number of datasets
!! References
* [[Google's Storyboard|https://federated.withgoogle.com/]]
```python
import string
import random
import json
import csv
import datetime
import re
import pandas as pd
from datetime import timedelta, time
from websocket import create_connection
# Functions to Generate Sessions
def generateSession():
stringLength = 12
letters = string.ascii_lowercase
random_string = ''.join(random.choice(letters) for i in range(stringLength))
return "qs_" + random_string
def generateChartSession():
stringLength = 12
letters = string.ascii_lowercase
random_string = ''.join(random.choice(letters) for i in range(stringLength))
return "cs_" + random_string
## Functions to format and send messages
def prependHeader(st):
return "~m~" + str(len(st)) + "~m~" + st
def constructMessage(func, paramList):
#json_mylist = json.dumps(mylist, separators=(',', ':'))
return json.dumps({
"m": func,
"p": paramList
}, separators=(',', ':'))
def createMessage(func, paramList):
return prependHeader(constructMessage(func, paramList))
def sendRawMessage(ws, message):
ws.send(prependHeader(message))
def sendMessage(ws, func, args):
ws.send(createMessage(func, args))
def generate_csv(a):
out = re.search('"s":\[(.+?)\}\]', a).group(1)
x = out.split(',{\"')
with open('data_file.csv', mode='w', newline='') as data_file:
employee_writer = csv.writer(data_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
employee_writer.writerow(['index', 'date', 'open', 'high', 'low', 'close', 'volume'])
for xi in x:
xi = re.split('\[|:|,|\]', xi)
print(xi)
ind = int(xi[1])
ts = datetime.fromtimestamp(float(xi[4])).strftime("%Y/%m/%d, %H:%M:%S")
employee_writer.writerow([ind, ts, float(xi[5]), float(xi[6]), float(xi[7]), float(xi[8]), float(xi[9])])
# Initialize the headers needed for the websocket connection
def tv_headers():
headers = json.dumps({
'Origin': 'https://data.tradingview.com'
})
return headers
# Then create a connection to the tunnel
def newSession():
ws = create_connection(
'wss://data.tradingview.com/socket.io/websocket',
headers=tv_headers()
)
session = generateSession()
chart_session = generateChartSession()
return ws, session, chart_session
def messagebox(ws, session, chart_session, ticker, resolution, bars):
sendMessage(ws, "set_auth_token", ["unauthorized_user_token"])
sendMessage(ws, "chart_create_session", [chart_session, ""])
sendMessage(ws, "quote_create_session", [session])
sendMessage(ws, "quote_set_fields", [session, "ch", "chp", "current_session", "description", "local_description",
"language", "exchange", "fractional", "is_tradable", "lp", "lp_time",
"minmov", "minmove2", "original_name", "pricescale", "pro_name", "short_name",
"type", "update_mode", "volume", "currency_code", "rchp", "rtc"])
sendMessage(ws, "quote_add_symbols", [session, ticker, {"flags": ['force_permission']}])
sendMessage(ws, "quote_fast_symbols", [session, ticker])
sendMessage(ws, "resolve_symbol", [chart_session,"symbol_1", "={\"symbol\":\"" + ticker + "\",\"adjustment\":\"splits\",\"session\":\"extended\"}"])
sendMessage(ws, "create_series", [chart_session, "s1", "s1", "symbol_1", resolution, bars])
def search_data(ticker, resolution, bars):
ws, session, chart_session = newSession()
messagebox(ws, session, chart_session, ticker, resolution, bars)
search_tu = True
while search_tu:
try:
result = ws.recv()
result = result.split('~')
for item in result:
if 'timescale_update' in item:
item = pd.DataFrame([x['v'] for x in json.loads(item)['p'][1]['s1']['s']])
item.columns = ['epochtime', 'open', 'high', 'low', 'close', 'volume']
item['datetime'] = pd.to_datetime(item.epochtime, unit='s') + timedelta(hours=5.5)
item['time'] = item.datetime.dt.time
# considering time between 9:15 AM and 3:30 PM
item = item[item.time.between(time(9,15), time(15,30), inclusive='both')]
# removing rows where OHLC values are same
item = item.drop_duplicates()
return item
search_tu = False
except Exception as e:
item = ''
return item
def fetch_raw_data(ticker, resolution, bars):
ws, session, chart_session = newSession()
messagebox(ws, session, chart_session, ticker, resolution, bars)
search_tu = True
while search_tu:
try:
result = ws.recv()
result = result.split('~')
for item in result:
if 'timescale_update' in item:
item = pd.DataFrame([x['v'] for x in json.loads(item)['p'][1]['s1']['s']])
item.columns = ['epochtime', 'open', 'high', 'low', 'close', 'volume']
item['datetime'] = pd.to_datetime(item.epochtime, unit='s') + timedelta(hours=5.5)
item['time'] = item.datetime.dt.time
return item
except Exception as e:
item = ''
return item
def search_nonstock_data(ticker, resolution, bars):
ws, session, chart_session = newSession()
messagebox(ws, session, chart_session, ticker, resolution, bars)
search_tu = True
while search_tu:
try:
result = ws.recv()
result = result.split('~')
for item in result:
if 'timescale_update' in item:
item = pd.DataFrame([x['v'] for x in json.loads(item)['p'][1]['s1']['s']])
item.columns = ['epochtime', 'open', 'high', 'low', 'close']
item['volume'] = 0
item['datetime'] = pd.to_datetime(item.epochtime, unit='s') + timedelta(hours=5.5)
item['time'] = item.datetime.dt.time
# removing rows where OHLC values are same
item.drop_duplicates(inplace=True)
return item
search_tu = False
except Exception as e:
item = ''
return item
```
## Fibonacci Series
- Italian mathematician from Pisa (known as Fibonacci) discovered this series
- Any number in series is sum of previous two numbers
- 0, 1, 1, 2, 3, 5, 8, 13, 21…
- Golden ratio (this number/previous number) = 1.618 = Phi
- (this number/next number) = 0.618
- (this number/next to next number) = 0.382
- (this number/next to next to next number) = 0.236
## Relevance to stock markets
- After a strong up move or down move, the stock usually retraces back before it’s next move
- Provides a good opportunity for traders to enter new positions in the direction of trend
## Fibonacci Retracement Theory
After the upmove, one can anticipate a correction in the stock to last up to the Fibonacci Ratios
→ 1st level Retracement = 23.6%
→ 2nd level Retracement = 38.2%
→ 3rd level Retracement = 61.8%
## Construction
- First identify 100% Fibonacci move → pick the most recent peak and trough in the chart
- Click and drag from trough to the peak and the numbers will be automatically retraced - using Zerodha Pi
## How to use?
For example, want to buy a particular stock but could not because of strong run up in the stock and the most prudent action would be to wait for a Retracement in the stock. Fibonacci Retracement levels act as potential levels up two which the stock can correct
* this is an indicator
* Buy a stock only after it has passed the checklist
!! Facts
* ''Founded in'' : 1970
* ''Founders'': Ramesh Maganlal Shah and Prakash Damodar Kamat
* ''Sector'': Chemicals
* ''Product'': [[Oleo-chemicals]] based additives -derived from plants
* ''Applications'': Bread & Biscuits, packaging, Cosmetics, coatings
* [[ROCE]] - 38, 44, 32 (Mar'20) and 22 (Mar'21)
* ''Sales Growth'': 9.16% (Mar'21)
* ''Promoter Share'': High, 75% (public share is low)
* Part of [[Saurabh Mukherjea]]'s [[Little Champs]] portfolio
* ''Barriers to entry'' - Additives are ubiquitous and used in very small quantities (typically constitute <1% of the molecular weight of the end product) but lend critical functional characteristics to the end product. Hence, ''high quality alongside consistency, customisation, safety'' (since these are used in food products) and ''environmental considerations create strong barriers to entry''
* ''Competitive Advantage''
** R&D: in-house product development
** Shifting customer preferences towards green additives (like Oleo-Chemical based products)
* ''Key Risks''
** Regulatory or customer actions
** Price of Raw materials
* Exports accounted for ~55% of the Company’s revenues in FY20
* strong global presence in food and polymer additives. These two segments together account for nearly 60-70% of the Company’s revenues
!! In the News
<<<
20-25% earnings compounding over a long time should be feasible for Fine Organics and therefore we have built a substantial position in the small caps and specialty chemicals companies
<<< [[Saurabh Mujherjea in ET Prime|https://economictimes.indiatimes.com/markets/expert-view/autos-and-financials-best-way-to-play-recovery-saurabh-mukherjea/articleshow/81686017.cms?from=mdr]]
!! Why invest in this Stock
''Key Success Factors''
* ''Competition'' - Not much competition in Food and plastic additives. 4-5 global competitors, no significant competition in India
* ''Vetting process is stringent''. Good and consistent quality is required since directly used in the products
* This ''specialised nature'' of product creates entry barriers around know-how, a long gestation period for product development and highly technical sales skills.
* Strong relationships and increased customer stickiness
* Strong technical and product development team
''Strong R&D Focus''
* ''Packaging'' - introduced oleo-chemical based additive can be used to package vegetarian food not possible with additives derived from animal fats
* ''Cattle Feed'' - additive to be mixed with cattle feed which on digestion lowers the content of harmful saturated fats in milk produced by the cattle
* ''First Mover advantage and market leadership'' - Oleo Chemicals are derived from plants and are important for customers turning towards green and environment friendly products
!! Key Risks
* ''Any regulations/action surrounding products or production processes'' - Fine Organics was issued a show cause notice from Maharashtra Pollution Control Board and production on one of the plants was stopped, later plant was issued a Zero Effluent plant notice to continue production
* ''Significant volatility in Raw material prices''
** imposition of duties by Govt of India or by Exporting countries
** Short term impact on margins due to mismatch in duration and timing of contracts with vendors and customers
!! Financial Performance
<img src='https://marcellus.in/wp-content/uploads/2021/05/Exhibit-4.jpg' width=600>
!! Information on [[Screener]]
Fine Organic Industries is carries on business in India and abroad, as manufacturers, processors, suppliers, distributors, dealers, importers, exporters of wide range of oleochemical-based additives used in foods, plastics, cosmetics, coatings and other specialty application in various industries.
* ''Largest in India and among top 6 global players''
:Fine Organic is the largest manufacturer of oleochemical-based niche additives in India. It is among the six largest global players in polymer additives and among leading global players in specialty food emulsifiers.
* ''Diversified customer base''
:Fine's client/customer base includes companies like [[Coca-Cola]], [[Britannia]], [[Asian Paints]], [[Parle]], [[Pidilite]], [[Berger Paints]] etc. No individual customer accounts for more than 5% of revenue. Fine Organic’s product portfolio comprises of over 400 products including food additives, polymer additives, emollients for cosmetics, additives for rubber & elastomers, etc
* ''Shift from synthetic chemicals to oleo-chemicals''
: Demand for [[Oleo-chemicals]] are increasing as they are green additives and environment friendly
!! References
* [[Little Champs: Spotlighting Fine Organic Industries Limited|https://marcellus.in/newsletter/little-champs/little-champs-spotlighting-fine-organic-industries-limited/]]
* [[Fine Organics, Where Saurabh Mukherjea Bought Stake, Has Gained 41% Since April|https://in.investing.com/news/fine-organics-where-saurabh-mukherjea-bought-stake-has-gained-41-since-april-2730549]]
* [[Information from Screener|https://www.screener.in/company/FINEORG/consolidated/]]
* [[Investor Presentaion|https://www.fineorganics.com/images/stories/download/Investors/Presentations/Intimationletter-presentationNovember2020.pdf]]
:<embed src='https://www.fineorganics.com/images/stories/download/Investors/Presentations/Intimationletter-presentationNovember2020.pdf' width=1000, height=400>
First know bar chart was invented by William Playfair (1759-1823), because year to year data was missing and he needed to a design to portray the one year data that was available.
<img src='https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/1786_Playfair_-_Exports_and_Imports_of_Scotland_to_and_from_different_parts_for_one_Year_from_Christmas_1780_to_Christmas_1781.jpg/500px-1786_Playfair_-_Exports_and_Imports_of_Scotland_to_and_from_different_parts_for_one_Year_from_Christmas_1780_to_Christmas_1781.jpg' width = '800'>
,,[[12 July 2020]],,
was developed by [[William Playfair]], a Scottish political economist, published in his book, //The commercial and Political Atlas//
<img src = 'https://www.anychart.com/blog/wp-content/uploads/2015/12/William_Playfair_-_Chart_of_all_the_Import_and_Exports_to_and_from_England_from_the_Year_1700_to_1782_.jpg' width='700'>
,,[[12 July 2020]],,
Assets with limited downside risks and limited return. Returns are in the form of interest payments. FIs include
* Bank Fixed Deposits
* Bonds issued by Govt of India
* Bonds issued by Govt. Agencies like NHAI, NTPC
* Bonds issued by Private companies
In computing, floating point operations per second is a measure of computer performance, useful in fields of scientific computations that require floating-point calculations
[[Data Visualization]] tool to create eye catching visualizations - [[Flourish.com|https://app.flourish.studio/projects]]
!! Best Fonts
* <span class='st2'> [ext[SF Pro Display|http://fontsfree.net/?s=SF+Pro+display]] - used in Apple Products </span>
* <span class='st3'> [ext[Inter|https://fonts.google.com/specimen/Inter]] - used in Kaggle </span>
!! Resources
* Free download - [ext[fontsfree.net|http://fontsfree.net/]]
* Font pairings from [ext[FontPair|https://fontpair.co/]]
<style>
.st2 {font-family: 'SF Pro Display';font-size: 24px;}
.st3 {font-family: 'Inter';font-size: 24px;}
.st4 {font-family: 'Alex Brush';font-size: 20px;}
.st5 {font-family: 'Akronim';font-size: 20px;}
.st6 {font-family: 'Annie Use Your Telescope';font-size: 20px;}
</style>
!! BAJAJ FINANCE FINANCIALS
* [ext[Cash Flow Statement |https://economictimes.indiatimes.com/bajaj-finance-ltd/cashflow/companyid-11260.cms]]
<table style="width:100%">
<tr>
<th>S.No</th>
<th>Ratio</th>
<th>Components</th>
<th>Value (Mar '20)</th>
<th>Source</th>
<th>Final Value</th>
</tr>
<tr>
<td>1</td>
<td>Cash Flow from operations as a % of EBITDA</td>
<td>Cash Flow from operating activities</td>
<td>-14126.87</td>
<td>[ext[Cash Flow Statement |https://economictimes.indiatimes.com/bajaj-finance-ltd/cashflow/companyid-11260.cms]]</td>
<td>0.946</td>
</tr>
<tr>
<td></td>
<td></td>
<td>EBIDTA (Profit before taxes & depriciation)</td>
<td>14936.38</td>
<td>[ext[Cash Flow Statement |https://economictimes.indiatimes.com/bajaj-finance-ltd/cashflow/companyid-11260.cms]]</td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>Volatility in Non-operating income</td>
<td>STD Dev of Other Income</td>
<td>11.62, 13.25, 41.45, 25.95, 79.17</td>
<td>[ext[P&L |https://economictimes.indiatimes.com/bajaj-finance-ltd/profitandlose/companyid-11260.cms]]</td>
<td>24.8675</td>
</tr>
<tr>
<td>3</td>
<td>Provisioning for doubtful debts as a proportion of debtors overdue for >6 months</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>Yield on cash and cash equivalents</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>Contingent liabilities as % of Net-worth (for the latest available year)</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>6</td>
<td>Change in reserves explained by the profit/loss for the year and dividends</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>7</td>
<td>Growth in auditor’s remuneration to growth in revenues</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>8</td>
<td>Miscellaneous expenses as a proportion of total revenues</td>
<td>Misc. Expenses</td>
<td>0</td>
<td>[ext[Balance Sheet|https://economictimes.indiatimes.com/bajaj-finance-ltd/balancesheet/companyid-11260.cms]]</td>
<td>0</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Total Revenues</td>
<td>23834.15 </td>
<td>[ext[P&L |https://economictimes.indiatimes.com/bajaj-finance-ltd/profitandlose/companyid-11260.cms]]</td>
<td></td>
</tr>
<tr>
<td>9</td>
<td>CWIP to gross block</td>
<td>CWIP - Capital Work in Progress: costs incurred to date on a fixed asset which is still under construction at the balance sheet date. The costs being incurred on such assets cannot be recognized as an operating asset until they qualify as a ready to use asset</td>
<td>0</td>
<td>[ext[Balance Sheet|https://economictimes.indiatimes.com/bajaj-finance-ltd/balancesheet/companyid-11260.cms]]</td>
<td>0</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Gross Block - when the company acquires an asset, it is called the ''Gross Block''. Depreciation should be deducted from the Gross block, after which we can arrive at the ''Net Block''. </td>
<td>1742.73</td>
<td>[ext[Balance Sheet|https://economictimes.indiatimes.com/bajaj-finance-ltd/balancesheet/companyid-11260.cms]]</td>
<td></td>
</tr>
<tr>
<td>10</td>
<td>Free cash flow (cashflow from operations + cashflow from investing) to median revenues</td>
<td>Cash flow from operations + cash flow from investing</td>
<td>(-14126.87) + (-9632.54) = 23759 </td>
<td>[ext[Cash Flow Statement |https://economictimes.indiatimes.com/bajaj-finance-ltd/cashflow/companyid-11260.cms]]</td>
<td>2.84</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Median Revenues: 6 years of revenues</td>
<td>MEDIAN (23834.15, 17399.27, 13329.22, 7383.48, 5418.23) = 11659.095</td>
<td>[ext[P&L |https://economictimes.indiatimes.com/bajaj-finance-ltd/profitandlose/companyid-11260.cms]]</td>
<td></td>
</tr>
</table>
!! Budget
* Wildstone - CODE - steel - deo
* Axe Signature Intense - Woody Long lasting - Chocolaty - for evenings (can order)
* Blanko - Legend - For Day and night - fresh notes - classy notes - all day long lasting
* Denver Black.Code - Can be applied day and night - evergreen fragrance
* Bellavita
** CEO Man - office (order)
** White OUD - late night parties - romantic
!! Expensive
* SKINN by Titan - 3000/100ml - RAW - lasting day - citrus smell - travel perfume - all rounder
* Adidas - iCe Dive - Day time
* Davidoff Cool Water - daytime best (order) - classic
* Mont Blanc - Legend - Best nighttime (order) - long lasting
<iframe width="560" height="315" src="https://www.youtube.com/embed/1CMz_J_KYbY?si=sNUf5vS-INdZDbJu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<<<
People respond differently to same choice depending on how it framed (people place greater value on moving from 90 - 100% - high probability to certainty - than from 45 to 55% even though they are both 10% points)
<<<[[Never Split the Difference]]
François Chollet works on deep learning at Google in Mountain View, CA. He is ''the creator of the Keras deep-learning library'', as well as a contributor to the TensorFlow machine-learning framework. He also does deep-learning research, with a focus on computer vision and the application of machine learning to formal reasoning. His papers have been published at major conferences in the field, including the Conference on Computer Vision and Pattern Recognition (CVPR), the Conference and Workshop on Neural Information Processing Systems (NIPS), the International Conference on Learning Representations (ICLR), and others.
* [[Coverr|https://coverr.co/]] - Free Stock Videos for content creators
* [[Unsplash.com|https://unsplash.com/]] - For stock images - royalty free
*
* [[Library Genesis|http://gen.lib.rus.ec/]] is a file-sharing based shadow library website for scholarly journal articles, academic and general-interest books, images, comics, audiobooks, and magazines. The site enables free access to content that is otherwise paywalled or not digitized elsewhere
** [[Alternative URL 1|http://libgen.rs/]]
* [[Z-Library|https://z-lib.org/]] (abbreviated as z-lib, formerly Book Finder) is a shadow library project for file-sharing access to scholarly journal articles, academic texts, and general-interest books
* [[Sci-Hub|https://sci-hub.se/]] is a shadow library website that provides free access to millions of research papers and books, without regard to copyright, by bypassing publishers' paywalls in various ways. Sci-Hub was founded by Alexandra Elbakyan in 2011 in Kazakhstan in response to the high cost of research papers behind paywalls
* [[Audiobooks|http://audiobookbay.nl/]]
* [[magazinelib|https://magazinelib.com/]]
[[Free Resources]]
* [[Carrd.co|https://carrd.co/]] - One page website templates
* Metric that helps detect [[Feature Interactions]]
* interaction strength between two features is the difference between the ''partial dependence function for those two features together'' and the sum of of the ''partial dependence functions for each feature separately''
* computationally expensive to calculate
The Frobenius norm is [[matrix]] norm of an `m×n` matrix ''A'' defined as the square root of the sum of the absolute squares of its elements
$$ ||A||_F =
\displaystyle\sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n}|a_{i,j}|^2} $$
* [ext[Frobenius Norm Wolfram|https://mathworld.wolfram.com/FrobeniusNorm.html#:~:text=The%20Frobenius%20norm%2C%20sometimes%20also,considered%20as%20a%20vector%20norm]]
* [[Oleo-chemicals]] supplier
* One segment - home and personal segment - soaps, shampoos and conditioners
* First mover advantage - local companies - surfactants earlier were important
* 3 criteria met - quality, consistency and continuity
* Fatty alcohol price volatile - need relationship with strategic vendors
* AMET (Africa, Middle East and Turkey) - Gain Uniliever's share in other geo since satisfied customer needs in India
* Specialty products - special shampoos for hair fall - Innovation Edge
* Revenue growth muted - Raw material pass through - margins are improving - very steady ROCE > 20% last decade and Market share is steady
* Clog 15-20% earnings growth
* Explain [[Course 1: Build Basic GANs]] as a story
* George and Michael want to become rich. So they decided that they would forge money of 50, 100, 500, 1000 denominations ([[Multi-Modal Distritbution]] - 4 Modal distritbuion). None of them know about forging money. Michael is good at painting, so they decide that Michael one would forge ([[Generator]]) currency and George would inspect ([[Discriminator]]) them and try to identify real from fakes
* They found an abandoned workshop nearby. In order to avoid suspicions, both decided that they would take turns to visit workshop. They set up a BCE machine to print money there.
* Michael is overconfident and doesn't want to look at real money and he says he will generate a denomination that will fool George. So Michael generates some samples using the BCE Machine.
* George visits the workshop and tries to identify reals from fakes, he writes down some numbers on the fakes that Michael generated which tells how much the generated image look realistic.
* Michael takes a look at the numbers and generates some more examples. George again gives feedback to improve the realism
* After several rounds of iterations, Michael is frustrated. He noticed that George has trouble discriminating the fakes of 500 he generate, so he generates more denominations of 500 ([[Mode Collapse]]).
* George seeing this and goes back and tries to dig up on how to distinguish real 500 from fakes of 500. He learned it so good, that whenever Michael generated a 500 note, he could clearly distinguish real ones from fakes. Instead of writing numbers, George caught every fake 0. now Michael is stuck ([[Vanishing Gradients]] problem)
* George goes back and reads some more, he learns that there a WASSERSTEIN machine that gen generate fakes that looks real. George and
[[Idea Book]]
Is a form of emotional abuse when someone leaves you to question your own reality, memory or perceptions. It is intentional and does know what they are saying and doing
* What did I do to you?
** genuine - they genuinely don't know
** gaslighters - pretend to play dumb
* Everyone around you isn't the problem, the problem is you
** victim blaming - often used to shut down a conversation
* I am sorry you feel that way
** not a true apology - a way to make you feel like you are the problem
* I don't remember saying that I think you made that up
** go to question of gaslighter to take focus out of them and to question your thoughts
* It's your anxiety that made me do the things that I do
** common response - when gaslighter gets called out for their behavior, gaslighter is not taking responsibility for their own actions
* You need help
** gaslighter - You are the problem. Shutdown response to avoid working through things
* It's your fault
** Neglect any responsibility of their actions
* you're too emotional
** implies characteristics are seen as flaws - makes your question your own sense of how you are
* It's not a big deal
** Minimize the impact something has on you
* Why are you so defensive all the time? you are attacking me
** challenge a gasligher. tendency to flip the conversation towards you
<iframe width="560" height="315" src="https://www.youtube.com/embed/y3t-Jvrr2OY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,[[06 December 2021]],,
* [[Nonstationarity]], or changes in generative parameters, is often a key aspect of real world time series. An in ability to react to regime changes can have a detrimental impact on predictive performance. [[Change point detection (CPD)]] attempts to reduce this impact by recognizing regime change events and adapting the predictive model appropriately.
* ''Run-length'': time since last change point
* Underlying Predictive Model [[UPM]]: could be [[IID-Independent and Identically Distributed]] [[Gaussian processes]]
* [[Hazard Function]] - The hazard function describes how likely we believe a changepoint is given an observed run length r.
* [[Temporal Structure]] - patterns in time series
* Standard [[Bayesian Online Change Point Detection (BOCPD)]] treats [[Hyperparameter]]s as fixed
!! Reference
* http://mlg.eng.cam.ac.uk/pub/pdf/SaaTurRas10.pdf
,,[[Research Paper]] | [[28 October 2021]],,
Gaussian processes are a nonlinear [[Regression]] method, that do not assume the function underlying the relationship between x and y can be represented by an analytic form. They belong to a class of methods known as [[Bayesian nonparametrics]]
!! Two Approaches to applying Gaussian process methods to time series
* [[Gaussian process time series (GPTS)]] - GPs can be used to model time series data directly which gives rise to GPTS.
* [[Autoregressive Gaussian process (ARGP)]] - GPs can also be used to learn the mapping between previous time steps and the next time step to learn non-linear Auto-regressive model
!! UPMs
A GP is a distribution over functions and is specified by a mean function $$\mu(.)$$ and a covariance function also called a kernel $$k_{\xi}(.,.)$$
* Covariance is parameterized by set of [[Hyperparameter]]s $$\xi$$ which describe general properties of the functions generated from the prior, such as ''smoothness, length scales and amplitude''
!! GPTS
$$
x(t) = f(t) + \epsilon_t \\
f(t) \sim \mathcal{GP}(0, k_\xi) \\
\epsilon_t \sim \mathcal{N}(0, \sigma^2_n)
$$
where $$\sigma^2_n$$ is the noise variance
!! ARGP
$$
x(t) = f(x_{t-p:t-1}) + \epsilon_t \\
f(t) \sim \mathcal{GP}(0, k) \\
\epsilon_t \sim \mathcal{N}(0, \sigma^2_n)
$$
* Novel standardization technique to transform input data for training deep neural networks
!! How it works?
<img src='https://miro.medium.com/max/2400/0*3tk1F7Y131QsQ27U' width=700>
* Three steps
** Sort the data and compute rank
** Scale values between -1 and 1
** Use the [[erfinv|https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.erfinv.html]] to turn output into [[Gaussian]]
!! References
* [ext[Gauss Rank Transformation is 100x Faster with RAPIDS and CuPy|https://medium.com/rapids-ai/gauss-rank-transformation-is-100x-faster-with-rapids-and-cupy-7c947e3397da]]
* [[Stationary time series]]
* $$iid$$ - independent and identically distributed
* [[White noise]] - white noise is a random signal having equal intensity at different frequencies
* Defined as : $$y_t \sim iid N(0, \sigma^2)$$
* Mean = 0
* Var = $$\sigma^2$$
<img src='https://www.aptech.com/wp-content/uploads/2019/09/ts-pp-gwn.jpg' width=500>
Size of Wallet Opportunity Models built for corporate customers to estimate the potential amount to be spent in the next one year incremental to what was spent in the previous year. This uses a [[k-Nearest Neighbors]] based approach to estimate the incremental spend potential based on 10 nearest neighbors found out using variables like spend, bureau and [[firmographics]]
$$Y = XB + U$$
* has more than one dependent variable
* general linear model is a generalization of multiple [[Linear Regression]] to the case of more than one dependent variable
* If Y, B, U are column vectors - then multiple [[Linear Regression]]
$$g(E(y)) = b_0 + f_1(x_1) + f_2(x_2) + ... + f_n(x_n)$$
* A Class of [[Regression]] models with potentially non-linear smoothers applied to the regressors
* $$f(x)$$ - smoothing function applied over $$x$$ to have non-linear relationship with $$y$$
<<<
In statistics, a generalized additive model (GAM) is a [[Generalized Linear Models (GLMs)]]in which the linear response variable depends linearly on unknown smooth functions of some predictor variables, and interest focuses on inference about these smooth functions. GAMs were originally developed by Trevor Hastie and Robert Tibshirani[1] to blend properties of [[Generalized Linear Models (GLMs)]] and [[Additive Models]]
<<< [[Wikipedia|https://en.wikipedia.org/wiki/Generalized_additive_model]]
!! References
* https://m-clark.github.io/generalized-additive-models/introduction.html
$$g(y) = b_0 + b_1x_1 +b_2x_2 + ... + b_nx_n$$
* where $$g$$ is the link function over $$y$$.
* generalized linear model (GLM) is a flexible generalization of ordinary [[Linear Regression]] that allows for the response variable to have an error distribution other than the [[Normal Distribution]] via link function
* Different from [[General Linear Models]]
* Generalized linear models were formulated as a way of unifying various other statistical models, including [[Linear Regression]], [[Logistic Regression]] and [[Poisson Regression]]
!! Courses
* [[Course 1: Build Basic GANs]]
* [[Course 2: Build Better GANs]]
* [[Course 3: Apply GANs]]
!! Welcome to the Specialization
* [[GAN]]s are an emergent class of [[Deep learning]] algorithms, that generate incredibly realistic images
* Learning Objectives
** Pictures of people that never existed - https://thispersondoesnotexist.com/
** These cats do not exist - https://thesecatsdonotexist.com/
** Make someone look younger/older
** Low res video to high res video
** [[Supervised Learning]] - classify objects, medical imaging, creating new examples for [[Data Augmentation]]
GANs are on a path to transform image editing and more broadly media and entertainment
!! Analogy
<img src='https://dummyimage.com/600x400/000/fff' width=250>
* TWo [[Neural Network]]s in a feedback loop
* [[IKEA Effect]] with GANs
!! background and Prerequisites
* What is a [[Neural Network]] including [[Convolutional Neural Network]]s?
* [[Python]]
* Deep Learning Frameworks - [[TensorFlow]] or [[PyTorch]]
* [[Deeplearning.ai Deep Learning Specialization]] - All set
!! [[Certificate|https://www.coursera.org/account/accomplishments/specialization/certificate/QETPFTGCUHH9]]
!! Introduction
<<<
Genetic algorithms are a family of search, [[Optimization]], and learning algorithms inspired by the principles of natural evolution
<<< [[Hands-On Genetic Algorithms with Python]] by [[Eyal Wirsansky]]
A genetic algorithm is a search heuristic that is inspired by [[Charles Darwin]]’s theory of [[Natural Evolution]]. This algorithm reflects the process of [[Natural Selection]] where the fittest individuals are selected for reproduction in order to produce offspring of the next generation.
!! Notion of Natural Selection
The process of natural selection starts with the selection of fittest individuals from a population. They produce offspring which inherit the characteristics of the parents and will be added to the next generation. If parents have better fitness, their offspring will be better than parents and have a better chance at surviving. This process keeps on iterating and at the end, a generation with the fittest individuals will be found. ''This notion can be applied for a search problem''
!! Five phases for GA
#''Initial population'' - An individual is characterized by a set of parameters (variables) known as [[Genes]]. Genes are joined into a string to form a [[Chromosome]] (solution).
#: <img src='https://miro.medium.com/max/695/1*vIrsxg12DSltpdWoO561yA.png' width=300/>
#''Fitness function'' - gives a [[Fitness Score]]. The probability that an individual will be selected for reproduction is based on its fitness score
#''Selection ''- Two pairs of individuals (parents) are selected based on their fitness scores
#''Crossover ''- For each pair of parents to be mated, a crossover point is chosen at random from within the ''genes''
#: <img src='https://miro.medium.com/max/409/1*Wi6ou9jyMHdxrF2dgczz7g.png' width=200 >
#:''Offspring ''are created by exchanging the [[Genes]] of parents among themselves until the crossover point is reached. The new offspring are added to the population
#:<img src='https://miro.medium.com/max/389/1*_Dl6Hwkay-UU24DJ_oVrLw.png' width=200>
#''Mutation'' - In certain new offspring formed, some of their genes can be subjected to a mutation with a low random probability. This implies that some of the bits in the bit string can be flipped
#: <img src='https://miro.medium.com/max/439/1*CGt_UhRqCjIDb7dqycmOAg.png' width=200>
!! Termination
The algorithm terminates if the population has converged (does not produce offspring which are significantly different from the previous generation). Then it is said that the genetic algorithm has provided a set of solutions to our problem.
!! Psuedocode
```bash
START
Generate the initial population
Compute fitness
REPEAT
Selection
Crossover
Mutation
Compute fitness
UNTIL population has converged
STOP
```
!! Applications
* [[Feature Selection]]
* [[Hyperparameter Tuning]]
* improve the performance of artificial neural network-based models by optimizing the network architecture
* Applications to [[Reinforcement Learning]]
** Optimal series of actions
** Optimal parameters for neural controller providing the actions
* [[Genetic Image Reconstruction]]
!! References
* Implementation in Python - [ext[Simple Genetic Algorithm From Scratch in Python|https://machinelearningmastery.com/simple-genetic-algorithm-from-scratch-in-python/]] on [[Machine Learning Mastery]]
* Best article for conceptual understanding - [ext[Introduction to Genetic Algorithms|https://towardsdatascience.com/introduction-to-genetic-algorithms-including-example-code-e396e98d8bf3]] on [[Medium]]
* [[https://www.geeksforgeeks.org/genetic-algorithms/]]
,,[[02 May 2021]],,
* Paste path in windows explorer - `%LocalAppData%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets`
* copy files into a second folder
* open cmd and cd to this new folder
* type `ren * *.jpg` to render all images to jpg and find the wallpapers
<embed src="https://training.github.com/downloads/github-git-cheat-sheet.pdf" width="700" height="100">
[[Github]]
<<<
*GitHub Copilot is a new service from GitHub and OpenAI, described as “Your AI pair programmer”.
* plugin to Visual Studio Code which auto-generates code for you based on the contents of the current file, and your current cursor location
:<img src='https://www.fast.ai/images/copilot/write_text.png' width=400>
* Copilot is powered by a deep neural network language model called ''Codex''
* Since Copilot is trained on publicly available code, under a variety of licenses, one clear legal issue for users of Copilot is that in some cases using Copilot’s suggestions may be a breach of license
<<< [[FastAI]] | [[Is GitHub Copilot a blessing, or a curse?|https://www.fast.ai/2021/07/19/copilot/]] | [[12 August 2021]]
!! My Opinion
* Writing code got simpler - more time will be spent on debugging
# Go to [[https://gist.github.com]]
# upload notebook or file - create secret gist
# share notebook using the URL generated. Example https://gist.github.com/sumitkant/3fb1ecf19d481a2711642b5c37c36e69/#file-samplenotbook-ipynb
# Go to [ext[github.com|https://github.com/]] and create a new repository
#* To avoid errors don't initialize with README and `gitignore`
# Head to the remote location on you PC
# Git bash in the directory of project files
# Initialize - `git init`
# Add files - `git add .`
# Commit - `git commit -m "First commit"`
# At the top of your [[Github]] repository's Quick Setup page, click to copy the remote repository URL.
# Add origin - `git remote add origin <REMOTE_URL>`
# Verify origin - `git remote -v`
# Push to origin - `git push origin master`
!! References
* https://docs.github.com/en/github/importing-your-projects-to-github/importing-source-code-to-github/adding-an-existing-project-to-github-using-the-command-line
[[Preparing for the next role]]
* More than 60% of us try to sidestep communicating negative information and 37% won't even give critical feedback at all
* Strategic genuine one-on-one approach tends to be effective. consider following steps who's gone too long without feedback
*# ''Approach the conversation with [[Empathy]]'': Delivering feedback that exposes a wide gap in self-knowledge demands extra measure of sensitivity
*# ''Test for understanding of the gap'': pinpointing the disparity between person's objective and the outcome of their actions will help identify the gap
*# ''Talk about feelings, not attributions'': Goal is to establish a safe environment in which they can be vulnerable
*#* Identify the good intentions but also mention how they made you feel and the repetitiveness of the actions
*#* Make sure to not invoke others - as they may feel paranoid or ganged up and result in distrust
*# ''Point out patterns'': Offer 3-4 specific examples, help them recognize source of the gap. Keep your emotions in check
*# Help them stay focussed on future: discovering a gap can be disorienting/disheartening for the person. Say //"I am sorry that this feedback feels new. I can only imagine how difficult it is to hear for the first time. I think your best option is to focus on what you can do now rather than what you dd in the past."//
You should not assume someone can't change if they have never been given the chance
!! Reference
[[https://hbr.org/2020/01/giving-feedback-to-someone-who-hasnt-had-it-in-years]]
[[Feedback]] | [[17 October 2022]] | [[HBR]]
* surrogate models try to approximate the prediction function of a black-box model using an interpretable model as correctly as possible, given the prediction is interpretable
* Also known as [[Meta-model]], [[Approximate model]], [[Response Surface Model]], [[Emulator]]
Goals for the rest of the year. Make progress and track here. Document as much as possible
<style>
.goals_table {
table-layout:fixed
}
.green{color:#1dd1a1; font-size:15px;}
.width_control{width:12%;}
</style>
<table class="goals_table">
<thead>
<tr class="tableizer-firstrow">
<th class='width_control'>Dimension</th>
<th class='width_control'>Aug-21</th>
<th class='width_control'>Sep-21</th>
<th class='width_control'>Oct-21</th>
<th class='width_control'>Nov-21</th>
<th class='width_control'>Dec-21</th>
<th>Goal</th>
</tr>
</thead>
<tbody>
<tr>
<td>Coursera</td>
<td> GAN Specialization <i class="green fas fa-check-circle" ></i>
</td>
<td>Natural Language Processing Specialization</td>
<td>TF-Advanced</td>
<td>Practical Data Science</td>
<td> </td>
<td>Learn and Understand Dimensions of Data Science</td>
</tr>
<tr>
<td>Deep-Dive (/mo)</td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>Deepdive into one data science problem</td>
</tr>
<tr>
<td>Blogs/Papers (/mo)</td>
<td>4 <i class="green fas fa-check-circle" ></i></td>
<td>4 <i class="green fas fa-check-circle" ></i></td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>Explore depth on one topic of interest</td>
</tr>
<tr>
<td>Conference (/mo)</td>
<td>4 <i class="green fas fa-check-circle" ></i></td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>Explore Ideas in Data Science</td>
</tr>
<tr>
<td>Kaggle </td>
<td colspan=2>Comptetition 1</td>
<td colspan=2>Comptetition 2</td>
<td> </td>
<td>Implementing learned data science</td>
</tr>
<tr>
<td>Book (/mo)</td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2</td>
<td>6</td>
<td>Learn perspectives, grow personally</td>
</tr>
<tr>
<td>Manager Trait (practice/mo)</td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>[[Preparing for the next role]]</td>
</tr>
<tr>
<td>Music (songs/mo)</td>
<td>2</td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>Get better at drums by practicing </td>
</tr>
<tr>
<td>Investing (Companies/mo)</td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2 <i class="green fas fa-check-circle" ></i></td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>Identify investing opportunities for wealth creation </td>
</tr>
</tbody>
</table>
!! Progress
<table class="tableizer-table">
<thead>
<tr class="tableizer-firstrow">
<th></th>
<th>Aug-21</th>
<th>Sep-21</th>
<th>Oct-21</th>
<th>Nov-21</th>
<th>Dec-21</th>
</tr>
</thead>
<tbody>
<tr>
<td>Coursera</td>
<td>
Completed [[Generative Adversarial Network Specialization]]
* [[Course 1: Build Basic GANs]]
* [[Course 2: Build Better GANs]]
* [[Course 3: Apply GANs]]
</td>
<td>
WIP [[Coursera: NLP Specialization]]
* [[Course 1: NLP with Classification and Vector Spaces]]
* [[Course 2: NLP with Probabilistic Models]]
* [[Course 3: NLP with Sequence Models]]
* [[Course 4: NLP with Attention Models]]
</td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Deep-Dive (/mo)</td>
<td>
* [[Methods to improve performance of Multi-class models]]
* [[Feature Interactions]]
* [[DataPrep.ai]]
</td>
<td>
* [[RNN Interpretability]]
* [[Cryptocurrency]]
* [[Time series]]
</td>
<td>
* [[Change point detection (CPD)]]
* [[Methods for training word vectors]]
</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Blogs/Papers (/mo)</td>
<td>
* [[Detecting and Interpreting Variable Interactions in Observational Ornithology Data]]
* [[A Unified Approach to Interpreting Model Predictions]]
* [[Explainable Artificial Intelligence Approaches: A Survey]]
* [[Jukebox]]
</td>
<td>
* [[Exploring Interpretable LSTM Neural Networks over Multi-Variable Data]]
* [[fbprophet]]
* [[Creating a Market Trading Bot Using Open AI Gym Anytrading]]
* [[Federated Learning]]
</td>
<td>
* [[Efficient Estimation of Word Representations in Vector Space]]
* [[The Same Stories, Again and Again]]
* [[Cryptos want to be regulated, but as what?]]
* [[Bayesian Online Change Point Detection (BOCPD)]]
</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Conference (/mo)</td>
<td>
* [[Rob Chew, Peter Baumgartner - Connected: A Social Network Analysis Tutorial with NetworkX]]
* [[Christoph Deil - Understanding Numba - the Python and Numpy compiler]]
* [[Data Wrangling with PySpark for Data Scientists Who Know Pandas - Andrew Ray]]
* [[EuroPython: Sebastian Witowski - Writing faster Python]]
</td>
<td>
* [[Introduction to Explainable AI (ML Tech Talks)]]
* [[Bayesian Online Change Point Detection - Schroders]]
* [[The Psychology of Trading & Investing by Dr. David Paul]]
* [[Build your first app with Flutter]]
</td>
<td>
* [[Conference: Intro to JAX]]
* [[Conference: Building fair, ethical, and responsible AI with the Responsible AI Toolkit]]
* [[Conference: Can one do better than XGBoost? - Mateusz Susik]] by [[PyData]]
</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Kaggle </td>
<td colspan='2'>
* [[Optiver Realized Volatility Prediction|https://www.kaggle.com/c/optiver-realized-volatility-prediction]]
</td>
<td colspan=2> </td>
<td> </td>
</tr>
<tr>
<td>Book (/mo)</td>
<td>
* [[Ray Dalio: Principles]]
* [[Book: Explainable AI with Python]]
* [[David Epstein: Range]]
</td>
<td>
* [[Adam Grant: Think Again]]
* [[HBR: 10 Must reads for New Manager]]
</td>
<td>
* [[Talking to Strangers]] by [[Malcolm Gladwell]]
* [[Rich Dad Poor Dad]]
</td>
<td>
* [[Noise by Daniel Kahneman]] by [[Daniel Kahneman]]
* [[What the dog saw and other Adventures]] by [[Malcolm Gladwell]]
</td>
<td>
* [[River Out of Eden]] by [[Richard Dawkins]]
* [[Flow]] by [[Mihaly Csikszentmihalyi]]
* [[Originals]] by [[Adam Grant]]
* [[David and Goliath]] by [[Malcolm Gladwell]]
* [[21 lessons for 21st Century]] by [[Yuval Noah Harari]]
* [[Deep Work]] by [[Cal Newport]]
</td>
</tr>
<tr>
<td>Manager Trait (practice/mo)</td>
<td>
* [[How to Project Vocal Confidence]]
* Clear communication in emails and text
</td>
<td>
* Ask What or How questions instead of asking why questions
* Listen deliberately with the intent of listening and not to respond, solve problem or figure out the next steps
</td>
<td>
* Uncover real similarities & offer Genuine Praise
* highlight the importance of exclusive information
* Give what you want to receive
</td>
<td>
* Ask for Help
* Recommend Changes - be a change agent
</td>
<td>
* Solicit Feedback
* Look at things top down
</td>
</tr>
<tr>
<td>Music (songs/mo)</td>
<td>
* Practice [[Shepherds Reign - Legend]]
* Practice [[Jiya Jale Jaan Jale - Metal]]
</td>
<td>
* Practice [[Linkin Park - faint]]
* Practice [[Paramore - Misery Business]]
</td>
<td>
* Linkin Park - A place for my head
*Shephards Reign - Le Manu
</td>
<td>
* Paramore - Ain't it Fun
* Evanescence - bring me to life
</td>
<td>
* Adelle - Hello (Fame on Fire Cover)
* Blackbear - Hot girl Bummer
</td>
</tr>
<tr>
<td>Investing (Companies/mo)</td>
<td>
* [[Fine Organics]]
* [[Alkyl Amines]]
</td>
<td>
* [[LTTS]]
* [[Moldtek Packaging]]
</td>
<td>
* [[Galaxy Surfactants]]
* [[Ultramarine & Pigments]]
</td>
<td>
* [[Paytm]]
* [[Nykaa]]
</td>
<td>
</td>
</tr>
</tbody>
</table>
!! Why am I doing this?
<img src='https://lh3.googleusercontent.com/BDg6anzG7QGy-VF0oSJwwYzOLdvzhCQrj3Yq8H8cvKy9JWtNsovWfPdK7oyhR8UW2EELLlzcjhT7S-c2bShZdMG4JXP4mmxrzzjaj2Ey6ZM9BjIDJrO790ZihIhBSd7sFcWIG-csPHsmffujohyna-OLa42n_YH4M4pXEMEqF-he9r_-yuH7ZsjACUyWQQrse-tkBZjTG414lDh9Fucrlrk_mFsSJmR4Ol8kJRjFUUTJqRRpjVC4HnUTe3CTqMt9DR7HFgkT1a2KsFMQcLIHXcogwrIb-tWHIzutxGGaPpw_ezSTEA3p8Bppt60HzJGhVKSSTN3XvyE03XSRPFtintuKwD66aajldX0Aq3iNJuSXa-KVgXgMwTiz42HX7oq_JitZ5VKCgbTr5397bjxEMJJUNDwaWXcH1LK91_bYWLbYnwQGnSF2p7XgxR3DXbyPq2VB2fnXO79k_yzgcOJRKBlA3hM-ytp-O5Vjec2MoWTxa__rfvwuNhUNnbarDc1VjKHF0rQY-z3zZY_pNTaneAxttj0fuXYKIBid6pA2PrPWd20hPjHhpThfCt91wLHmOPUGxyUz7mw--2aYSeuaGlXDqp3EVTYvwjwC0rwEZB4aiyFmxSklMuOuKVmQdsJ-r6oPi2e4vYGui_sMEtet78a5Mw6sk-wWDzwgempjgdP2tL3lJTvcDoTBsdkB3blELpnIUbXPDKJGzhFmrBe2iUYa1g=w1723-h969-no?authuser=0' width=700>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Todays Gold Price (24 K)</th><th> </th><th> 48,290.00 </th></tr></thead><tbody>
<tr><td>Price 22 K</td><td> </td><td> 44,265.83 </td></tr>
<tr><td>Making Charges</td><td>12%</td><td> 5,311.90 </td></tr>
<tr><td>Before Tax</td><td> </td><td> 49,577.73 </td></tr>
<tr><td>GST</td><td>3%</td><td> 1,487.33 </td></tr>
<tr><td>Weight (gm)</td><td> </td><td> 2.00 </td></tr>
<tr><td>Final Amount</td><td> </td><td> 10,213.01 </td></tr>
<tr><td> </td><td> </td><td> </td></tr>
<tr><td> </td><td> </td><td> </td></tr>
<tr><td>Todays Gold Price (24 K)</td><td> </td><td> 48,290.00 </td></tr>
<tr><td>Price 22 K</td><td> </td><td> 44,265.83 </td></tr>
<tr><td>Making Charges</td><td>12%</td><td> 5,311.90 </td></tr>
<tr><td>Before Tax</td><td> </td><td> 49,577.73 </td></tr>
<tr><td>GST</td><td>3%</td><td> 1,487.33 </td></tr>
<tr><td>Weight (gm)</td><td> </td><td> 10.00 </td></tr>
<tr><td>Final Amount</td><td> </td><td> 51,065.07 </td></tr>
</tbody></table>
<<<
Humans experience peak motivation when working on tasks that are right on the edge of current abilities. Not too hard . Not too easy. Just Right
<<< [[Atomic Habits]]
<img src='https://www.holistics.io/blog/content/images/2021/10/goldilocks-rule.png' width=400>
<<<
Our mission is to organise the world’s information and make it universally accessible and useful.
<<< https://about.google/
!! Interesting Roles
* [[AI Transformation Principal, AI Services, Google Cloud|https://careers.google.com/jobs/results/126933266323120838/]]
* [[AI Consultant, Google Cloud Professional Services|https://careers.google.com/jobs/results/87404556557656774/]]
* [[Data Scientist, Engineering|https://careers.google.com/jobs/results/96397206996558534/]]
!! Process
* Transfers are also easy within Google
!!! Self Reflection
* ''What is something you learned that made everything that came after easier?''
: ''Python''. I learned Python because it was used to do data-science through [[Coursera]] courses. But interestingly, I figured that you could do a lot of stuff like creating ML models, deploying models as web-apps using [[Heroku]] and [[Streamlit]], web scraping with [[BeautifulSoup]], plotting using [[Seaborn]], [[Matplotlib]] and [[Plotly]] and creating interactive dashboards. I think it has freed up my ''cognitive capital'' to help me focus on business side of stuff as well. When i joined AmEx, i was already aware of some python and I was already helping tenured co-workers accomplish tasks.
* ''Have more of your achievements come as a result of solitary effort or teamwork?''
: Most of my achievements were ''solitary'' effort, but that's because I have been involved in solitary tasks like building models, conducting some analysis. I have definitely mentored 3 interns and onboarded new colleagues. FRP was one of the big achievements that came out as a result of team work, but most of them are solitary.
* ''What do you enjoy more, solving problems or pushing the discussion forward?''
: I definitely enjoy solving problems.
* ''What is the most rewarding job you've ever had? Why?''
: The one I am currently doing at Amex. It is rewarding in the sense that I have always worked on multiple priorities at a time and also able to deliver. I also get recognized for the effort and the work changes to accommodate my learning and complexity. So it is intellectually rewarding as well.
* ''Describe the best team you ever worked with. What made that experience stand out?''
: My current team at Amex. Complete ownership of one project per person.
<embed src="https://drive.google.com/viewerng/viewer?embedded=true&url=https://cerre.eu/wp-content/uploads/2020/07/ai_explainability_whitepaper_google.pdf
" width="1000" height="375">
gplearn implements [[Genetic Programming]] in [[Python]], with a [[scikit-learn]] inspired and compatible API.
!! Reference
[[https://gplearn.readthedocs.io/en/stable/]]
Gradient Boosting is a [[Machine Learning]] technique for [[Classification]] and [[Regression]] problems which produces a prediction in the form of an ensemble of weak models (typically [[Decision Trees]])
# [[Lie Factor]]
# Show data variation not design variation
# When showing time series for money, always standardize data for inflation and population
# Number of dimensions in information carrying variable <= number of dimensions in the data
# Graphics often lie by omission
,,[[The Visual Display of Quantitative Information]] | [[1 June 2020]],,
# Ineft graphics flourish because many graphic artists believe that statistics is boring and tedious. If this is true then, your numbers are boring
# Can judge the content of a publication by counting the number of graphical elements containing relational graphs. Japanese publications have a higher quantity in them
# ''Double standard of sophistication'' - stupid graphs and serious prose
# ''Graphical Mediocrity'' - lack of substantiative quantitative skills of illustrators and contempt of the intelligence of the audience. This is blaming the victim - both audience and data
# ''Graphical Competence'' - demands 3 different skills - the substantiative, statistical and artistic
<<<
''Fundamental principle of good statistical graphics - Above all else show data''
<<<
* ''Data-Ink Ratio'' - Maximize [[Data-Ink Ratio]], within reason. Maximize by erasing non-data ink
* Two erasing principles
** Erase non-data ink, within reason
*** Redundant data ink
*** Bilateral symmetry creates redundancy - chop the graphic in half if symmetrical
*** Preserve redundancy for context, aesthetic balance and order to complexity
** Effectively use the space created by erasing for labelling
,,[[The Visual Display of Quantitative Information]] | [[1 June 2020]],,
This option permits the underwriters to buy up to additional 15% of the shares at the offer price if the price of newly listed shares starts to fall below the issued price
Gridsearch is a hyperparameter tuning method that searches over all combinations of specified set of hyperparameter values
* It is computationally expensive and time consuming to evaluate all possible combinations
refers to [[Perseverance]] and [[Consistency]] in working towards a goal.
* The reasons that [[Stereotype]]s are so sticky, is that we tend to interact with people who share them which makes them even more extreme
* Polarization is reinforced by [[conformity]] which is peripheral members fit in and gain status by following the lead of the most prototypical member of the group, who often holds the most intense views
,,[[Adam Grant: Think Again]] | [[14 November 2021]],,
* When everyone in a group starts thinking alike. No one disagrees. No one takes a critical stance. It can lead to catastrophic decisions
* Often can come right out of a fixed mindset
* ''Preventing groupthink'' : Technique used by Persians - Whenever a group reached a decision while sober, they later reconsidered it while intoxicated
* relieving people of the illusions or the burdens of fixed ability—leads to a full and open discussion of the information and to enhanced decision making
A belief that growth and learning is possible - says [[Carol Dweck]]
<embed src="https://www.h2o.ai/wp-content/uploads/2019/08/An-Introduction-to-Machine-Learning-Interpretability-Second-Edition.pdf" width="1000" height="375">
,,tags: [[Machine Learning]] | [[H2O.ai]] | [[ML Interpretability]],,
<img src='https://jamesclear.com/wp-content/uploads/2013/02/The-habit-loop-01-e1537283945960-768x949.png' width=400>
* It is a method to build new [[Habit]]s.
* The formula for habit stacking is - ''After [CURRENT HABIT], I will [NEW HABIT]''.
* It increases the likelihood of sticking to the new habit
* It has implicit time and location built into it
<img src='https://jamesclear.com/wp-content/uploads/2014/07/Habit-stacking-01-1086x1200.png' width=500>
Entrepreneurs are paid roughly their current salary for a year as they push their concept toward beta stage and one stop closer to market and profitability
HDFS (Hadoop Distributed File System) is the file system in the Hadoop ecosystem. Hadoop and Spark are two frameworks providing tools for carrying out big-data related tasks. While Spark is faster than Hadoop, Spark has one drawback. It lacks a distributed storage system. In other words, Spark lacks a system to organize, store and process data files
!! Differences between HDFS and AWS S3
Since Spark does not have its own distributed storage system, it leverages using HDFS or AWS S3, or any other distributed storage.
Although it would make the most sense to use [[AWS S3]] while using other AWS services, it’s important to note the differences between AWS S3 and HDFS.
* ''AWS S3'' is an ''object storage system'' that stores the data using key value pairs, namely bucket and key, and ''HDFS'' is an ''actual distributed file system'' ''which guarantees fault tolerance''. HDFS achieves fault tolerance by having duplicate factors, which means it will duplicate the same files at 3 different nodes across the cluster by default (it can be configured to different numbers of duplication).
* HDFS has usually been ''installed in on-premise systems'', and traditionally have had engineers on-site to maintain and troubleshoot Hadoop Ecosystem, which cost more than having data on cloud. ''Due to the flexibility of location and reduced cost of maintenance, cloud solutions have been more popular''. With extensive services you can use within AWS, S3 has been a more popular choice than HDFS.
* Since AWS S3 is a binary object store, ''it can store all kinds of format, even images and videos''. HDFS will strictly require a certain file format - the popular choices are avro and parquet, which have relatively high compression rate and which makes it ''useful to store large dataset''.
,,[[12 July 2020]] | [[Lesson 4 : Spark by Udacity]],,
Hadoop MapReduce is a specific implementation of [[MapReduce]]
!! Demo
!!! ''Problem : Count the number of times a song was played listed in the file songplays.txt''
1. Install mrjob library. This package is for running MapReduce jobs with Python
```python
! pip install mrjob
```
2. Write a python file with class and defined Mapper and Reducer functions.
* ''Map'': each line in the `.txt` file is read as a `(key, value)` pair
* ''Reduce'': combine all tuples with the same key
```python
%%file wordcount.py
from mrjob.job import MRJob
class MRSongCount(MRJob):
def mapper(self, _, song):
yield (song, 1)
def reducer(self, key, values):
yield (key, sum(values))
if __name__ == "__main__":
MRSongCount.run()
```
!! Summary
* ''songplays.txt''
```bash
Deep Dreams
Data House Rock
Deep Dreams
Data House Rock
Broken Networks
Data House Rock
.
.
.
```
* ''Map Step''
```python
(Deep Dreams, 1)
(Data House Rock, 1)
(Deep Dreams, 1)
(Data House Rock, 1)
(Broken Networks, 1)
(Data House Rock, 1)
```
* ''Reduce Step''
```python
(Deep Dreams, [1, 1, 1, 1, 1, 1, ... ])
(Data House Rock, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...])
(Broken Networks, [1, 1, 1, ...]
```
* ''Output''
```python
(Deep Dreams, 1131)
(Data House Rock, 510)
(Broken Networks, 828)
```
!Introduction
<<<
If I am to speak for ten minutes, I need a week for preparation; if fifteen minutes, three days; if half an hour, two days; if an hour, I am ready now.
<<< [[Woodrow T. Wilson]]
!! Planning a presentation
<img src='https://lh3.googleusercontent.com/MEXGpdKvdVud0QsCTHKf9Ph9nqcXSbrPiibafYguv2uAPkXqD7EWUBdMgMnehhaQUBj_N9qQ6JOEdKX74j7oN8CrUrhJ3Ypp36PpAJmDcz_xFzNKQhV8uUXrSH6lK3Kem8GuCfTOONANhrV8-danjH0f02tGffX9k5URtGrAGq-jCBaiJl0dZqJmcNbBMJ9MEDh94a8JmDFF55GkMv14VEJMWtZzMoRtc-8Qg5gVRcnyeQeASYacVTQSnXCFGTaBbr12b27r9AxZZYGmztu7hjKFgBqerD-fFHGxPIBMs7UChHP4SuVd2YPvT2845yTcvG6OZcVFqPAXKx4jAQVbHTB_CMu9AAe4acS5BXcDEOnqkI49l6q_0TcS3_9G32TFcRl1xpYcufgRnBwEfiZVS_qB8EKn1armSuQh7bptqnmt6yK0U6NeYd9tV-wdMEHa9Gb6dBsvVIlnz9jm7Pe2kc0hy84OZp_HF75xbxM2DnZZqFl6V3xCsUTf_JR0w5D0ir1hCpQ5_louoUjLeBeegmoaOYpB5krAWADyVeaDfQw8xQs5qIaiIJgn5_Je3Qu91zalV99tbEwrjfYUMw8wBE6VPnGe8j9CZJBciX8ogidRIqMBD_9I_2l6ggtSFYq4oFglkVw160Dc2-1cQ6xZIpjBvW8C4-ALj9mukIWeqzh-JgbLtO3cNUZkF1ohwnqMAZiCQX62rCNV_hsXigLErgDXcQ=w580-h701-no?authuser=0'
width=400>
When audiences can see that you’ve prepared—that you care about their
needs and value their time—they’ll want to connect with you and support you.
,,Tags: [[Book: HBR Guide to Persuasive Presentations]] | [[12 April 2021]],,
! Audience
<<<
Designing a presentation without an audience in mind is like writing a love letter and addressing it “to whom it may concern.”
<<< [[Ken Haemer]]
,,Tags: [[Book: HBR Guide to Persuasive Presentations]] | [[12 April
2021]],,
!! History of [[A/B Testing]]
* [[A/B Testing]] has been around since 100s of years
* [[Ronald Fischer]] used to run agricultural experiments in 1920s - "What if I add more fertilizer"
* 1950s - [[Medicine]] used them for [[Clinical Trial]]
* 1960s & 1970s - [[Marketer]] adapted them for campaigns
!! How to run tests?
* Simplest way to run test is by setting up [[Randomized Controlled Experiments]]
** In this a sample is randomly distributed between two groups - control and test ** A metric is measured between control and test - and the lift is measured
** lift is the percentage gap between test and control
!! Mistakes in [[A/B Testing]]
* Many managers don't let the tests run their course - since everything is real time - making decisions quickly comes out of impatience
* Tracking too many metrics. Ideally, the metric to be tracked/optimized has to be designed or identified before the experiment is run
* Don't retest enough - Experiments must be retested if the assumptions still hold true
!! Reference
* [[https://hbr.org/2017/06/a-refresher-on-ab-testing]]
,,[[HBR]] | [[02 June 2022]],,
* Learning to become a manager is like having a child. On X - 1 you are an IC, suddenly on day X you need to know everything there is to know about having a child
* The transition for the new managers are less documented
!!! Why Learning to Manage Is So Hard?
* first things new managers discover is that their role, by definition a stretch assignment, is even more demanding than they’d anticipated. They are surprised to learn that the skills and methods required for success as an individual contributor and those required for success as a manager are starkly different
* Success now depends on setting the agenda for the whole group instead of personal expertise and actions
* Learning to lead is the process of learning by doing - cannot be taught in the classroom
* Psychological adjustment is taxing
!!! A new manager's misconceptions
<img src='https://hbr.org/resources/images/article_assets/hbr/0701/R0701D_A.gif'>
!!! Managers wield significant authority
* new managers focused on authority, rather it comes with inter-dependency due to which their work becomes constrained
* daily routine is pressured, hectic and fragmented
* goes beyond managing the team of direct reports and requires managing the context within which the team operates
* The people most likely to make a new manager’s life miserable are those who don’t fall under her formal authority: outside suppliers, for example, or managers in another division
!!! Authority flows from manager's position
* Autocratic is not the best way
* Source of power is everything but 'formal authority' - ''authority emerges as manager established credibility with subordinates, peers and superiors''
* Need to demonstrate ''competence instead of proving technical prowess'', the foundations of success as individual performers. Technical competence is important in gaining subordinates' respect but not ultimately the primary area
* jump in and try to solve problems will raise implicit questions about managerial competence
!!! Qualities that contribute to credibility
* Need to demonstrate ''character — the intention to do the right thing''. This is of particular importance to subordinates, who tend to analyze every statement and nonverbal gesture for signs of the new boss’s motives.
* Need to demonstrate ''competence — knowing how to do the right thing''. This can be problematic, because new managers initially feel the need to prove their technical knowledge and prowess. Instead listen
* Need to demonstrate ''influence — the ability to deliver and execute the right thing''. Nothing worse than working for powerless boss. Authority $$\neq$$ influence. Influence built by creating a web of strong, interdependent relationships, based on credibility and trust, throughout his team and the entire organization—one strand at a time
!!! Managers must control their direct reports
* Compliance $$\neq$$ commitment. If people aren't committed, they won't take initiative, leading to manager not being able to delegate effectively
* Exercised influence by creating a culture of inquiry - ask and ask to get to the bottom of something and also ensure consistency
* The more power managers are willing to share with subordinates in this way, the more influence they tend to command. When they lead in a manner that allows their people to take the initiative, they build their own credibility as managers.
!!! Managers must ensure that things run smoothly
* Instead of blaming the system, they should be the change agents that are responsible for recommending and initiating changes that will enhance their groups performance. This means challenging org processes that lie above and beyond their formal authority
* This broader view benefits the organization as well as the new
manager
!! References
* [[Becoming the boss|https://hbr.org/2007/01/becoming-the-boss]]
<<<
The ability to learn faster than your competitors may be the only sustainable competitive advantage
<<< Arie de Gues, Business Theorist
To [[Learn]] we must resist the bias of doing new things, scanning the horizon for growth opportunities and pushing yourself to acquire radically different capabilities while performing your job. The four attributes help
!! 1. Aspiration
First roadblock in learning. Instead of questioning the challenges of the new thing, shift the mindset to focus on the benefits
!! 2. Self Awareness
We are generally inaccurate in our assessment of self. [[self-awareness]] requires soliciting [[Feedback]] and recognize how others see them. Instead of responding defensively, we should ask ''Is that accurate? What facts do I have to support it?''
!! 3. Curiosity
Instead of saying this is boring - be curious and identify why do others find it interesting. You need to find just one thing about a boring topic to spark your curiosity
!! 4. Vulnerability
Acknowledging that you are novice at something at the beginning makes you less foolish and more relaxed. on learning something new, you are going to be bad at it first, but you can learn it overtime
!! Reference
[[Learning to Learn|https://hbr.org/2016/03/learning-to-learn]] from [[HBR]]
,,[[15 August 2022]] ,,
!! [[What to make of HDFC Life’s recent performance?|https://finshots.in/markets/what-to-make-of-hdfc-lifes-performance/]]
* Leading insurers in the country
* [[ULIP]]s were designed as part insurance part investment products which were easy to sell, since to the customer it felt as if they are making the bargain
* Standalone insurance products are however high margin business, because you only need to cover the cost of death/catastrophe, but they are harder to sell
* Thanks to [[COVID-19]] these were sold large in number, but because of the same reason the margins were under-pressure because of the second -wave. They will continue to be under pressure and in the upcoming waves
* HDFC life has to be cautious about being to revise their risk underwriting guidelines, which is also making medical checkup mandatory, even though there is massive rush for pure-protection high margin products right now
Increasing the odds of people acting with courage by teaching them the principles of heroism.
,,Tags: [[08 April 2021]],,
!! Resources
[[Markov Chain]]
this part of the brain helps establish memory. Hippocampus plays a key role in assembling an imagined future by recombining information from our past.
<<<
Brain mechanisms that underlie memory: their purpose is not simply to record what has gone before but also allow us to project forward into the future.
<<< [[Book: The Brain - The Story of you]]
!! Accountability Problem
* //That's not my job//
* //I finished my part of the project//
* //No one asked me to do that, it's not my problem//
* //It's not fair, I am always stuck with that task//
* //They don't pay me enough for this//
!! What's your team's //Why?//
# Why is your team a team?
# Why is your work important?
# Why is that important? - at this point your team might become defensive - stress on the fact that your role in bigger picture matters
# Why is that (answer to 3) important?
# Why does that (answer to 4) matter?
!! Connection to the team
* Emotional pain has similar effect as physical pain on the brain - important to foster a culture of belonging
* Develop shared goals
* Give voice to everyone on your team
* Empower team decision making
!! Ownership of team deliverables
*
<iframe width="700" height="394" src="https://www.youtube.com/embed/8HslUzw35mc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* 42% of lawyers believed that in the next 3 to 5 years as much as 20% of regular, day-to-day legal works could be performed with [[AI]]
* 94% of law practitioners favoured research and analytics as to the most desirable skills in young lawyers.
* 75% of the cases are more than 1 year old
* 3.7 million cases were pending across various courts in India - based on [[National Judicial Data Grid (NJDG)]]
* Even though the legal sector in India is one of the largest, is highly ''under-digitalised''
* [[ROSS Intelligence]] - online legal research tool built upon IBM’s Watson, has been helping lawyers in mining information from tonnes of legal paperwork through [[Natural Language Processing (NLP)]]
!! Indian companies in the legal-tech space
* [[LegalKart]] - AI-based app that connects clients with the best lawyers available in their vicinity, based in [[Gurugram]]. Clientele includes big names such as Ola and ZoomCars
* [[SpotDraft]] - AI-based contract management platform that helps customers draft, review, manage and sign contracts. Founded in 2017, SpotDraft has processed over 6,000,000 contracts
* NCR-based startup CaseMine - make legal research and analysis more in-depth and comprehensive as opposed to a regular search
* Mumbai-based startup [[Pensieve]] provides an AI-system that understands legal documents
“National Policy and Action Plan for Implementation of Information and Communication Technology in the Indian Judiciary” was formulated in 2005 for greater accessibility. ''Progress has been slow due to resistance from the stakeholders''
!! Reference
[[How AI & Data Analytics Is Impacting Indian Legal System|https://analyticsindiamag.com/how-ai-data-analytics-is-impacting-indian-legal-system/]]
!! Building Rapport
* Finding Commonality - they like you and you like them
* Play to your strengths
* Can improve the outcome of [[Negotiation]]s
* Be intentional about it - if you have analytical personality
* ''Amateur Negotiators - Negotiation is the point (but it is actually 1% of negotiation)''
* If someone likes you then they will make concessions - you are more persuasive.
* ''Closeness - make it seem like you are on the their side''
* Not sitting across - but sit on the same side
* If somebody is demonstrating resistance, and your immediate response is to negate what they just said, Oh you should not feel this way or no you are wrong because X,Y,Z - now they are almost obligated to counteract with approximate amount of force. ''You are suggesting'' - this means you are on their side, you understand them and they don't feel the need to resist stronger. Like bull fighting - matador moves to side when bull approaches.
* Instead of using force, redirect - starts with acknowledgement
!! Staying Strong
* Some negotiations will be hostile from the get go.
* ''Keep head still when getting slammed'' - if nodding, it asks them to keep going (gives them validation, this is what gets craved in these situations). When still, it makes them unnerved and uncomfortable. They think they built a good rapport and now they are not getting validation - it pulls them to negotiate with themselves
* ''Feel conviction in your position'' - weather the storm and don't run for the hills when you get slammed
* Use this tactic for [[Confrontational Negotiation]]s
* [[Getting to Yes]] - principled negotiations
* ''Hold your cards to the chest''
** Negotiation barter - this deal point for that deal point
** For example, buying a car, you portray that your heart wanted red but this car is blue (they don't know this is not important for you but they feel it was important for you), so you knock off 500$ off the price.
* Going against a hard-bargainer and you are completely win-win collaborative, then it is going to be a problem for you!
* ''So, start soft, if they reciprocate then continue else switch your strategy to hard style''
!! Posturing
* Negotiation equivalent to poker. Posturing in law is important
* Analogy - Don't go without weapon, but try not to use it unless it is needed
* [[BATNA]] - Best Alternative to a Negotiated Agreement - Your backup plan
** ''Working on improving your BATNA is #1 to do''. For example, If big job offer, then other alternative is to get another job on the table. Not necessarily an offer, but even a scheduled interview will give a psychological boost that this job offer is not everything and you have somethin up the sleeve.
** Usually you are underestimating your BATNA and overestimating others BATNA. But they would have similarly bad than yours and that is why you are negotiating in the first place
,,Tags: [[LinkedIn Learning]] | [[04 July 2021]],,
* Be curious
* Work Hard
* Get lucky
<iframe width="560" height="315" src="https://www.youtube.com/embed/L1kbrlZRDvU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[08 April 2021]]
!! Summary
Research consistently shows that people experiencing meaningful
work report better health, well-being, teamwork, and engagement; they bounce back faster from setbacks, and are more likely to view mistakes as learning opportunities rather than failures. Research suggests that there are four key personality characteristics that determine leaders’ ability to make other people’s jobs more meaningful: They are curious and inquisitive; they are challenging and relentless; they hire for values and culture fit; and they are able to trust people. All four qualities ought to exist in concert. A boss who is challenging but not curious may come across as a bully, while a boss who’s trusting but not challenging will seem like a pushover. In short, there is a clear difference between making work
!!
,,[[HBR]] | [[16 January 2022]],,
!! How to present a conflict
* Presenting a conflict, assuming innocence on the other side and not taking a bait
!! The difference a high impact voice makes
* Reducing the power of voice by using filler words like ''um, aa, you know, right, so, just, '' etc. Vocal crook, Uptalk
* Disproportionately hurts women more
!! How to breathe correctly when speaking
* Exhaling while you are speaking. Project voice forward and don't hold breath
* take more frequent breaths
* squeaky voice at the end of sentence - don't trail off - don't cut off air
!! Weak words to purge from vocabulary
* saying Just - asking permission - we apologize on what we are going to say next as opposed to owning the words. In American Sign Language, the translation of just is //shrugging shoulders//. Stand tall and declare proudly
:<img src='https://image.emojipng.com/877/339877.png' width=200>
* ''Obviously'', ''actually'', ''basically'' - unnecessary risk taking - declaring the other person is not as smart as you
!! Key questions for preparing your message
* ''Who's your audience'' - How they are going to feel about what you are going to say - choose your argumentation, structure, your stories, your data
* ''What's your goal'' - Every speech is opportunity to influence. Be purposeful in advance of your speech or presentation - put a very clear call to action
* ''Why you'' - Why do you care what you are talking about - tap into more deep and authentic sense of purpose about why this issue is critical. If nervous, give you confidence that what you have to say is important and you are reframing it as not being about you - it's a creativity booster
!! How to deepen your why
* Build a powerful story that is professional and is also personal
!! How to sound polished when speaking
* The biggest thing Most people overlook - ''Reading your speech out loud''
* When you listen to something out loud - you think critically, does this sound good?
* Reduce the speech to key bullet points and outline
!! Using effective eye contact, body language and vocal variety
* ''Eye contact Recommendation ''- speak to one person at a time. Pick someone in the room and deliver a full sentence to them or full thought and then look at somebody else - ''really calms people down''
* ''Body Language should be purpose full'' - ringing your hands, hair - demonstrates to the audience that you are nervous - practice different body language in advance and hand-gestures to reinforce the message
* ''Vocal variety'' - make it conversational - bring your best voice as opposed to nervous voice
!! Project Natural Authenticity
* ''Natural body language does not always come naturally'' - Funny
* practice different gestures in the mirror and see what looks natural
!! Public Speaking is a skill, not a talent
* public speaking happens every single day
** asking a question in an audience
** Speaking on conference call
** Interviewing, pitching, speaking to clients
* ''Public speaking is about finding your voice and courage to speak''
* Challenge yourself - come to every single meeting prepared with ''one point'' that you will be going to make to further the conversation
,,Tags: [[LinkedIn Learning]] | [[16 July 2021]],,
There are five core concepts I see as crucial to keep in mind as you think about the second half of your career and building this platform
!! 1. Entrepreneurialism
adopt an entrepreneurial mindset and proactively put myself and my ideas out in the open in an effort to attract opportunities
!! 2. Self-confidence
There’s one story that hasn’t been told yet: yours. Your unique life experiences, diverse paths to your current position and obstacles overcome are the core of your newfound expertise platform. Your experience has value, your knowledge has value, and you have something valuable to add to the conversation. No one has your story
!! 3. Continuous learning
The only way to keep up — or even better, stay ahead — is to keep learning. You learn continuously by reading blog posts and books, and listening to podcasts and audiobooks
!! 4. Continuous improvement.
Enthusiastically skeptical of everything that you’re doing. In other words, you should always want to figure out a better way to do something.
!! 5. Reinvention
Ultimately, becoming forever employable is all about reinventing yourself. In 2018, [[Google]] revealed that it runs over 500 million tests a day, equating to more than 4 million relaunches of existing and new systems each and every day. That’s the modern pace of change. If you want to stay forever employable, then you’ve got to be ready to reinvent yourself with the times. And that is coming in shorter and shorter cycles.
Keeping them motivated by finding work
''1. Improving the machine - by automation''
* Team doing mundane tasks is an opportunity to automate - generation of reports/dashboards
''2. Augmenting the machine - by filling gaps''
* Take an existing project, break them into parts, identify where we could have done better, make a plan to improve the process and select a metric to improve performance
** ''Business Problem $$\rightarrow$$ Data science problem'': largely fixed - could brainstorm, could the problem be defined unconventionally - [[Conference: Data Science and AI Summit]] - Airtel talked about expanding business and converted into a deep learning problem
** ''Data Collection'': What dimension did we miss adding to the variables? or Dark Data - what data are we not using that is readily available
** ''Modelling'': researching a new technique - will a new technique do a better job of fitting the problem at hand
** ''Deployment''
** ''Governance''
** ''Model Explainability'' - is the current model simple and explainable
,,[[Preparing for the next role]] | [[20 September 2021]],,
By encouraging stress that is a result of problem solving or struggle that often makes the work meaningful (Research suggests that humans are happier when busy and post retirement the risk of depression increases by 40%)
* ''problem solving'' or facing a challenge - solving problems where solution is not in sight (FRP, Auto-retrain)
* being ''out of comfort zone''
** trying out something new
** engaging with a new partner or leader (Engagement Models)
** Mentoring a colleague/intern
And minimizing stress related to timelines, work life balance ''by acknowledging that the stress exists and reframing it in a problem solving mindset''
* ''timelines'' - (//My leader usually mentions that don't take to much pressure, if you are able to solve then nothing like it//) - this essentially removes timeline pressure and converts the mindset to problem solving
* ''work life balance'' -
,,[[Preparing for the next role]] | [[26 November 2021]],,
In project the decision points are what, how and when? Partners and teams have usually figure out what, the conflicts arise on how and when?
* Approach/Ideas - How to do it?
** Evaluating through POC. To approximate the impact of an approach - build a POC to try out multiple approaches to simulate the impact of the approach through selected metrics. Example,
* Deliverables & Timelines - When to do it?
** Work out through prioritization of projects - example engagement model. Prioritized retention model by checking with the partners as well as leaders to deliver the most pressing project first and asking about the ''realistic timelines of usage'' from partner's point of view.
,,[[Preparing for the next role]] | [[20 September 2021]],,
[[Preparing for the next role]]
* Loss function used in [[Regression]]
* less sensitive to [[Outlier]]s
* This function is quadratic for small values of a, and linear for large values
* Hugging Face is a leading NLP company that offers a suite of open-source software tools and libraries for natural language processing.
* Hugging Face is best known for developing the Transformers library, which includes pre-trained language models that can be fine-tuned for specific NLP tasks, such as text classification and question-answering.
* Hugging Face also offers a range of other NLP tools and services, including chatbot development platforms, tools for training custom language models, and integrations with popular machine learning frameworks.
https://huggingface.co/models
Hyperopt is an open-source [[Python]] library the implements [[Bayesian optimization]] using the [[Tree Parzen Estimator]] algorithm to construct the surrogate function and select the next [[Hyperparameter]] values to evaluate in the objective function.
!! Implementation in Python
```python
from hyperopt import hp, Trials, tpe, fmin, STATUS_OK
from hyperopt.pyll.stochastic import sample
# Define Objective function
def objective(hyperparameters):
"""Objective function for Gradient Boosting Machine Hyperparameter Optimization.
Writes a new line to `outfile` on every iteration"""
# Keep track of evals
global ITERATION
ITERATION += 1
# Using early stopping to find number of trees trained
if 'n_estimators' in hyperparameters:
del hyperparameters['n_estimators']
# Retrieve the subsample
subsample = hyperparameters['boosting_type'].get('subsample', 1.0)
# Extract the boosting type and subsample to top level keys
hyperparameters['boosting_type'] = hyperparameters['boosting_type']['boosting_type']
hyperparameters['subsample'] = subsample
# Make sure parameters that need to be integers are integers
for parameter_name in ['num_leaves', 'subsample_for_bin', 'min_child_samples']:
hyperparameters[parameter_name] = int(hyperparameters[parameter_name])
start = timer()
# Perform n_folds cross validation
cv_results = lgb.cv(hyperparameters, train_set, num_boost_round = 10000, nfold = N_FOLDS,
early_stopping_rounds = 100, metrics = 'auc', seed = 50)
run_time = timer() - start
# Extract the best score
best_score = cv_results['auc-mean'][-1]
# Loss must be minimized
loss = 1 - best_score
# Boosting rounds that returned the highest cv score
n_estimators = len(cv_results['auc-mean'])
# Add the number of estimators to the hyperparameters
hyperparameters['n_estimators'] = n_estimators
# Dictionary with information for evaluation
return {'loss': loss, 'hyperparameters': hyperparameters, 'iteration': ITERATION,
'train_time': run_time, 'status': STATUS_OK}
# Define Space
space = {
'boosting_type': hp.choice('boosting_type',
[{'boosting_type': 'gbdt', 'subsample': hp.uniform('gdbt_subsample', 0.5, 1)},
{'boosting_type': 'dart', 'subsample': hp.uniform('dart_subsample', 0.5, 1)},
{'boosting_type': 'goss', 'subsample': 1.0}]),
'num_leaves': hp.quniform('num_leaves', 20, 150, 1),
'learning_rate': hp.loguniform('learning_rate', np.log(0.01), np.log(0.5)),
'subsample_for_bin': hp.quniform('subsample_for_bin', 20000, 300000, 20000),
'min_child_samples': hp.quniform('min_child_samples', 20, 500, 5),
'reg_alpha': hp.uniform('reg_alpha', 0.0, 1.0),
'reg_lambda': hp.uniform('reg_lambda', 0.0, 1.0),
'colsample_bytree': hp.uniform('colsample_by_tree', 0.6, 1.0),
'is_unbalance': hp.choice('is_unbalance', [True, False]),
}
# Run optimization
best = fmin(fn = objective, space = space, algo = tpe.suggest, trials = trials, max_evals = MAX_EVALS)
```
* ''Learning Rate'' - Using log-uniform space for the learning rate defined from 0.005 to 0.5. With a log-uniform distribution, there will be an equal chance of drawing a value from 0.005 to 0.05 and from 0.05 to 0.5 (in linear space far more values would be drawn from the later since the linear distance is much larger. The logarithmic space is exactly the same - a factor of 10)
* ''Number of Leaves'' - can use linear space
* ''Conditional Parameters'' - some parameters does not work with others. For example, "goss" cannot work with subsample in [[LightGBM]] and has to be `1.0`
* The `best` object holds only the [[Hyperparameter]]s that returned the lowest loss in the objective function. Although this is ultimately what we are after, if we want to understand how the search progresses, we need to inspect the `Trials` object.
Reference
* [ext[Automated Model Tuning|https://www.kaggle.com/willkoehrsen/automated-model-tuning]] article on [[Kaggle]]
,,[[04 July 2020]],,
Hyperparameter tuning is the process of selecting optimal hyperparameters (the values that are set for learning algorithm) for the learning algorithm for a given problem. The objective is to find a set of hyperparameters where
* the model generalizes well
* Balances [[Bias-Variance Trade-off]]
Parameters are ''learned ''by the model during learning while Hyperparameters are ''set by the user'' before learning.
!! Methods
* [[Grid Search]]
** trying all possible combinations of set of hyperparameters
** computationally expensive to train N models for N grid search hyperparameters
* [[Random Search]]
** Randomly chooses combination of hyperparameters from a searchable space
** Computationally cheap and may find parameters pretty quickly
** Hyperparameter selection process does not have any control over selection
* [[Bayesian optimization]]
** Works on [[Bayes' Rule]]
** Based upon Bayes Rule and considers previously known knowledge to help narrow down the search space of good hyperparameter combinations
!!! Time Complexity
Grid Search > Bayesian Search > Random Search
!! References
* [[Intuitive Hyperparameter Optimization : Grid Search, Random Search and Bayesian Search!|https://towardsdatascience.com/intuitive-hyperparameter-optimization-grid-search-random-search-and-bayesian-search-2102dbfaf5b]] on [[Medium]]
!! What is icecream?
''Icecream'' is a [[Python]] library that makes print [[debugging]] more readable with minimal code.
!! Installation
```python
pip install icecream
```
!! Usage
```python
from icecream import ic
def plus_five(num):
return num + 5
ic(plus_five(4))
ic(plus_five(5))
```
!! Advantages
# Separates print from debugging. Can easily delete icecreamed statements later
# Can inspect execution by just using `ic()` without additional text to locate where the code was executed
# Displays arguments of a function with the output
# Can use time as custom prefix
# Can add more content of line and file the code was executed from
!! Resources
* [ext[Stop Using Print to Debug in Python. Use Icecream Instead|https://towardsdatascience.com/stop-using-print-to-debug-in-python-use-icecream-instead-79e17b963fcc]]
* [[Graph Methods]] in [[Machine Learning]]
* Exploring External Variables
* [[Rapids]] based [[Machine Learning]] for faster pipeline execution
* [[UGBoost]]
* [[Time Series]] based [[Machine Learning]]
* Time Series based features
* [[NGBoost]] or confidence based predictions
* Multi model implmentation
* Intuitive incremental model building using multiple algorithms - [[EVOLVE]]
* [[Isolation Forest]] to remove [[Outlier]]s from Baseline and Incremental Models
* Pipeline Enhancements
** Add one pager model summary
** Suitable for Classification & regression
** One shot governance outputs
** Curve for overfitting and underfitting
** Faster [[Grid Search]] by training on 2000 trees and scoring at multiple cuts using `ypred = bst.predict(dtest, iteration_range=(0, bst.best_iteration + 1)) ` & early stopping
,,[[Idea Book]] | [[27 August 2022]],,
Linear models assume that the independent variables, X, take a linear relationship with the [[Dependent Variable]], Y. This relationship can be dictated by the following equation:
$$Y \sim \beta_0 + \beta_1X_1 + \beta_2X_2 + ... + \beta_nX_n$$
Here,
* $$X$$ = [[Independent Variable]]s
* $$\beta$$ = coefficients that indicate a unit change in Y per unit change in X
Failure to meet this assumption may result in poor model performance
!! Two ways to identify Linear Relationship
!!! [[Scatter plot]]s
!!! [[Residual Plot]]s
* Error = Target - Predictions
* if relationship is linear - residuals follow [[Normal Distribution]] centered at 0, while values should vary homogenously along the values of independent variables
* Using seaborn displot to create plot on residual distributions
```python
sns.displot(data=penguins, x="flipper_length_mm", kde=True)
```
<img src='https://seaborn.pydata.org/_images/displot_7_0.png' width = 400>
!! The Problem
<img src='https://img.etimg.com/photo/msid-52088975,quality-100/.jpg' style='float:right; padding:1em'>
* The problem is that lot of third party sellers end up listing fake products of vaguely similar to original branded products - that leads to
* [[E-Commerce]] perfect channel for counterfeits
<<<
“Third-party sellers are kicking our first-party butt,” Amazon CEO Jeff Bezos told shareholders in a 2019 letter, calling the increase—from 3 percent of sales in 2000 to over half today—“remarkable.”
<<<
!!! Value destruction
* Lost Revenue
* Bad customer experience
!!! Two Types of Fakes
* ''Knock off'' - Copying appearance and concept of the product
* ''Counterfeit ''- invisible differences. Counterfeiters illegally copy trademarks, which manufacturers have built up based on marketing investments and the recognized quality of their products, in order to fool consumers
!!! Solution?
* [[FakeSpot]] - uses AI to detect fake reviews and shows adjusted rating
* [[ReviewMeta]] - similar to [[FakeSpot]]
* Amazon has suite of services to fight back - https://brandservices.amazon.com/
!! Post Hoc
[[What to Do If You Think Your Amazon Purchase Is a Fake|https://www.nytimes.com/wirecutter/blog/what-to-do-amazon-purchase-fake/]] on [[New York Times]]
!! Reference
* [[Welcome to the Era of Fake Products|https://www.nytimes.com/wirecutter/blog/amazon-counterfeit-fake-products/]] on [[New York Times]]
* [[Counterfeit consumer goods|https://en.wikipedia.org/wiki/Counterfeit_consumer_goods]] on [[Wikipedia]]
* [[Why 'Make in India' when you 'Fake in India'|https://economictimes.indiatimes.com/why-make-in-india-when-you-fake-in-india/articleshow/52088848.cms]] on [[Economic Times]]
,,[[Idea Book]] | [[25 September 2022]],,
```python
import platform
platform.system(), platform.release(), platform.architecture()
```
!!! Output
```bash
('Linux', '5.15.133+', ('64bit', ''))
```
* It is handed out by actual [[Nobel]] laureates
* [[All the winners of Ig Nobel Prize|https://en.wikipedia.org/wiki/List_of_Ig_Nobel_Prize_winners]]
Image augmentation is [[Data Augmentation]] technique for images. `ImageDataGenerator` is a [[Keras]] implementation of augmenting images in memory. The entire dataset is looped over in each epoch, and the images in the dataset are transformed. These transformations are performed in-memory, and so no additional storage is required (though the `save_to_dir` parameter can be used to save augmented images to disk, if desired).
```python
train_datagen = ImageDataGenerator(
rescale = 1/255.,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest')
```
!!! 1.1 Using `flow_from_directory`
```python
train_generator = train_datagen.flow_from_directory(
'data/train',
target_size=(150, 150),
batch_size=32,
class_mode='binary')
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
verbose=2)
```
!!! 1.2 Using `flow`
```python
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)
train_datagen.fit(x_train)
# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
steps_per_epoch=len(x_train) / 32, epochs=epochs)
```
!!! References
* [ext[Code reference|https://www.kdnuggets.com/2020/02/easy-image-dataset-augmentation-tensorflow.html#:~:text=Image%20Augmentation%20in%20TensorFlow,the%20options%20and%20values%20selected.]] from [[KD Nuggets]]
* [ext[Documentation|https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator]] on [[TensorFlow]]
,,[[06 July 2020]],,
It is the plan you make beforehand that decides when and where to act. People who make specific plan for when and where they will perform an activity are more likely to follow through.
Many people think that they lack motivation instead they lack clarity. Implementation intention provides that.
!!!Format of implementation intention:
When situation X arises I will perform Y at this time and this location
Time and location are two most common cues
[[07 April 2022]] | [[Atomic Habits]]
!! Explicit Learning
If you are told ahead of time of a pattern, your reaction time improves dramatically and your gameplay improves due to learning the sequence.
Under conditions of Stress, explicit system takes over. This is choking, thinking about the play, moves. Stress wipes out [[shot-term memory]]. People with lots of experience tend not to [[Panic]], because when the stress suppresses short-term memory they still have some residue of experience to draw on.
!! Implicit Learning
Learning that takes place outside of awareness. If you are not told of a pattern up-front but you will still learn the sequence and still get faster. This takes place in [[Basal Ganglia]], that is concerned with force and timing
,,[[16 February 2022]],,
<<<
Implicit egotism is the hypothesis that humans have an unconscious preference for things they associate with themselves. In their 2002 paper, researchers Pelham, Mirenberg, and Jones argue that people have a basic desire to feel good about themselves and behave according to that desire
<<< [ext[Wikipedia|https://en.wikipedia.org/wiki/Implicit_egotism#:~:text=Implicit%20egotism%20is%20the%20hypothesis,behave%20according%20to%20that%20desire]]
<<<
He has never met a smart person in his life, who does not read non stop
<<< [[Charlie Munger]]
!! Reading
* Develops Neural Network/mental muscles - allows us to think deeper
* ''Less time for noise. Less time to ponder over noise. Reduces portfolio churn'' - mind more inclined to trade than playing the long game. Not reading news and not following the herd
* Seeing long cuts of data - seeing stories and patterns that even the most seasoned fund managers can't see
<<<
The upside of Imposter [[Syndrome]]
* Can motivate us to work harder. The motivation varies by gender. Men typically do more collaborative work than women
* Can motivate us to work smarter. Feeling like an imposter puts us in the Beginner's mindset, the start of [[Dunning Kruger Effect]] curve
* It can make us better learners. Having doubts about our knowledge and skills takes us off the pedestal encouraging us to seek insights from others
<<< [[Adam Grant: Think Again]]
Model retraining with [[XGBoost]]
!! Base model 1
```python
params = {'objective': 'reg:linear', 'verbose': False}
model_1 = xgb.train(params, xg_train_1, 30)
model_1.save_model('model_1.model')
```
!! Method 1: Add new trees
```python
model_2_v2 = xgb.train(params, xg_train_2, 30, xgb_model='model_1.model')
```
!! Method 2: Update existing trees
```python
params.update({'process_type': 'update',
'updater' : 'refresh',
'refresh_leaf': True})
model_2_v2_update = xgb.train(params, xg_train_2, 30, xgb_model='model_1.model')
```
!! References
* [[https://newbedev.com/how-can-i-implement-incremental-training-for-xgboost]]
''An Index is a composition of stocks''
!!! What does it reflect ?
* Reflects Changing expectations in the changing movement of indices
* Reflects general market trend for a selected period. Two main indices
* Some sector specific indices reflect the sentiments of the industry.
!!! Usage
* Used as a benchmark of trader or investor performance
* Trading on index - an investor takes a broader call on the economy. Some tradeable indices can be traded through [[Derivatives]]
* Index can also be used to hedge portfolio
!!! Construction
* Each stock in Index is assigned a weight. Usually [[Free Float Market Capitalization]] is used as weight. Which means ''higher market cap, higher the weight''
* Unlike [[Partial Dependence Plot]]s, ICE plots one line per instance showing how a feature influences the prediction of that instance
* ICE curves are more intuitive to understand than a [[Partial Dependence Plot]]s
* Overcrowding of lines for multiple instances
* Problematic when features have [[Correlation]]
Influential instances are data points from the training set that are ''influential for prediction and parameter determination of the model''. Instance those are extreme are influential and those who lie at the margin of [[Decision Boundary]] will not be influential
* helps in model debugging
* understand behavior of model
* determining the right cutoff point to separate influential or non-influential instances is challenging
* ''Effective Data Visualization: The Right Chart for the Right Data'' by Stephanie Evergreen
* ''#MakeoverMonday: Improving How We Visualize and Analyze Data, One Chart at a Time''
* ''The Data Visualization Sketchbook'' First Edition by Stephanie Evergreen
* ''Introduction to Data Visualization & Storytelling: A Guide For The Data Scientist'' by Jose Berengueres
* ''Storytelling with Data: Let's Practice!'' 1st Edition by Cole Nussbaumer Knaflic
* ''How Charts Lie: Getting Smarter about Visual Information'' by Alberto Cairo
* ''Storytelling with Data: A Data Visualization Guide for Business Professionals'' by Cole Nussbaumer Knaflic
* [[Dear Data]] by Giorgia Lupi and Stefanie Posavec
,,[[Book]],,
The objectives Initial Public Offerings (IPO) are:
# Raise funds primarily for CAPEX
# Repay Debt
# Provide early investors an exit
# Increase visibility of the company
IPO of a company is lead by a ''Merchant Bank'' or multiple merchant banks that takes care of promotion of IPO, setting a price band and underwriting of stocks. ''Price point'' of IPO is where the max bids gets placed in the price band
[[Greenshoe]] is a
A company established for open innovation - outsourcing problem solving using variety of domains. was mentioned in [[David Epstein: Range]]e
!! References
* https://www.innocentive.com/resources/downloadables/
!! Inside Bar
The inside bar is a popular reversal/continuation candle formation that only requires two candles to present itself.
<img src = 'https://a.c-dn.net/b/1oWkZz/inside-bar-candlestick_body_image.png.full.png' width = '500px' />
!! Code for identifying inside bars
```python
# Import Libraries
import pandas as pd
import numpy as np
import os
from datetime import timedelta
# import plotly.graph_objs as go
inside_bar_stats = pd.DataFrame()
# Read dataset
base_path = '../../../Datasets/TradingView-Daily/'
paths = os.listdir(base_path)
for f in paths:
ticker_name = f.split('.')[0].split(',')[0]
try:
print('Generating Inside Bar Stats for :', ticker_name)
df = pd.read_csv(os.path.join(base_path, f))
df['datetime'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=5.5)
df['datetime_formatted'] = pd.to_datetime(df['datetime']).dt.strftime('%H:%M %m-%d-%Y')
df = df.reset_index(drop=True)
df['bar'] = df.index + 1
# Generating Inside Bar Stats - Rules
# 1. For a bar (anchor Bar) - check if the next bar forms with in the high and low of the anchor bar
df['bullish'] = (df.close > df.open).astype(int)
df['high_prev'] = df.high.shift(1)
df['low_prev'] = df.low.shift(1)
df['inside_bar'] = (df.high < df.high_prev) & (df.low > df.low_prev)
df['inside_bar_text'] = np.nan
df.loc[df.inside_bar, 'inside_bar_text'] = 'I'
# Checking the bar that breaks out next to the inside bar
df['high_next'] = df.high.shift(-1)
df['low_next'] = df.low.shift(-1)
df['high_break_amt'] = df.high_next - df.high_prev
df['low_break_amt'] = df.low_next - df.low_prev
ubu = df.loc[(df.bullish == 1) & df.inside_bar].high_break_amt.describe().reset_index()
ubu['dataset'] = 'UBU'
dbd = df.loc[(df.bullish == 0) & df.inside_bar].low_break_amt.describe().reset_index()
dbd['dataset'] = 'DBD'
temp_df = ubu.append(dbd, ignore_index=True)
temp_df['ticker'] = ticker_name
temp_df['shape'] = df.shape[0]
inside_bar_stats = inside_bar_stats.append(temp_df, ignore_index=True)
except Exception as e:
print('Couldn\'t find for ticker :', ticker_name)
inside_bar_stats.to_csv('inside_bar_stats.csv', index=False)
```
!! Resources
[ext[Daily-fx:How to Trade the Inside Bar Pattern|https://www.dailyfx.com/education/candlestick-patterns/inside-bar.html]]
* [[Feature Transformations]] - XGBoost is not sensitive to monotonic transformations of its features for the same reason that decision trees and random forests are not: the model only needs to pick "cut points" on features to split a node. Splits are not sensitive to monotonic transformations: ''defining a split on one scale has a corresponding split on the transformed scale.''
,,[[XGBoost]] | [[02 July 2022]],,
Make an online website that displays books in an interactive format, like the site [ext[brilliant.org|https://brilliant.org/]]
[[Idea Book]]
* [[Savage Chickens|https://www.savagechickens.com/]] - often quoted in [[Adam Grant: Think Again]]
* [[Awkward Yeti|https://theawkwardyeti.com/chapter/heart-and-brain/]]
Where a medical student is introduced to a lot of diseases and they keep thinking that they have what they are reading about
!! References
* [[David Epstein: Range]]
~~~~Changing the pace in between exercise to get [[EPOC - The Afterburn Effect]]
!! [[01 Tell me about yourself]]
!! What's your interest in this company?
!! [[SQL]] - Given date, # views, country - identify top 10 countries with the most percentage increase week on week. The code should run every week without doing anything
!! Considering retention as the goal - How do you identify which customers to retain?
!!! How would you define the opportunity
!! Let's say you came up with certain way to retain - how would you test it
!!! What other metrics should you look at while retaining users
* [[Statistics]] is a science of learning from [[Data]]
* Course to help analyze data and communicate your findings
* Why statistical knowledge is important?
** Whether the data is sufficient to answer the questions at hand
** Establishes a rigorous framework for quantifying [[Uncertainty]]
** Provides techniques for effectively communicating your findings to your analyses
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* professor in Department of [[Statistics]] at [[Stanford]] University
* Teaches intro to Phd
* Statistical problems come up in every diverse area
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* [[Descriptive Statistics]] - Ways to summarize data with numbers and graphs
* Two most important functions of [[Descriptive Statistics]] is to
** communicate information
** Support reasoning about the data
* For large data, it becomes essential to use summaries
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
pictures easier to understand than numbers - if possible, prefer pictures
!!! [[Pie Chart]] or [[Dot Plot]]
* For [[Qualitative]] data (colors, types - categories) use pie chart or dot plot
* Dot plot better for comparison than pie chart
* In Pie it is easy to see what % of the total a category represents
!!! [[Bar Plot]]
* data is quantitative
* [[Histogram]] is similar to bar graph but it allows plots with different bin width
** Can use ''area''to understand what % of population lies within a certain range = range x height.
** Can also get ''density''/crowding using the height which tells how many subjects are there for one unit of horizontal scale
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!! [[Box Plot]]
* Shows 5 key numbers
** min
** max
** median - dark line in between
** 1st quartile
** 3rd quartile
* has less information than [[Histogram]], but uses less space and can compare multiple datasets. Also don't have to chose number of bins
!! [[Scatter plot]]
* Depicts data that comes as pairs
[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]]
* Purpose of statistical analysis is to compare the observed data with some reference. Therefore it is necessary to provide some context
* one way to provide context is to use the [[Principle of Small Multiples]]
** Box plots to compare multiple datasets in a single chart
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* Don't chose flashy, 3D plots tp portray
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* mean = average
* Median = Midpoint
* Which one to use?
** If histogram is symmetric - mean and median are same.
** For skewed histogram, it is better to use median than mean
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* [[Interquartile Range]] = 3rd Quartile - 1st Quartile
* [[Standard Deviation]] measures spread in the data
** Standard deviation is square root of normalized squared differences between value and mean
** if the data is skewed or small, it is better to use median in the [[Interquartile Range]]
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* How data is produced
* Sampling and designing experiments
* [[Statistical Inference]]
!!! What percentage of voters approve of the way the US president is handling his job
* Population - The entire group of subjects we want information - all US Voters
* Parameter - the quantity about the population which we are interested in - approval percentage among all US voters
* Sample - the part of population from which we collect information - 1000 voters selected at random
* Statistic (estimate) - measurable quantity - approval %
Sampled population can produce an estimate relatively close to a very large population
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!!! [[Sample of Convenience]]
* select 1000 voters from neihborhood
* not a good way to sample
* This would induce [[Bias]]. Three important kinds
** [[Selection Bias]] - a [[Sample of Convenience]] makes it more likely to sample certain objects than others
** [[Non-Response Bias]] - people choosing to respond to question may be different from non-responders
** [[Voluntary Response Bias]] - Voluntary reviews could be associated with strong emotions having very bad or good experiences
!!! [[Simple Random Sampling]]
* subjects are selected without replacement
* random digit dialling
!!! [[Stratified Random Sampling]]
* Subset the population into different segments called strata (urban, rural, suburban). Apply [[Simple Random Sampling]] to each strata/segment
* Better results than simple random sampling. More complex to execute
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
Estimate = Parameter + Bias + Chance Error
* Chance error reduces with larger sample sizes ([[Sampling Error]])
* Bias also called [[Systematic Error]], this does not reduce with larger sample size. Sampling with chance is only way to reduce bias
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* [[Correlation]] doesn't mean [[Causation]]
* [[Observational Study]] : measures the outcome of interest and can be used to establish association
* The association may be because of [[Confounding Variables]] or Lurking Variables
To establish causation we need an randomized control experiment
* A [[Treatment]] is assigned to people in one group [[Treatment Group]] but not to people in the [[Control Group]]
* Two groups should be similar and should be randomly selected
* Every subject in the control group gets a [[Placebo]]
* [[Double Blind]] - Neither the patient nor the doctor knows that the patient has received the treatment. This is to not let the doctor favor the treatment in their direction of thinking
!!! [[Placebo Effect]]
* not fully understood. Lies between the boundary of [[Biology]] & [[Psychology]]
* [[The weird power of placebo effect, explained|https://www.vox.com/science-and-health/2017/7/7/15792188/placebo-effect-explained]]
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
Randomization serves two purposes
* Any confounders work equally on both groups (Test, Control)
* We can calculate the chance if confounding effect is much more than the other
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!!! Few rules of [[Probability]]
* P(event) = Proportion of events out of total events
* Requires experiment to be performed many many times
* Long-run interpretation of probability can make it difficult to interpret it for single event
** The probability that my friend calls today is 30% - would be called subjective probability as different people can assign different probabilities to the same event
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* [[Probability]] always lie between 0 and 1
* ''Complement Rule'': P(event) = 1-P(non-event)
* ''Equally likely outcomes'': P(outcome) = 1/n, where n = # of outcomes
* ''Addition Rule'': If A, B events are mutually exclusive, then P(A or B) = P(A) + P(B)
* ''Multiplication Rule'': P(A and B) = P(A) x P(B) if A, B are both independent events
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
* P (At least one) = 1 - P(none)
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!!! [[Conditional Probability]]
* P(B|A) = P(A and B)/ P(A)
* P(A and B) = P(A) P(B|A)
* When A, B are independent, P(A and B) = P(A)P(B)
!!! Example
* P(spam) = 20%
* P(money|spam) = 8%
* P(Money|ham) = 1%
* What is the probability that money appears in email?
** money can appear when spam or money can appear when ham
** = P(money and spam) or P (money and ham)
** = P(money|spam)P(spam) + P(ham) P(money|ham)
** = 8% x 20% + 80% x 1% = 2.4%
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
P(B|A) = P(A and B) / P(A)
= P(B and A) / P(A)
= P(A|B) P(B) / P(A)
[[Bayes' Rule]] helps us formulate the [[Conditional Probability]] of B given A in terms of conditional probability of A given B
In some cases denominator is not available
P(B|A) = P(A|B)P(B) / [P(A|B)P(B) + P(A|Not B)| P(Not B)]
''Exercise''
* P(money|spam) = 12%
* P(spam) = 8%
* p(money) = 3%
* p(spam|money) = P(money|spam)P(spam) / P(money) = 12 x 8 / 3 ='' 32%''
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!! [[Bayesian Analysis]] in [[Spam filtering]]
* [[Prior Probability]] = 20%, If we know 20% of all email is spam
* The idea now is look inside the email and keywords such as money and improve on that prior probability using the evidence we find inside that email
[[Bayes' Rule]] help us update the [[Prior Probability]] into [[Posterior Probability]] by incorporating the information found inside the email
!! [[False Positive]]s
* 1% population has the disease; ''P(Disease) = 1%''
* Infected person tested positive; ''P(Positive|Disease) = 95%''
* Uninfected person tested positive; ''P(Positive|no Disease) = 2%''
* IF test is positive, what is the probability the person has disease?
* P(Positive) = P(Positive|Disease)P(Disease) + P(Positive|no Disease)P(no Disease) = 95 x 1 + 2 x 99 = 2.93%
* P(Disease|positive) = P(Positive|Disease)P(Disease) / P(Positive) = 95 x 1 / 2.93 = ''32.42%''
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!! [[Warner's Randomized Response Model]]
Toss a coin twice, Answer Q1 on tails else answer Q2
* Q1: Have you ever cheated on exam in college
* Q2: Did you get tails in the second toss
The answer would be partly random. Yes could be because of either q1 or q2. Yes Answer doesn't tell us anything and it should put students at ease to answer truthfully
''Key point'': Can't get individual answers, but proportion of cheaters
P(yes) = P(yes|Q1)P(Q1) + P(Yes|Q2)P(Q2)
P(yes|Q1) = [ P(Yes) - P(Yes|Q2)P(Q2) ]/ P(Q1)
* P(Q2) = 0.5
* P(Q1) = 0.5
* P(Yes|Q2) = 0.5
* P(Yes) = Probability of a yes answer from the survey = 27/27+30 = 47
* P(Yes|Q1) = (47% - 50%x50%)/50% = 44%
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
The [[Normal Distribution]] looks like a bell curve. Height, weight, and most natural things follow this distribution
Some distributions that are skewed towards left or right are not normal
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
If the data follows [[Normal Distribution]], then following rules of thumb can be applied, called [[Emperical Rule]]
* 2/3rds of the data lie within 1 [[Standard Deviation]] of the mean
** The % of people with value more than 1 SD would be 16% = (100% - 68%)/2. 16% on each side
* 95% between 2 SD and 99.7% within 3 SD
* If 95% of data is between 2 SD then 5% or 2.5% on each side lies outside of 2SD
<img src='https://i0.wp.com/statisticsbyjim.com/wp-content/uploads/2021/08/empirical_rule_graph2.png?fit=572%2C384&ssl=1' width=400>
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
A [[Normal Distribution]] is determined by mean and standard deviation.
!! [[Standardization]]
* Subtract mean and divide by SD
* Also called [[Z-Score]]. It has ''no units''
* z = height - mean(X) / [[Standard Deviation]]
* IF z = 2, height is 2 SD above Average
* standardized data has Mean = 0, SD = 1
* After standardization, the values follow the [[Standard Normal Curve]]
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
[[Normal Approximation]] means to use the Area under the curve to figure out the percentages
!!! Example
What % of fathers have heights between 67.4 and 71.9 inches
* mean = 68.3 in
* sd = 1.8 in
[[Normal Approximation]] has 4 steps
# [[Standardization]] of end points
#*(67.4 - 68.3) / 1.8 = -0.5
#* (71.9 - 68.3) / 1.8 = 2
# Mark the points on the curve
# Find the area under [[Standard Normal Curve]] where z is between -0.5 and 2
# use software or table to look up percentages. Typically softwares give % to the left of the value. So,
#* % area below 2 - % area below -0.5 = % area between -0.5 and 2
* [[Emperical Rule]] is a special case of [[Normal Approximation]]
* Point 1, Point 2, Apply [[Standardization]] and get [[Z-Score]]s for point 1 and 2. Compute the area between end points to get AUC using tables or computation using computer program
,,[[Coursera: Introduction to Statistics - Stanford]] | [[08 May 2022]],,
!!! Example
What is the 30th percentile of father's heights - (30% of the data falls below this value)
* z = height - mean / sd
* 30th percentile means z = -0.52 from tables
* height = z*ds + mean
** (-0.52)*(1.8) + 68.3
,,[[Coursera: Introduction to Statistics - Stanford]] | [[14 May 2022]],,
!! Conditions of [[Binomial Setting]]
* $$n$$ repetitions of an experiment which are also ''independent''
* Each repetition has two possible outcomes (success and failure)
* P(success) same in each experiment
As $$n$$ grows larger so does all the possibilities of arrangement. We use the help of [[Binomial Coefficient]] which counts the number of ways one can arrange success
$$
Binomial \ Coefficient = \frac{n!}{k!(n-k)!}
$$
!! Example
* P(girl) = 49%
* What is the prob that the 2 out of 3 newborns are girls?
!!! Method 1
List out all probabilities = P(GGB) + P(GBG) + P(BGG) = 3 x P(G)P(B)P(G)
!!! Method 2
Binomial Coefficient x P(G)P(G)P(B)
,,[[Coursera: Introduction to Statistics - Stanford]] | [[14 May 2022]],,
P (k sucesses in n experiments) = $$
\frac{n!}{k! (n-k)!} p^k (1- p)^{n-k}
$$
= number of combinations x p (sucesss) raised to k success x p(failure) raised to n-k failures
!!! Example
P(Big Prize) = 10%, P(small prize) = 20%, P(nothing) = 70%. Find Prob of winning two small prizes out of 10 trails
$$
\frac{10!}{2! (10 - 2)!} 0.2^2 (1- 0.2)^{10-2}
\ = 30.2\%
$$
It may see that there are two types of wins, but big win here is also counted in failures
,,[[Coursera: Introduction to Statistics - Stanford]] | [[14 May 2022]],,
The outcomes of experiments are due to chance. number of successes is defined as a [[Random Variable]] because successes might differ from experiment to experiment
P(X=2) = 30.2% and X has a [[Binomial Distribution]]
Instead of computing probabilities for all outcomes we can visualize using [[Probability Histogram]]
* [[Bar Plot]] with height as probability of outcome and x is number of successes
* A [[Histogram]] gives percentages of observed data, but [[Probability Histogram]] is a theoretical construct, which visualizes probabilities rather than data this is empirically observed
,,[[Coursera: Introduction to Statistics - Stanford]] | [[14 May 2022]],,
,,[[Coursera: Introduction to Statistics - Stanford]] | [[14 May 2022]],,
!! What is [[Explainable AI]]?
* Explainable AI is a research field on ML interpretability techniques whose aims are to learn ML model predictions and explain them in human understandable terms to build trust with stakeholders
* Part of broader human centric [[Responsible AI]] practices
* ''Intepretability'' focuses on model understanding techniques
* ''Explainability'' focuses on model explanations and the interface for translating these explanations
* These are important during development of ML pipelines
<img src='https://lh3.googleusercontent.com/eGUScgM4aqOgNueWOpnp2JxQS37ECEwNtlgKluITDwV6Ip4n5r_cgT60FLjQAaViRGhrr1r2kbKgcgxj1y4D0M_cJ7VoP7k_4rKzztmQX0RtAT_UwsoeZSat1bDe9VGzvjR8B0DloNmt5DXvzBQ8yJ6ncErjTUFbrhPPkzw88TUw-piI_xGFVCydwbox8at7VyqO1oKbyiPk69ptXNBNer4ViKnlPo0wBpVBtwAI4hpCgUvOZnBp9P9jgCr2hhP0TX8-WBo6HgRG9olCsOysFxk0wjc-ggZzGd_IAOQh1UBowv4b3ZwUgleODmmUr3Z_8xJaCtvs0tlBr3HtR9OfocA9I8J0RAh9U-HhNvZFNVPBs5mQEpS4d_cLTE6m-Nv2a35fFeK5SPPcBoc5DM7fpGie5xjWrZN6rPyfsFQioynkSh0Qj7nFctQuKJAVbhfeth2gJjN7m4v-3oib2ggIpA9ITZUHzK-PoRiUqnHaOrGgLdaUQJRtHn0Ms8zImcWTC5QNoO2Rc-w5-NVaSReLHNxaOUCSohXXSY7T-fmlAk8CYb--HL_YAJ-anutySv-w_dMN9TVqJN05Hf_0MauhkZcaXPhfN_phE4_l7IjI0o-wbvOWV36VHP5n6ZZEr3nXTD316UsBY_d4EnBaTHOlRTR2i_8BoSPBBgen-WnEKsq3hS7waB9ki5LeK0AhExkW4adYOL2zgszaD7dszSrsk40qvA=w866-h477-no?authuser=0' width=700>
!!! Use cases for Interpretability and Explainability
* Explained predictions to inform and support human decision making processes. Interpretable explanations build trust with the end users that model results are equitable and reliable
* Gives deeper feature level insight into model errors
* Identify common ML pitfalls like data skew
* Model results are in line with expected outcomes and the behaviour is acceptable. Provides regulators to identify unexpected predictions and inform corrective actions
* Can act as a catalyst to adoption
!! Interpretable ML methods
Need for a interface between model explanations and human explanations
<img src='https://lh3.googleusercontent.com/F434UhLVNE-KJe18EbDIQGj-i1a1V_LMBlcvWd_yte8jgLHPzwhX90RRwEKotWBKGOQs0SeGmAFL23pmfWTTZ7o2Fww0cmDiGODcLylcHFgsP7KwbjFMl5WIS5PCl7cbl5QLlvtNOfxS4ED2Hjq1Xd7JYM_DRcMUghFqKUC63MCUyh1F5xQtrsPyTaKQrFAXWWT8jwkJCfl0Oq5_yVcCpwvK_t8YBUcvQhsM9-d1Io7m-0TqvuatSFfXDaT6rWvCdQSDb97lFiX2ErB9c20JwsqOFlwmITgKdvV1SuFUXwJLJvk82V0t0OZBlxfR2eZ0qGoGY1P5LL-t9eNXQB-FpMub3LNAuHoVeEF0zVA1Jmmak5spndCXmFuNo4UN_YEAqdFUSWEErudGWidA9o7koxqGLSmzLKqO61pxpLX-ScC0ij5TKDZY0tvA5LtVxdFvBZVGqY3uOZnUEo_nse0E5WKuU3uE1Fhr8QLFRDE2wopIU5AiBuJy0Yi16cJdCu0NZlaTC5ilYvmXWtA1VKgnUe_M5lZr_byqUgpBdHexF8sJtht7YJWQXBJ7E8_w0h5P9xRYRJHc5yX8AiNLa4MHpyYleaKVQeIVFUl4iF3WVULojHw2dkZQPRVvdrQ_av2Cnw-flLs8TlMqMTgA4Vlw8X3pQ6CVj-Z4MoamnVDdmJ3XscfMNN-Akp7NCTKsRLMF9R6u5ewQuMe0UlIhtiOXOI7aSA=w803-h408-no?authuser=0' width=700>
Complex models have become harder to explain.
!!! What comprises a good explanation?
* ''Complete'' - explanations for all model outputs
* ''Accurate'' - need to accurately reflect model's predictions with a high degree of precision
* ''Meaningful'' - interpretability method must be understandable by needed stakeholders
* ''Consistent'' - methods should provide stable explanations for equivalent models
!! Taxonomy:
<img src='https://lh3.googleusercontent.com/bi9VdFLtJBoI70XXir8Xqaf66jdNDxkN-_PgTDSD47MXfeGWUENRqoK29QcBrnZVCOKD59X2Iar4iszVahWhV5X9SayBZ6qrh5dG-fgYGtGIR0WCycETg0Qq7IOOSCfGIcXEWlPbjUCoNLpXpI1lx0nQSoSZCbvWih9FS3Wla43C8LwNfqzQ1RUgyb-rVAIFoeZsxxSS4hUJ6uE3kNJl-ucWD7_YY5jUqc7mXFaLraadsI-9pgiVqAHnWYid_rcW0zDN6YVAXSl4SUJ2NyppdO_jZbHs3e64EQPe5rLpgZXtFtsmVh-u1-7NepM2ERAsq5wlw_I8HFuB1aKNFcsmFwsAxgGTDi2XSivcN-XxINP1Jlf4Gam51dU4CgIFs6LRicrosFF6G-DZmtUslOHXw-LovDHmEAlNPBXzkN-GgBixhHNYeiwEbsEvKnvVwSnEtSjY69UOzIHXHPie0qXuDhefaMOp00Jd31lfpIkqIpEylFZRQ7atUiHszY5-7aCnVDuatOQ4Sz4gZQBxExWerS0E7cgLXnHUFOyJAW7XLOuqLKwiQgSBIJTmUmBsB3DR1VqRhktF1E8BTD6dUIXh-ZL1WxlE5eiEn89Cu167s1Rc-t8mkmeMw-qSnIRTHjwgTzxtOsz_z1zrbRSJwiMtVfVlOCre7590nsL9O78mxG9e90aQN7NGknjOWEmJk2TYdQtqSEOZpXmr4oR3akhTYYt6-A=w538-h404-no?authuser=0'>
''Intrinsic''
* Models are self explainable due to their simple structure - [[Decision Trees]] or [[Linear Model]]s
* before training
''Post-hoc''
* Achieve interpretability after model training. Eg. [[Permutation Importance]]
* Can also be applied to intrinsically interpretable models as well
''Global''
* scope is entire model prediction space
* aggregated view of input features
''Local''
* scope limited to individual predictions or small segments
* higher precision view of individual predictions but low recall understanding of model behavior
''Model Specific''
* specific algorithms
''Model Agnostic''
* does not rely on algo, instead changes in input features or their values and how they influence the outputs of the model - [[SHAP Values]], [[LIME]]
!! Deep-dive: [[Integrated Gradients (IG)]]
* Aims to explain the relationship between a model predictions in terms of its features
* use cases include: identifying feature importance's, understanding data-skew and debugging model performance
* Highlights pixels in the image to explain the prediction
* Post-hoc explanatory method
* Model Agnostic
* Local Explainations
* Part of group of methods that use gradients as a measure of importance of feature space
* Numerical score, so it can be aggregated to get relative [[Feature Importance]]s across difference sample sets
!! Picking baselines and future research directions
Invoice discounting is a short term investment where you can invest large sum of money for fixed payout.
!! How does it work?
A T-shirt manufacturer is manufacturing 1,00,000 T-shirts for Amazon. Amazon has agreed to pay 500 per T-shirt while the cost is 350 per T-shirt. The payment will be made post 90 days of invoice generated in the name of Amazon by the manufacturer.
Before the manufacturer can receive payment 5 Cr. he needs to expend 3.5 Cr to manufacture those T-shirts and also wait for some time to receive payment.
Manufacturer thus tries to find an individual whom he can ask the money upfront with some discount (say 5%), thus manufacturer receives only 4.75 Crores while the individual will receive the entire payout amount of 5 Cr. post 90 days.
!! Risks Involved
* ''Credit Risk'' - The company on whose name the invoice is generated should be a reputed one and should be able to pay the amount
* ''Dispute Risk'' - The company raising the invoice and manufacturing product should also be a reputed one, otherwise with the bad quality of product the company on whose name the invoice is generated can come with a dispute and not pay the money on account of bad quality
* ''Insolvency Risk'' - If due to any un-foreseen circumstances these companies stop existing then again your money is stuck
!! Platforms
They find invoices from reputed companies and take their commissions.
* TradeCred
* KredX
* `%%file` is an Ipython magic function that saves the code cell as a file
```python
%%file wordcount.py
def compute(x):
return x*x
```
[[Lesson 2 : Spark By Udacity]]
!! A need to be the hero disguised as empathy
* Compassionate understanding for the challenges of others is showing [[Emotional Intelligence]]. Rescuing them from the consequences of those challenges may be more cruel than kind.
!! A need to be right masquerading as active listening
* Working to suppress your strong views to appear as if you’re engaging others never works, even if you mean well. People are more likely to believe you’re open to hearing their ideas if they feel you’ve been straightforward about where you stand on yours.
!! A need for approval dressed up as self-awareness
* Genuinely self-aware leaders face that insecurity head on, and don’t put the burden of soothing it on others
* Isotonic Regression is a [[Regression]] method that assumes that the data is best represented by motone functions (either increasing or decreasing - linear is a monotone but not vice-versa)
* The function can easily overfit the data so large data is required
* The [[Hyperparameter]]s include
** `y_min` - lower limit of prediction
** `y_max` - upper limit of prediction
* This technique is usually used to calibrate scores
* The technique looks at the data and cuts it into chunks of X variable and tries to predict y such that the next prediction is lesser or equal to the previous prediction by minimizing the mean squared error between predictions and actuals for fitting a decreasing function
<img src='https://editor.analyticsvidhya.com/uploads/50177600px-Isotonic_regression.svg.png' width=400>
!! Code
```python
from sklearn.isotonic import IsotonicRegression
iso_reg = IsotonicRegression().fit(X, y)
iso_reg.predict(X)
```
!! Objective
* Minimizes the objective $$\sum_i w_i (y_i - \hat{y}_i)^2$$, subject to $$\hat{y}_i \le \hat{y}_j$$ where $$X_i \le X_j$$ to fit a decreasing function. For increasing function the condition is reversed
!! How it works?
IsotonicRegression produces a series of predictions for the training data which are the closest to the targets in terms of [[Mean Squared Error]]. These predictions are interpolated for predicting to unseen data. The predictions of IsotonicRegression thus form a function that is piecewise linear:
<img src='https://scikit-learn.org/stable/_images/sphx_glr_plot_isotonic_regression_001.png' width=700>
!! References
* [[Isotonic Regression and the PAVA algorithm|https://www.analyticsvidhya.com/blog/2021/02/isotonic-regression-and-the-pava-algorithm/]] from [[Analytics Vidhya]]
* [[1.15. Isotonic regression|https://scikit-learn.org/stable/modules/isotonic.html]] from [[scikit-learn]]
Use [[AI]] to create realistic [[Art]] from text - https://www.jasper.ai/art
[[AI Businesses]] | [[AI Art]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/d3mVmR6UuMc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* World's best [[Election]] [[Forecast]]er
!! Introduction
* Jukebox is [[Neural Network]] developed by [[OpenAI]] for generating music
* Requires artist, lyrics and genre as input and generates a random sample from scratch
* Unlike [[MuseNet]], the generations are not symbolic. i.e. They capture rudimentary vocals, and expressivity of dynamic changes in timbres and expressivity that makes music more realistic
* Challenge with modelling raw audio - sequences are long, need to capture extremely long range dependencies. Solution is to use [[Autoencoders]] to compress audio and discarding irrelevant info
!! How does it work?
* [[Autoencoders]] compresses audio in discrete space using [[VQ-VAE-2]]
* We use three levels in our VQ-VAE, shown below, which compress the 44kHz raw audio by 8x, 32x, and 128x, respectively. Down-sampling loses detail but the outcome is also sounds noisy
* Web crawled 1.2M Songs paired with corresponding Lyrics
* Trained on 32bit, 44.1kHz raw audio
* [[Data Augmentation]] - downmixing right and left channels giving mono audio
* Used [[t-SNE]] to identify model [[Clustering]] of similar artists
!! My Generations
* Jiya Jale in [[Lamb of God]] [[Metalcore]] style
:<iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1107356947&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"></iframe><div style="font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;"><a href="https://soundcloud.com/user162123417" title="KANT999" target="_blank" style="color: #cccccc; text-decoration: none;">KANT999</a> · <a href="https://soundcloud.com/user162123417/jiyajale-metalcore-lambofgod" title="Jiyajale Metalcore Lambofgod" target="_blank" style="color: #cccccc; text-decoration: none;">Jiyajale Metalcore Lambofgod</a></div>
!! References
* [[Jukebox Blog by OpenAI|https://openai.com/blog/jukebox/]]
* [[Research Paper|https://arxiv.org/abs/2005.00341]]
* [[Github Repo|https://github.com/openai/jukebox/]]
* [[Youtube]] video tutorial for generating samples using [[Google Colaboratory]]
:<iframe width="560" height="315" src="https://www.youtube.com/embed/mNtmgYW428M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Tags: [[Deep Learning Algorithm]]
Juneteenth (a portmanteau of June and nineteenth; also known as Freedom Day, Jubilee Day, Liberation Day, and Emancipation) is a holiday celebrating the liberation of those who had been held as slaves in the United States. Celebrated annually on the ''19th of June''. it commemorates Union army general Gordon Granger announcing federal orders in Galveston, Texas, on June 19, 1865, proclaiming that all people held as slaves in Texas were free.
<iframe width="560" height="315" src="https://www.youtube.com/embed/6FX-Iisvrj8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<<<
Even though slavery came to an end in 1865 to will to dominate black bodies didn't
<<<
!! Shortcuts
!!! Command Mode
* `o` - toggle output
* `h` - list all available shortcuts
* `p` - lists all commands in command pallette
!!! Edit Mode
* `ctrl + enter` - execute current cell
* `shift + enter` - execute and move focus to subsequent cell below
* `alt + enter` - execute and create a new empty cell below
!! References
* [[Introducing Jupyter - Shortcuts|https://www.linkedin.com/learning/introducing-jupyter/shortcuts?autoSkip=true&autoplay=true&resume=false&u=82999986]] on [[LinkedIn Learning]]
!! Line Magic Commands
Similar to [[Bash]] commands
* `%load` - loads file in a cell
* `%cat` - to view the contents of the file
* `%time` - get time for execution of a line in a cell
* `%timeit` - mean and std dev time over 7 runs of 10000 loops each
!! Cell Magic Commands
Have to be at the top of the cell
* `%%writefile filename.py` - save the code in the current cell into filename.py file. Handy for creating functions in files that can be referenced later
* `%%capture variable_name` - captures the result of the cell into variable_name
`lsmagic` to get list of all magic commands
!! References
*
* [[Jupyter Notebook]]
!! Method 1
* Share using [[Github]] repository
!! Method 2
* sharing using [[Github Gist]]
!! Method 3
* can also view the uploaded gists and notebooks in github repositories using [[https://nbviewer.org/]] which is provided by Jupyter.org to share notebooks
```bash
jupyter nbconvert --to FORMAT notebook.ipynb
```
!! to [[HTML]]
```bash
jupyter nbconvert notebook.ipynb --to html
```
!! to [[PDF]]
saving to PDF requires [[Latex]]. Instead print html using above command and print pdf from browser
!! to [[Reveal.js]] slides
*Need to configure slides using View -> Cell toolbar -> slideshow
```bash
jupyter nbconvert notebook.ipynb --to slides --post serve
```
*post serve opens the slides in browser after exporting.
!! Summary
* kNN is a [[Supervised Learning]] algorithm that can be used to solve both [[Classification]] and [[Regression]] problems.
* This algorithm assumes that similar things exist in close proximity
* [[non-parameteric]]
* k is a [[Hyperparameter]]
** lower k - low bias, high variance
** higher k - high bias, lower variance
:<img src='http://res.cloudinary.com/dyd911kmh/image/upload/f_auto,q_auto:best/v1531424125/KNN_final1_ibdm8a.png' width=500>
!! Algorithm
# Load the data
# Initialize the K for chosen number of neighbors
# For each example
## Calculate the distance between the query example to an ordered collection
## Add distance to an ordered collection
# Sort the ordered collection based on distance in ascending order
# Pick the first K entries from the sorted collection
# Prediction
## [[Regression]] - Mean of label for K entries
## [[Classification]] - Mode of label for K entries
!! Choosing the right K value
The accuracy of prediction follows an inverted U shaped curve, where the errors are high and accuracy is low for very small and very large k values and maximum at an optimal k value in between
!!! Elbow Method
Use the k value where the incremental addition of a neighbor does not result in significant improvement in accuracy
!! Distance Measures
* [[Hamming Distance]]
** computes difference between two binary vectors by counting the different bit over all bits
* [[Manhattan Distance]]
** also called taxicab distance is the shortest part taxi would take on the city grid (like integer space which has uniform grid).
** It is the sum of absolute difference between two vectors.
** $$|x_1 - x_2| + |y_1 - y_2| + |z_1 - z_2|$$
** also called [[L1 Norm]]
* [[Euclidean Distance]]
** most widely used
** also called [[L2 Norm]]
** $$\sqrt{(x_1-x_2)^2 + (y_1 - y_2)^2 + (z_1 - z_2)^2}$$
* [[Minkowski Distance]]
** Generalization of Manhattan and Euclidean distance
** $$\sqrt[p]{|x_1-x_2|^p + |y_1 - y_2|^p + |z_1 - z_2|^p}$$
** Can be used to Machine learning model training where p can be tunable hyperparameter
** p=1, Manhattan
** p=2, Euclidean
!! Pros
* No training required to build a generalized model
* Can work with non-linear data
!! Cons
* Requires feature scaling - distance of higher magnitudes have higher effect on prediction
* not suitable for large-dimension data - hence [[Principal Component Analysis]] is required to reduce dimension or [[Feature Selection]] is used
!! References
* [[KNN Classification using Scikit-learn|https://www.datacamp.com/community/tutorials/k-nearest-neighbor-classification-scikit-learn]] from [[DataCamp]]
* [[Machine Learning Basics with the K-Nearest Neighbors Algorithm|https://towardsdatascience.com/machine-learning-basics-with-the-k-nearest-neighbors-algorithm-6a6e71d01761]] on [[Medium]]
* [[4 Distance Measures for Machine Learning|https://machinelearningmastery.com/distance-measures-for-machine-learning/]] on [[Machine Learning Mastery]]
The prediction of the k-nearest neighbor model can be explained with the k-neighbor data points.
A visualization of the individual cluster containing similar instances provides an interpretation of why an instance is a member of a particular group or cluster.
* Generate AI art from text
* Type your description, and our unique AI will understand you
* https://www.kartiv.com/
[[AI Businesses]] | [[AI Art]]
[[Time series]] library for forecasting, feature extraction, [[Change point detection (CPD)]] and slow trend changes. Kats (Kits to Analyze Time Series) is a light-weight, easy-to-use, extenable, and generalizable framework to perform time series analysis in [[Python]]
!! References
* [[https://www.kaggle.com/c/jane-street-market-prediction/discussion/248181]]
The Kendall [[Correlation]] coefficient compares the number of concordant and discordant pairs of data. This coefficient is based on the difference in the counts of concordant and discordant pairs relative to the number of x-y pairs. It’s often denoted with the Greek letter tau (τ) and called Kendall’s tau.
`τ = (n⁺ − n⁻) / √((n⁺ + n⁻ + nˣ)(n⁺ + n⁻ + nʸ))`
where
* `n⁺` is the number of concordant pairs
* `n⁻` is the number of discordant pairs
* `nˣ` is the number of ties only in x
* `nʸ` is the number of ties only in y
!!! References
* [ext[NumPy, SciPy, and Pandas: Correlation With Python| https://realpython.com/numpy-scipy-pandas-correlation-python/]] from the blog [[Real Python]]
,,[[18 July 2020]],,
* Keras is a minimalist Python library for [[Deep Learning]] that can run on top of [[Theano]] or [[TensorFlow]]
* It was developed to make developing deep learning models as fast and easy as possible for research and development
* Keras was developed and maintained by ''[[François Chollet]]'', a Google engineer using four guiding principles:
** ''Modularity'': A model can be understood as a sequence or a graph alone. All the concerns of a deep learning model are discrete components that can be combined in arbitrary ways.
** ''Minimalism'': The library provides just enough to achieve an outcome, no frills and maximizing readability.
** ''Extensibility'': New components are intentionally easy to add and use within the framework, intended for developers to trial and explore new ideas.
** ''Python'': No separate model files with custom file formats. Everything is native Python
!! Installation
```python
pip install keras
print(keras.__version__)
```
!! Configure Backends
Keras is a lightweight API and rather than providing an implementation of the required mathematical operations needed for deep learning it provides a consistent interface to efficient numerical libraries called ''backends''.
```python
from keras import backend
print(backend._BACKEND)
```
You can also specify the backend to use by Keras on the command line by specifying the KERAS BACKEND environment variable, as follows:
```bash
KERAS_BACKEND=theano python -c "from keras import backend; print(backend._BACKEND)"
```
!! Reference
[[KerasBeats: An Easy Way to Use N-Beats in Keras|https://medium.com/@jonathanbechtel/kerasbeats-an-easy-way-to-use-n-beats-in-keras-395b24c5cc28]] on [[Medium]]
Top 4 Holdings - accounting for 50% of allocation
''Lenders''
* [[HDFC Bank]]
* [[Bajaj Finance]]
* [[Kotak Mahindra]]
* [[AU BANK]]
''Non Lenders''
* [[HDFC Life]]
* [[ICICI Lombard]]
* [[ICICI Securities]]
* [[HDFC AMC]]
!! Exit Conditions - Financial Stocks
* Years which see a large number of IPOs are signs of a raging bull market and are a good time to exit financial stocks
* Narrowing of spread between commercial paper and treasury bond yields are a good SELL sign
!! Fact Sheet
<embed src="https://marcellus.in/wp-content/uploads/2021/01/Marcellus_KCP_Factsheet_Direct.pdf" width="100%" height="500">
!! References
* [ext[https://marcellus.in/portfolio-management-services/marcellus-kings-of-capital-pms/]]
* [ext[https://economictimes.indiatimes.com/markets/expert-view/saurabh-mukherjea-on-how-to-play-bharat-rather-than-india-now/articleshow/77651467.cms]]
*
Kivy Python tutorial by [ext[TechWithTim|https://www.youtube.com/playlist?list=PLzMcBGfZo4-kSJVMyYeOQ8CXJ3z1k7gHn]]
<<tabs "[[Kivy Python - Installation]] [[Kivy Python - Hello World]] [[Kivy Python - Grid Layout]] [[Kivy Python - .kv design language]] [[Kivy Python - Float Layout]] [[Kivy Python - Converter App]]" "[[Kivy Python - Installation using Anaconda]]" "$:/state/strollhometabs" "tc-vertical">>
,,[[13 June 2020]] | [[Android App]],,
!! .kv design file
* The Name of the file should be the name of class in the main app without the 'App'. For example if class invoked in main.py is `ConverterApp` the name of the .kv design file would be ''converter.kv''
* `<MyGrid>` is the parent tag for which the layout is created
* `dollars` & `inr` are variables - in the `.kv` file they are referenced with the right hand side names. For example if the variable is declared as `dollars : dollars3`, `dollars3` is referred in side kivy while `dollars` in the main python file
```
<MyGrid>
dollars: dollars
inr: inr
GridLayout:
cols:1
size: root.width - 100, root.height - 100
pos:50, 50
GridLayout:
cols:2
Label:
text : "DOLLARS ($): "
TextInput:
id : dollars
multiline: False
Label:
text: "INR :"
TextInput:
id : inr
multiline: False
Button:
text : "Convert"
on_press : root.convert()
```
!! Main File
,,[[Kivy Python]],,
This Android app converts Dollars to INR
!! Result
<img src="https://lh3.googleusercontent.com/tdEG4zAgfAs-vqV_wRvKkpPZN3MjhaLPXH94JgRnuhA3fImuN1OJlN6E77lsp-_8GX9qt8D-taB3rxLFBmGP7nd0tLlxZcn2xjf1Jznu2CNl0Mf9dDfW-UOeZI46XPsrG8NssbEaYdqIzNb8AM4kFBIKzizatNDtVc-NdV1oAzfqvuXqgybOyTa1PMhXFf2XG8BZdNKZpt9iSqdx5iaewuF-IqSOtWUD7SzmYfyq2ncmh2PYDOI_iqvi0Q7Q3bcV4cLaNd0XKpEeltZ_6cFAV73_AMvEDuQggke2slAoir6qjamvGUF4q20yam0ZIQhsn5YvHQcMuNtcnNCLKkYQ9XJl6u8XPPywqc7pH4X-gC_m3lVGIuNjNJBFo9QX98HZJ7ct2chMZ-Gx8Jx0Xkcew22CUucfB993ZxQCfsQEcpKRRL9fu23BlOlU9wX5nlnwwyA-AWwXt6vsSu3JVjBS7dh7EW3BvYYZ0le9vj9VzWZ2OZ_OjG0PD2sV3g6Zw97vT12WP-504cKxQ8U9ShVrIq4rwpOde35cD46BeA1rYYNyGlaWmo3V0vmFDs4Tq3q42omALrNpM-c76aocSrTqFhKCfJCSinYu0xktHk6Zm8Sb2138G4MbD9hxa_NvMu-_Ow0G0hZmcN65ADq-96A4S_Hx-shUyy3B4xvqpsLlx_ZF3DTH3QBFkkeb-fv0kJY=w803-h632-no?authuser=0" width = "700">
!! Main File
```python
import kivy
from kivy.app import App # main app class - build windows, graphics
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
class MyGrid(Widget):
dollars = ObjectProperty(None) # initializes
inr = ObjectProperty(None)
def convert(self):
try:
self.inr.text = str(int(self.dollars.text) * 74)
except:
self.inr.text = '???'
class ConverterApp(App):
def build(self):
return MyGrid()
if __name__ == "__main__":
ConverterApp().run()
```
!! Converter.kv file
```
<MyGrid>
dollars: dollars
inr: inr
GridLayout:
cols:1
size: root.width - 100, root.height - 100
pos:50, 50
GridLayout:
cols:2
Label:
text : "DOLLARS ($): "
TextInput:
id : dollars
multiline: False
Label:
text: "INR :"
TextInput:
id : inr
multiline: False
Button:
text : "Convert"
on_press : root.convert()
```
,,[[Kivy Python]],,
!! .kv Design File
```
<Button>:
size_hint: 0.6, 0.2
border_radius: 10
<FloatLayout>:
Button:
text: "HELLO"
pos_hint: {"x":0.2, "top":0.8}
Button:
text: "WORLD"
pos_hint: {"x":0.2, "top": 0.6}
```
!! Main File
```python
import kivy
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
# all float layouts can be controlled by the partent tag <FloatLayout> in converter.kv file
class ConverterApp(App):
def build(self):
return FloatLayout()
if __name__ == "__main__":
ConverterApp().run()
```
,,[[Kivy Python]],,
!! Grid Layout
```python
import kivy
from kivy.app import App # main app class - build windows, graphics
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
class MyGrid(GridLayout):
"""Holds the layout of the app"""
def __init__(self, **kwargs):
super(MyGrid, self).__init__(**kwargs)
self.cols = 1
# INSIDE CONTAINER
self.inside = GridLayout()
self.inside.cols = 2
# dollars
self.inside.add_widget(Label(text='Dollars :'))
self.dollars = TextInput(multiline = False)
self.inside.add_widget(self.dollars)
# inr text
self.inside.add_widget(Label(text='is equal to INR'))
self.inr = TextInput(multiline = False)
# self.inr.bind(text = self.compute)
self.inside.add_widget(self.inr)
self.add_widget(self.inside)
# MAIN CONTAINER
# compute button
self.compute = Button(text ='Convert', font_size = 30)
self.compute.bind(on_press = self.CONVERT)
self.add_widget(self.compute)
def CONVERT(self, instance):
try:
self.inr.text = str(int(self.dollars.text) * 74)
except:
self.dollars.text = 'check value'
self.dollars.text = ''
class MyApp(App):
def build(self):
return MyGrid()
if __name__ == "__main__":
MyApp().run()
```
,,[[Kivy Python]],,
!! Hello World
```python
import kivy
from kivy.app import App # main app class - build windows, graphics
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text = "My First Android App")
if __name__ == "__main__":
MyApp().run()
```
,,[[Kivy Python]],,
!! Installation using [[Anaconda]]
* Create [[Conda Virtual Environment]] called `kivy`
```python
cd /d E:\"My Works"\Python\PythonAndroidApps
conda activate kivy
```
* Install using conda - `conda install kivy -c conda-forge`
,,[[Kivy Python]],,
* [[Unsupervised learning]] algorithm
* Centroid based [[Clustering]]
* Objects in the same cluster are more similar to each other than objects in other clusters
!! Algorithm
# Choose k value
# Randomly select k data points as cluster centroids
# Compute distance for each data point from centroids
# Assign data points to the nearest centroid
# Update cluster centroids by taking the feature mean of all points in each cluster
# Go to step 3 and compute distance from new centroids until they cannot be updated anymore
!! Cons
# requires feature scaling
# sensitive to outliers
# requires domain knowledge to specify number of clusters
# requires large amount of data for storing training data
!! Difference from [[K Nearest Neighbors]]
# requires updating centroid and computing distance until convergence which is not required in kNN
# this is unsupervised while kNN is [[Supervised Learning]]
# requires domain knowledge to specify number of clusters
[[K Nearest Neighbors]] is a [[Classification]] method used for
[[Preparing for the next role]]
!! Set the Agenda
!!! Define what winning looks like?
<<<
//I work with my leader to create a clear and compelling definition of winning looks like for my role, making sure the focus is understood and why it matters. I understand that a clear definition of what winning looks like is essential to the organization's culture and to winning the hearts and minds of my colleagues//
''Example:''
<<<
!!! Put Enterprise Thinking First
<<<
//I intentionally connect my agenda to enterprise priorities, ensuring there are direct and clear linkages to how it supports our Framework for Winning. Specifically, I make sure my approach balances the needs of customers, partners, colleagues and shareholders//
''Example''
The projects are designed in such a way, that the needs needs of customers, partners, colleagues and shareholders are supported, the goals are aligned with my manager
<<<
!!! Lead with external Perspective
<<<
//I understand that external influences on our customers are creating rapid change in industry. I take steps to make sure I learn about and look for opportunities to incorporate external thinking into my work, resisting the temptation to be insular and internally focused//
''Example''
* Evaluated and Implemented Feat-Exp package in the standard modelling pipeline to weed out unstable features and improve the feature selection in our modelling process
*
<<<
!! Bring Others with you
!!! Build the best team
<<<
//I realize there is no substitute for being a part of a team that is mission capable, focused and motivated to win. The broader, stronger and more diverse the team, the better our results. I am active and engaged team player with a responsibility to contribute my best effort and unique perspective for the overall success and performance of the team//
''Example''
<<<
!!! Seek and Provide Coaching and Feedback
<<<
//I am willing to provide candid coaching and actionable feedback to my leader and my colleagues. I am also committed to learn how I can be more effective by listening for, and acting on constructive feedback
//
''Example''
* Mentored 3 interns during my tenure at Amex
** Yuvraj - Building the first cut versions of baseline and incremental models for with the new approach
** Raghav - For building OPEN and CORP lend SOW models using the dependent variable as identifying borrowing needs and estimating
** Atul - First cut pipeline for email models
* On-boarded new colleagues by proving mentorship and helping out the team when it was understaffed
<<<
!!! Make Collaboration Essential
<<<
//I understand that collaboration is not the same as consensus. I role model the importance of valuing the input of others, while maintaining clarity on ownership of decision rights. Once a decision is made, my role is to join with the team to help support and execute the decision.//
''Example''
<<<
!! Do it the right way
!!! Communicate Frequently, Candidly and Clearly
I take proactive steeps to communicate clearly and confidently with my partners, leaders, peers and team, ensuring they are appropriately involved. I aim to inspire through my actions and do so with high degree of active listening, transparency and candor
!!! Make Decisions Quickly and Effectively
I strive to make quick decisions, by utilizing the tools to plan, decide and execute to achieve goals. I make sure to balance all relevant perspectives without being constrained by consensus. Although, speed is important, I understand that it must be balanced with the quality of our products and services
!!! Live the BLue Box Values
Our Blue Box Values are enduring and serve us well. They are important components of a culture that has made us a successful company for more than 160 years. As a leader, I embrace these values, and I represent the very best that American Express Stands for
!!! Demonstrate the Courage Great Leadership demands
I accept the responsibility to speak up and challenge when I believe my point of view, or my team's point of view, needs to be more completely considered by those making important and relevant decisions. I have the courage to challenge status quo.
[[Preparing for the next role]]
Mindsets impact our leadership style
Learned helplessness occurs when someone repeatedly faces uncontrollable, stressful situations, then ''does not exercise control when it becomes available''. They have “learned” that they are helpless in that situation and no longer try to change it, even when change is possible.
* Individuals experiencing learned helplessness are often less able to make decisions.
* Learned helplessness can ''increase a person’s risk of [[Depression]]''.
* Prof. Martin Seligman, one of the psychologists credited with defining learned helplessness, has detailed three key features:
**becoming passive in the face of trauma
**difficulty learning that responses can control trauma
**can increase in stress levels
!! References
* [ext[https://www.medicalnewstoday.com/articles/325355#what-is-it]]
!! Tuning Learning Rate in Tensorflow
* Uses callback to tune the learning rate. This callback is called after each epoch and it updates the learning rate based on the epoch value
```python
lr_schedule = tf.keras.callbacks.LearningRateScheduler(lambda epoch: 1e-8 * 10**(epoch/20))
```
* use this callback in `model.fit` statement
```python
history = model.fit(dataset, epochs = 100, callbacks = [lr_schedule]
```
!! Find best learning rate
* Plot the loss per epoch against the learning rate per epoch. Plot the graph and pick the value at which the loss seems to stable and also is the lowest point in the graph. Note that by changing the learning rate, the number of epochs will need to be changed
```python
lrs = 1e-8 * (10 ** np.arange(100/20))
plt.semilogx(lrs, history.history['loss'])
plt.axis([1e-8, 1e-3, 0, 300])
```
<table id="main-table" class="table text-left table-striped table-bordered">
<tbody>
<tr>
<th rowspan=3>Learning Dimension</th>
<th>AI</th>
<th>Investing</th>
<th>Management</th>
<th>Books</th>
<th>Psychology</th>
<th>Music</th>
</tr>
<tr></tr>
<tr>
<th colspan=5>Reading between 8:00-10:00 AM, catchup hours 9:00PM - 10:30PM</th>
<th>Practice hours between 5:00 to 6:00 PM</th>
</tr>
<tr>
<th>Month</th>
<th>Concepts, Papers, Blogs, Conferences on AI, ML, DL, Data Science, 1 week of a coursera course (7/mo)</th>
<th>Blogs, research, important updates on companies that I am invested in (5/mo)</th>
<th>articles, podcasts, blogs, linkedin learning, on management & leadership (5/mo)</th>
<th>Read books (~100 pages per sitting for 10 days) = 1000 pages = roughly 2.5/3 books</th>
<th>Blogs, Papers, Concepts (3/mo) </th>
<th>Master 12 songs. 1 per month</th>
</tr>
<tr>
<th>Jan-22</th>
<td>
* [[Concept Drift]]
* [[Putting Purpose before tools]]
* [[Dataset Search by Google]]
* [[Isotonic Regression]]
* [[all in Python]]
* [[Jupyter Notebook - Magic Commands]]
</td>
<td>
* [[Rising Giants]]
* [[Ankur Warikoo: Investing Lumpsum Amount]]
</td>
<td>
* [[Skill Will Matrix]]
* [[Situational Leadership Model]]
* [[Podcast: Dear Hbr: First time bosses]]
* [[What I learned from 100 days of rejection | Jia Jiang]]
* [[HBR: Becoming the Boss]]
</td>
<td>
* [[Courage to be Disliked]]
* [[What the dog saw and other Adventures]]
* [[Book: Psychology of Money - Morgan Housel]]
</td>
<td>
* [[Creeping Determinism]]
* [[Implicit & Explicit Learning]]
* [[Suggestion Impulse Buying]]
</td>
<td>3</td>
</tr>
<tr>
<th>Feb-22</th>
<td>10</td>
<td>
* [[Stocks to watch out in Feb'22]]
</td>
<td>
* [[05 How would you handle conflict within your team]]
* [[How to make work more meaningful for your team?]]
* [[Round 1 Interviews]]
* [[Round 2 Interviews]]
* [[Bias Busters: A better way to brainstorm]]
</td>
<td>
* [[David & Goliath]] by [[Malcolm Gladwell]]
* [[Do Epic Shit]] by [[Ankur Warikoo]]
* [[21 lessons for 21st Century]] by [[Yuval Noah Harari]]
</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Mar-22</th>
<td>10</td>
<td>
</td>
<td>
* [[Storytelling that moves people]] by [[HBR]]
</td>
<td>
* [[The Almanack of Naval Ravikant]]
</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Apr-22</th>
<td>
* [[Boosting and its advancements]]
* [[LIUBoost]]
* [[Base learner]]
* [[NGBoost]]
* [[Probabilistic Regression]]
</td>
<td>5</td>
<td>5</td>
<td>
* [[The Ride of a Lifetime]] by [[Robert Iger]]
* [[Atomic Habits]]
* [[Noise by Daniel Kahneman]]
</td>
<td>
* [[Goldilocks Principle]]
* [[Temptation Bundling]]
* [[Diderot Effect]]
* [[Naive Realism]]
</td>
<td>1</td>
</tr>
<tr>
<th>May-22</th>
<td>10</td>
<td>5</td>
<td>5</td>
<td>
* [[The 4-Hour Workweek]]
* [[Marc Randolph: That will never work]]
</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Jun-22</th>
<td>
* [[Box Cox Power Transformations]]
* [[HBR: A Refresher on A/B Testing]]
* [[Exclusive Feature Bundling (EFB)]]
</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Jul-22</th>
<td>
* [[Q-Q Plots]]
</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Aug-22</th>
<td>10</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Sep-22</th>
<td>10</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Oct-22</th>
<td>10</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Nov-22</th>
<td>10</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<th>Dec-22</th>
<td>10</td>
<td>5</td>
<td>5</td>
<td>2.5</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
Filter error: Missing closing bracket in filter expression
A person is declared legally dead when either his/her brain is clinically dead or his body has experienced irreversible [[Cessation]] of respiration and circulation. For the brain to be declared dead, all activity must have ceased in the cortex, involved in higher function
* goal was to recognize hand-written digits
* trained on grayscale images
* [[Padding]] wasn't used back in 1988
!! Architecture
<img src='http://media5.datahacker.rs/2018/11/leNet5_2.png' width=800>
* [[Softmax]] was not used
* ''Note'': $$n_H, n_W$$ gradually decreases with deeper layers of the network while $$n_C$$ increases
* ''For original paper reading''
** Back then people used [[tanh]] and [[Sigmoid]] non-linearities
** There is a much complex detail to use different filters to different channels that has been explained. This was required back then to save on computation time but it is not required now
** Original LeNet-5 had a non-linearity after [[Pooling]] which was done back then but not today.
** this paper is one of the harder ones to read
** focus on section II and section III which contains experiemnts and results
* Also talks about graph transform network. Not used now
!! Introduction to the course [[Spark by Udacity]]
Learn to use [[Apache Spark]] to work with [[Big Data]] and build [[Machine Learning]] models at scale.
* 2.5 quantillion bytes of data is created every day
* 90% of the world's data was created in last 2 years.
!!! Instructors - Insight Data Science
Insight Data Science is a fellowship program for aspiring [[Data Scientists]], data engineers, and data product managers. You can read more about their fellowship programs on their website [ext[https://insightfellows.com/data-science]]
!!! Course Overview
# How [[Apache Spark]] fits into the [[Big Data]] ecosystem
# Processing and cleaning and datasets
# Debug and optimize spark code for running on clusters
# Training [[Machine Learning]] models at scale
!!! Project Overview
''Problem : Predicting customer churn for streaming music service who are likely to cancel subscription or downgrade to free tier service''
,,[[05 July 2020]],,
!! Lesson 2 - The Power of Spark
!!! 1. Introduction
<<<
Spark should be the ''first tool'' you should learn. It is the King of the [[Big Data]] Jungle
<<<
* Hadoop is a slightly older technology although still in use by some companies. Spark is generally faster than Hadoop
!!! 2. What is Big Data?
* Using distributed system
* Numbers everyone should know: CPU (0.4ns), Memory(100 ns), Storage (16 μs), Network (150ms)
* A 2.5GHz CPU can process 1 day of tweets (each tweet 200 bytes x 6000 tweets/second x 86400 seconds / day) in 5.2 seconds
* Beyond the fact that memory is expensive and ephemeral, we'll learn that for most use cases in the industry, memory and CPU aren't the bottleneck. Instead the storage and network
* Spark was designed for memory optimization
* ''Moving data across the network'' (from one machine to another) is often the ''bottleneck'' when working with [[Big Data]]
* Distributed systems are designed to reduce ''shuffling'' (moving data back and forth between machines)
* Hardware key ratios:
** CPU is 200x faster than memory
** Memory is 15x faster than SSD,
** SSD is 20x faster than network
* Can analyse the data if the dataset is larger than the size of your RAM. [[Pandas]] default library reads entire data in memory, but there is also an option to read file in small chunks. [ext[Pandas Chunking User Guide|https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-chunking]]
```python
reader = pd.read_csv('tmp.sv', sep='|', chunksize=4)
```
* At a high level, [[Distributed Computing]] implies multiple CPUs each with its own memory. [[Parallel Computing]] uses multiple CPUs sharing the same memory.
!!! 3. Hadoop Framework
Includes four components
* HDFS - Data Storage on commodity machines
* MAP REDUCE - [[MapReduce]] implementation for Data Processing and analyzing large datasets in parallel
* YARN - Resource Manager that schedules computational workload of users' applications across a cluster
* HADOOP COMMON - Utilities
Other frameworks
* Apache Pig - Developed by [[Yahoo]] to run adhoc [[MapReduce]] jobs using a language similar to SQL.
* Apache hive - SQL like data like interface that runs on top of Hadoop [[MapReduce]]
''Problem with hive - save results after each computation to disk''
* [[Apache Spark]] - can perform fast in-memory computations for Map and Reduce steps
* [[Apache Flink]]
* [[Apache Storm]] - acquired by [[Twitter]] and then open sourced
* Flink and Storm both are for streaming data analysis for real time processing. Spark has a streaming library called [[Spark Streaming]] but not as popular and fast as some other streaming libraries.
<<<
The Hadoop ecosystem includes a distributed file storage system called HDFS (Hadoop Distributed File System). Spark, on the other hand, does not include a file storage system. You can use Spark on top of HDFS but you do not have to. Spark can read in data from other sources as well such as Amazon S3.
<<<
!!! 4. [[Hadoop MapReduce]] Demo
''MapReduce is a programming technique. [[Hadoop MapReduce]] is a specific implementation of the programming technique''
!!! 5. The Spark Cluster
* Distributed jobs are designed to run in master worker hierarchy. Master organizes the nodes while the workers do actual computing
* Four Modes of Spark
** Local Mode - Using Spark APIs to run computations locally. Preferably used while prototyping a project
** Cluster Mode
*** Spark Standalone Cluster
*** Hadoop YARN - useful when sharing a cluster with a team
*** Mesos by UCB - useful when sharing a cluster with a team
!!! 6. Spark Use Cases
* ''General Purpose Big Data Analytics''- Extract Transform & Load and make an interactive dashboard
* ''Machine Learning'' - Particularly useful when using iterative algorithms like [[Logistic Regression]] or [[Page Rank]]
Manipulating small datasets
* [ext[AWK|https://en.wikipedia.org/wiki/AWK]] - a command line tool for manipulating text files
* [ext[R|https://www.r-project.org/]] - a programming language and software environment for statistical computing
* [ext[Python PyData Stack|https://medium.com/@kevinmsantagichia/pydata-stack-and-some-machine-learning-40f252e9c2e3]], which includes pandas, [[Matplotlib]], [[NumPy]], and [[scikit-learn]] among other libraries
* [[SQLAlchemy]] - leveraging [[Pandas]] and [[SQL]] simultaneously - provides an abstraction layer to manipulate SQL tables with generative [[Python]] expressions.
Spark's Limitations
* ''Spark Streaming’s latency is at least 500 milliseconds'' since it operates on micro-batches of records, instead of processing one record at a time. Native streaming tools such as [[Apache Storm]], Apex, or [[Apache Flink]]can push down this latency value and might be more suitable for low-latency applications
* ''selection of machine learning algorithms'' - Spark only supports algorithms that scale linearly with the input data size. Deep learning is not available either
Beyond Spark for Storing and Processing Big Data
* ''Spark is not a data storage system''
* Newer database storage systems like [ext[HBase|https://hbase.apache.org/]] or [ext[Cassandra|https://cassandra.apache.org/]]. There are also distributed SQL engines like Impala and Presto. Many of these technologies use query syntax that you are likely already familiar with based on your experiences with Python and SQL.
,,[[Spark by Udacity]] | [[05 July 2020]],,
! Data Wrangling with Spark
!!! 1. Manipulating Data
* [[Apache Spark]] is written in [[Functional Programming]] language called [[Scala]]. Using for loops in Python is a way of [[Procedural Programming]]
* Can use it with [[Java]], [[R]] & [[Python]] (Python API called [[PySpark]])
* Problems faced while learning Spark is ''getting comfortable with the functional style of programming''
!!! 2. Why use [[Functional Programming]]?
* Helps minimize errors by implementing functions
* Functions usually have one outcome while in [[Python]] we can write complex functions with complex outcomes.
* The inputs to these functions while evaluating don't change much, unlike [[Python]]
* Running the function multiple times using [[Procedural Programming]] can lead to different outputs for the same function. Anything after `def` in [[Python]] is called as a function, but in fact, these are actually ''methods or procedures''. This cannot be implemented in distributed since if a machine fails to execute the code due to some issue, the output of the function would be different. Sample Code in [[Procedural Programming Demo]]
* ''Pure Functions'' - Functions that preserve the input and avoid side effects. Sour Dough bread factory analogy
* ''Recipe for Data'': Every spark function makes a copy of its input data hence the parent data remains ''immutible''. While there are many functions that needs to be executed. This can be achieved by chaining. But chaining with cause every function to make it own copy of input data and evaluate the function, causing you to run out of memory. Spark overcomes this by [[Lazy Evaluation]]. Spark builds step by step directions (recipe) called [[Directed Acyclical Graph (DAG)]].
* Spark figures out the last step till which it can procrastinate. These are usually multiple step function called ''STAGES''
!!! 3. Data Formats
* CSV, JSON, XML(general case of HTML where tags don't have specific meaning), HTML
!!! 4. Distributed Data Source
* [[Hadoop File System (HDFS)]] - Splits data into 64 or 128 MB blocks and replicates these blocks across the cluster. This way the data is stored in fault tolerant way and can be accessed in digestible chunks
* Amazon Simple Storage Services (S3)
!!! 5. [[Map & Lambda Functions]]
!!! 6. SparkSession
* To read and write data frames we need `SparkSession`
!!! 7. [[Reading & Writing Data into Spark Data Frames]]
* Covers reading a file, computing basic stats, subsetting and finally writing the data into a `csv`
!!! 8. Data Wrangling
* [[Imperative Programming]] using [[Python]] and Spark dataframes. Concerned with ''HOW?''
* [[Declarative Programming]] using [[SQL]]. Concerned with ''WHAT?''
* Declarative systems are usually an abstraction over imperative systems that takes care of the process
* [[Data Wrangling with DataFrames]] screencast
!!! 9. RDDs
* Spark code written in SQL or Python is first passed through the query optimizer (called ''Catalyst'') to create an execution plan ([[Directed Acyclical Graph (DAG)]]). You won't notice much difference between SQL or PySpark.
* The code generated in the execution plan is genetated on a lower level abstraction called [[Resiliant Distributed Dataset (RDD)]]
* When we need more flexibility than what higher level APIs (Python or SQL) can provide we need to directly interact with RDDs.
* Using RDDs we lose access to ''Catalyst'' which could have optimized the code.
,,[[Spark by Udacity]] | [[06 July 2020]],,
! Setting up Spark Clusters with AWS
Spark provides 3 options to work on a cluster
* Standalone Mode
** Local mode : You are running a Spark program on your laptop like a single machine.
** Standalone mode : You are defining Spark Primary and Secondary to work on your (virtual) machine. You can do this on EMR or your machine. Standalone mode uses a resource manager like YARN or Mesos.
* MESOS - Sharing spark clusters across entire team
* YARN - Sharing spark clusters across entire team
!!! 1. Setup
* Amazon S3 for storing dataset
* EC2 - Elastic compute cloud (Rented Amazon Cluster)
* Login to cluster remotely. Running spark job will load the data onto the cluster memory from S3 putting a portion of data onto each machine in the cluster
!!! 2. [[Connect AWS using CLI]]
!!! 3. Spark Scripts
While [[Jupyter Notebook]]s are great for prototyping and sharing results across the team, for automating workflows they can be tedious to run manually. Writing Spark scripts in [[Python]] allows us to automate spark jobs which can be scheduled at a particular frequency
,,[[Spark by Udacity]] | [[12 July 2020]],,
! Debugging & Optimization
Spark in local mode throws errors in notebooks, but in cluster it is difficult to diagnose.
!! Code Errors
* While Spark supports [[Python]] API, its native language is [[Scala]] that is why some errors may refer to Java, Scala or JVM issues even when we are running [[Python]] code.
* Spark dataframe column names are NOT case sensitive
!! Data Errors
* Spark is smart in figuring out corrupt records in the data. It adds new column with `_corrupt_record`. A corrupt record can be check by loading the data where `_corrupt_record` is not `NULL`
!! Debugging Code
* In the cluster, the print statements are not useful because the worker nodes are running the computations but the driver node is assigning them. The user is cannot see the output because the user is not connected to them. Spark makes a copy of the input data every time you call a function, so the original debugging variables that were created won't actually get loaded into the worker nodes. Instead each worker has own copy of these variables and only these copies get modified, the original variables stored on the driver remain unchanged, making them useless for debugging.
* To get around these, Spark gives special variables called accumulators. ''Accumulators'' are like global variables for your entire cluster
!!! How to use Accumuators
As the name hints, accumulators are variables that accumulate. Because Spark runs in distributed mode, the workers are running in parallel, but asynchronously. For example, worker 1 will not be able to know how far worker 2 and worker 3 are done with their tasks. With the same analogy, the variables that are local to workers are not going to be shared to another worker unless you accumulate them. Accumulators are used for mostly sum operations, like in Hadoop MapReduce, but you can implement it to do otherwise.
[ext[Spark Accumulator Documentation | https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#accumulators]]
```python
# Defining the accumulator
incorrect_records = SparkContext.accumulator(0,0)
incorrect_records.values # Output : 0
# Create a function to increment accumulator for every incorrect record
def add_incorrect_record():
global incorrect_records
incorrect_records += 1
# UDF to be applied to the dataframe
from pyspark.sql.functions import udf
correct_ts = udf(lambda x: 1 if x.isdigit() else add_incorrect_record())
# create a column with corrupt record indicator ts_digit
logs3 = logs3.where(logs3['_corrupt_record'].isNull()).withColumn('ts_digit', correct_ts(logs3.ts))
incorrect_records.values # output is 0 - because of lazy evaluation
logs3.collect()
incorrect_records.values # Output : 4
incorrect_records.values # Output : 12 - rerunning it again increased the counter. This will increase in number of retries after a task failure.
```
While accumulators can be useful use it with care.
!! Spark Broadcast
Spark Broadcast variables are secured, read-only variables that get distributed and cached to worker nodes. This is helpful to Spark because when the driver sends packets of information to worker nodes, it sends the data and tasks attached together which could be a little heavier on the network side. ''Broadcast variables seek to reduce network overhead and to reduce communications''. Spark Broadcast variables are used only with Spark Context.
* Broadcast is a way of joining large tables with small tables
* Broadcast join is like a map-side join in MapReduce
!! Spark Web UI
* The WEB UI provides the current configuration for the cluster, which can be useful for double checking that your desired setting went into effect.
* The Web UI also shows the [[Directed Acyclical Graph (DAG)]].
* The DAG is brokem up into stages and each stage has individual task. Tasks are the steps that individual worker nodes are assigned. In each stage the worker nodes divides up the input data and runs the task for that stage.
* The WebUI pages related to current spark jobs
!!! Connecting with Spark Web UI
Spark users several agreed upon ports for sharing information
* For machines to communicate with each other - spark master uses `port 7077` to communicate with the worker nodes
* Jupyter notebooks on `port 8888`
* Active spark jobs on `port 4040`
* (Important) Web UI for the master node - `port 8080` - show status of the cluster, configurations, and status of any recent jobs
!!! Different types of Spark Functions
''Transformations and Actions''
There are two types of functions in Spark:
* Transformations
* Actions
Spark uses lazy evaluation to evaluate RDD and dataframe. [[Lazy Evaluation]] means the code is not executed until it is needed. The action functions trigger the lazily evaluated functions. For example,
```python
df = spark.read.load("some csv file")
df1 = df.select("some column").filter("some condition")
df1.write("to path")
```
* In this code, `select` and `filter` are transformation functions, and `write` is an action function.
* If you execute this code line by line, the second line will be loaded, but you will not see the function being executed in your Spark UI.
* When you actually ''execute using action ''`write`, then you will see your Spark program being executed:
** `select` --> `filter` --> `write` chained in Spark UI
** but you will only see Writeshow up under your tasks.
This is significant because you can chain your RDD or dataframe as much as you want, but it might not do anything until you actually trigger with some action words. And if you have lengthy transformations, then it might take your executors quite some time to complete all the tasks.
[[Spark by Udacity]] | [[12 July 2020]]
* Refers to difference in the level of judgement (linency/harshness) by the individual judges for the same case
* Only form of noise that organizations can monitor
*
Course on [[LinkedIn Learning]]
!!! Benefits
* [[Brain]] science can help an employee understand their motivation and alignment
* Brain science can also improve employee engagement
* Improve training material
* Debunk old learning practices
* Improve [[Creativity]], [[Decision Making]] and [[Leadership]] skills
* Improve deeper understanding of [[Soft Skills]]
Adding more learning to impact [[Unconscious]] brain as 90% of brain functions are outside of our consciousness. Practice like [[Doodling]] improves memory by 29%
Space time story graphic (3rd example of multivariate data visualization)
* Time on the x axis
* Location relative to ground on y-axis
<img src='https://www.researchgate.net/profile/Molly_Brown5/publication/234609031/figure/fig2/AS:487757056352258@1493301752937/The-life-cycle-of-the-Japanese-Beetle-By-L-Hugh-Newman-in-Man-and-Insects-London.png' width ='800'>
```python
import pytvlwcharts as ch
def plot_chart(ticker):
x = df[df.ticker == ticker][['datetime','open', 'high', 'low', 'close', 'volume','sma50','sma200','RS']]
x = x.rename(columns={'datetime':'date'}).tail(200).reset_index(drop=True)
x['value'] = x.volume
x['color'] = np.select([x.open < x.close, x.open > x.close],['green','red'])
x['time'] = x['date'].astype(str)
chart = ch.Chart(width=1300,
height=400,
grid=ch.GridOptions(
horz_lines=ch.GridLineOptions(visible=False),
vert_lines=ch.GridLineOptions(visible=False)),
left_price_scale = ch.PriceScaleOptions(visible=True),
right_price_scale = ch.PriceScaleOptions(visible=True),
time_scale = ch.TimeScaleOptions(border_visible=True, visible=True),
watermark = ch.WatermarkOptions(
text=ticker,
visible=True,
font_size=60,
color="rgba(0.1,0.1,0.1, 0.1)"))
chart.mark_bar(data=x[['time','open','high','low','close']], scaleMargins={'top':0.1, "bottom":0.4} )
# chart.mark_histogram(data=x[['time','value','color']], priceFormat={"type":'volume'},priceScaleId='',scaleMargins={'top':0.7, "bottom":-1})
chart.mark_line(data=x[['time','sma50']].rename(columns={'sma50':'value'}), color='gray')
chart.mark_line(data=x[['time','sma200']].rename(columns={'sma200':'value'}))
# chart.mark_line(data=x[['time','RS']].rename(columns={'RS':'value'}), color='green')
print('\n')
return chart
```
* Light GBM is a [[Gradient Boosting]] framework that uses [[Tree-Based Learning]] algorithm.
* LightGBM solves the problems of efficiency and scalability when the feature dimensions are high and the data is large
* LightGBM proposes two novel approaches
** [[Gradient Based One-Side Sampling (GOSS)]] - which can obtain accurate estimate of [[Information gain]] with a much smaller dataset size.
** [[Exclusive Feature Bundling (EFB)]] - Bundles sparse features to reduce the number of features
!! Summary
[[Gradient Boosted Decision Trees (GBDT)]] faces a tradeoff challenge between accuracy and efficiency. Conventional implementations scan all data instances to get an estimate of [[Information gain]] of all possible split points. Therefore, the
$$ computation \ complexity = f(\# \ features, \# \ instances) $$
!!! GOSS to reduce # instances
Sampling is one way to reduce (# instances) and LightGBM proposed approach of [[Gradient Based One-Side Sampling (GOSS)]]. According to the definition of [[Information gain]], instances with larger gradients contribute more to the [[Information gain]]. GOSS keeps all instances with large gradients (top k%) and randomly drops instances with small gradients. This works better than [[Simple Random Sampling]] and gives more accurate estimation of [[Information gain]]
!!! EFB to reduce # features
Sparse features like variables with [[One-hot Encoding]] results in large # of features. LightGBM proposes [[Exclusive Feature Bundling (EFB)]] to safely bundle exclusive features without losing information.
* In the first step, EFB identifies mutually exclusive features which could be bundled together. It does so by quantifying the exclusiveness between features with a conflict measure, which computes fraction of overlap of non-zero values between features. Assign features to a bundle if conflict < threshold
* In the next step, it is made sure that non-zero values of individual features reside in different buckets of bundled feature. The feature value of the second feature is offset by number of distinct bins identified in feature 1, as shown in example below
:<img src='https://miro.medium.com/max/864/1*SigQkx_yJFh_5ZVmJvCpxQ.png' width=200>
!! Reference
* [[LightGBM Paper|https://proceedings.neurips.cc/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf]]
```python
from sklearn.externals import joblib
# save model
joblib.dump(lgbmodel, 'lgb.pkl')
# load model
gbm_pickle = joblib.load('lgb.pkl')
```
,,[[LightGBM Sample Code]] | [[09 July 2022]],,
!! Basic Code
```python
import lightgbm as lgb
d_train = lgb.Dataset(X_train, label = y_train)
lgb_params = {
#'max_depth' : 5,
'learning_rate': 0.01,
'objective': 'regression',
'num_leaves': 10,
'boosting_type' : 'gbdt',
'device_type':'gpu',
'metric' : 'rmse',
'seed' : seed,
'verbosity': 1
}
print ('Training LighGBM Model...')
lgb_model = lgb.train(lgb_params, d_train, num_boost_round = 100)
print ('Predicting...')
train_preds = lgb_model.predict(X_train)
test_preds = lgb_model.predict(X_test)
print ('Mean Predicted Test :',test_preds.mean())
print ('Mean Actual Test :',y_test.mean())
print ('Mean Predicted Train :',train_preds.mean())
print ('Mean Actual Train :',y_train.mean())
```
[[LightGBM]] | [[01 June 2022]]
* ''Local interpretable model-agnostic explanations (LIME)''
* is a paper in which the authors propose a concrete implementation of local surrogate models. Surrogate models are trained to approximate the predictions of the underlying black box model. ''Instead of training a global surrogate model, LIME focuses on training [[Local Surrogate]] models to explain individual predictions''.
* Lime trains an inherently interpretable model (like [[Decision Trees]] on a new dataset made from the permutation of samples and the corresponding prediction of the black box.
* has good local approximation but not global approximation - [[Local Fidelity]]
* shows which feature contributes to the prediction and by how much
!!! Cons
* might be unfit for cases where we legally need complete explanations of a decision - credit decline
* can sometimes provide very different explanations for two nearby data points
!! References
* https://christophm.github.io/interpretable-ml-book/lime.html
* LIME Research Paper - https://arxiv.org/pdf/1602.04938.pdf
,,Tags: [[14 August 2021]],,
* Linear regression is a [[Linear Model]] that predicts a continuous outcome using the input features X
* Assumes feature feature independence i.e. no [[Correlation]]
* The model is [[Intrinsically Interpretable]] - i.e. self explainable model
$$y = b_0 + b_1x_1 + ... + b_n x_n + \epsilon$$
where
* $$y$$ - target variable
* $$b_0$$ - intercept or constant term
* $$b_i$$ - learned weight or coefficient for variable $$x_i$$
* $$\epsilon$$ - error term
!! model build with [[sklearn]]
```python
from sklearn.linear_model import LinearRegression
reg = LinearRegression().fit(X, y)
coefficients = reg.coef_
intercept = reg.intercept_
preds = reg.predict(X)
```
!! References
* [[Linear Regression with sklearn|https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html]]
Course on [[LinkedIn Learning]] about [[Feature Engineering]]
!! Feature Engineering Takeaways
* [[Feature Engineering]] helps you create simple models, with high explainability
* reduced intuitive features may not give you best performing model but it will definitely be simple and explainable
* Drop correlated features or use [[Principal Component Analysis]] to create new feature out of features with high [[Correlation]]
* Use [[Box Cox Power Transformations]] to make the variable distributions more well behaved and compact so that the model doesn't get distracted chasing the tail for [[Long tail Distributions]]
!! Modelling Takeaways
* 60 - 20 - 20 strategy: 60 for train and CV, 20 as validation to test all combinations of models, 20 - to state the results (completely unseen data)
* [[Grid Search]] with [[K-Fold Cross Validation]] allows the test the stability of the model parameters over each data point in train
* Final model should be trained on 100% training data - even though the best parameters are selected on part training data during cross validation
!! Main Ideas
* Conflict is a gift
* Learn to manage yourself first - instead of reacting on the conflict learn with curiosity what is wrong
* ''Appreciation, non-judgement and curiosity - major tools that helps in conflict of any kind''
<hr>
!! Turn your adversaries into allies
* Techniques borrowed from [[Aikido]] - Goal is to render the attack harmless without harming the attacker. Getting out of the way of attack, and moving in to join with this energy to redirect it - not trying to harm the opponent but taking contract and de-escalate the conflict
* IF we can vanquish the source of conflict within ourselves then we won't have difficulty with those outside of ourselves.
* ''Blending and Redirecting'' - Practicing [[Aikido]] anytime we listen with the intention learn, with curiosity
* Reframe the conflict as the gift of energy
!! Start with yourself
''I you can't manage yourself, you can't manage anybody else''
* Conflict causes me to look at myself and ask why it is getting to me? how can I decide to take an active role in the conflict?
* Manage my emotional mindset
* For example - If somebody says, 'this is a stupid idea', instead of reacting and saying, 'this is a great idea' you should get out of the line and know out of curiosity, //what is the thing that you particularly don't like about the idea//, //What makes you thing this idea is bad?//
* [[Amygdala]], the brain stem, has some very strong reactive patterns programmed into it and [[Pre-frontal Cortex]] is the thinking part. The journey takes less than half a second, so stop in that moment and breathe
!! Adopt rituals that center you
* Usually in a conflict, people hold their breath. So to center, just breathe - focus on the breath is enough
* Focusing on an object can also allow you to center
!! Appreciate their positive intentions
* 1x1 with employee - Instead of assuming the person has no skillset, assume a positive intention behind the behavior. Most people are afraid of conflict.
* On the Aikido mat, usually one side of the body learns faster than the other side of the body. Like if two people are not working together, there might be cases they would be working together, learn the circumstances and apply the learnings when they are not working together
!! Enter conflict with genuine curiosity
* Are you asking the question that is meant to be an attack or out of curiosity. It should not be the first.
* ''The quality of your being is primary, everything else is secondary''
* If I come into a conflict conversation, it should be approached it in a way, that you will learn something about the other person and they he/she sees things, and you know it is going to be better after this - that's the quality of being, mindset, and emotional. Instead of thinking, it is going to be awful
* Any key questions while listening?
** ''Can you tell me how this started?'' - if a manager is talking to employee about a conflict
** ''What's your view about how the resolution would work?''
** ''Can you tell me more about what you are thinking?''
** ''How do I affect you in ways that are not helpful?''
** ''How could I be more helpful?''
** ''How do you see your contribution in this conflict?''
!! Listen with intention and openness
* If you just listen, people will feel heard and aligned.
!! Acknowledge before you advocate
* Acknowledge - I am not just listening, I am also showing you that I also heard what you said
* Advocate - Taking your turn. Share your perspective
If everybody gets a chance to be heard, then all the information is out there on the table, you can begin to sort through and solve the problem.
!!! Changing the mindset
<<<
''Mindset from difficult conversation''
* //How do I look good?//
* //How do I make myself right?//
''to the mindset of learning conversation''
* //What can I learn?//
<<<
!!! How to Acknowledge
<<<
Acknowledgement the secret sauce, because we never do it. because we have this notion, that if we acknowledge an opposing point of view, it means we agree with it, which is not true. Instead wo go from
* //Okay. Yeah. But,// or
* // Right. Yeah but.//
Acknowledgement means I am good enough to listen to you, care enough about the problem that you are facing. And it sounds like -
* //What I hear you saying is// or //Is this what you are saying?// or
* // Can I clarify?// or
* //If what you are saying is true, then it would all work out if...//
This is not about manipulation to make the other person ready to hear your point of view but it is about sincerely trying to solve the problem and ready to admit the fact that what other person is saying is right
<<<
!! Educate to Advocate
* Not selling but education - assume that you don't know any thing about the other person and also assume that the other person also does not know what is going on with you
* While Advocating, show them what you see and ask // What do you think?// - go back into inquiry
!!! How do you know, they feel heard?
When the answer the question - //Is there anything else? // is NO.
,,[[LinkedIn Learning]],,
* People want to be understood and accepted. Cheapest and effective way to get there is by ''listening''.
* Listening demonstrates [[Empathy]]
* When people feel listened, they tend to listen to themselves more carefully and to ''openly evaluate and clarify their own thoughts and feelings. ''
* They tend to ''become less defensive and oppositional'' and more willing to listen to other points of view, which gets them to calm and logical place
!! Re-Investment Rate
<img src='https://marcellus.in/wp-content/uploads/2021/08/unnamed-2021-08-09T114823.772.jpg' width=600>
!! Diversification
<img src='https://marcellus.in/wp-content/uploads/2021/08/unnamed-2021-08-09T114959.101.jpg' width=600>
* [[Boosting]] technique to handle [[Imbalanced Classification]]
* Three methods to handle [[Imbalanced Classification]]
** [[Sampling]] Techniques - undersample majority class or over sample minority class
** [[Cost-sensitive]] methods - apply higher misclassification cost to minority class instances
** [[Ensembling]] methods - [[Bagging]] and [[Boosting]]
* [[Ensembling]] methods incorporate sampling and cost-sensitive learning and they are wildly successful for imbalanced classification. But, they result in ''higher misclassification for majority class''.
* LIUBoost considers local under-sampling to learn the characteristics of individual instances and incorporates that into weight update equation of [[AdaBoost]]
* LIUBoost over performs on 18 datasets on [[AUPR]] curve when compared with [[RUSBoost]] and [[SMOTEBoost]] which also handles imbalanced classification
* Uses KNN to identify two sets of weights (+) or same class and (-) or opposite class using small K value that help differentiate borderline and outlier instances of both majority and minority class
** Weight (+) will grow rapidly if they are misclassified
** Weight (-) will drop rapidly if they are correctly classified
!! Reference
<embed src='https://arxiv.org/pdf/1711.05365.pdf' width=700 height=400>
[[20 April 2022]]
Unlike [[Global Surrogate]], local surrogate explains individual predictions of black-box models
* Logistic Regression is similar to [[Linear Regression]], except the outcome is now ranged between 0 and 1
* The learned weights/coefficients for input features are not additive as in case of [[Linear Regression]]. They are indicative of direction and influence
!! Model build with [[sklearn]]
```python
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(random_state=0).fit(X, y)
preds = clf.predict(X[:2, :])
probs = clf.predict_proba(X[:2, :])
```
!! References
* [[Logistic Regression with sklearn|https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html]]
!! [[Workout]] the love handles
<iframe width="560" height="315" src="https://www.youtube.com/embed/-HDzxuSddJw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Excercise summary
<img src = 'https://lh3.googleusercontent.com/qH8-h1BEnTn4g9z2cGWfAdNZ6JgNSpGM6TKYdUluXTr-yHuwXNcLjURe2r5oqOx2skSEZi-TuvpasUwxr5BrnXubLsaDsHjgF_F13LxIyQrnyfDz0R_hZoErDlYBN4h0TIgHAeziAK7FpYIqZEDbz8inIgZNybDqR9CERUaPl3gU95Np9MxW0yqr2tQDnwNFo97E62C03dADs_v29opGkTLWhQTbEzL1sqqvhSrHqljb9SHhBucLp7QSASvdQENG2xNSsVTkyYja0wzwvpx8Ku7e6KT0ai76C7mNU6U98DgLDOG4vQ_kG2vAwTrkmamMugCyLqZXg7Uyv-wK0cEM3opg-4u4yNnrmxDaAcKp7LyVVq_Shm18kh3siwups5NpwxpH9xk8DZOoJaAw5iM0tOjMQ2gBfE5vu5TJDfpn0d40nJjY5G2aNKECK3JR4ckGoZ8RfoxqMMNUxCcCUjcRp6C3CNxUEPUkJ_ZXvor37aGxFE4tt0NBiWcP5SpmfAkia_4hEC4BthNFTd2zhGP44BkxZhIQ37t19x0qCJtUXMmSG7OHdwJWeeSQpsB_5hFqacJu0SYfEP4uYo-ynFk-1Kr8nvA8kpt5Cd3jGlhWLuJ8bPfZZWWf7xJjAtPFHQgVBLh9bzPNuN4GqI4NLRSGTtKS6X1dGGeMyOPmxxhZWC6SUkeQRbVg9x2QtsFusnk=w615-h346-no?authuser=0' width ='560'>
<<<
People are statistically more likely to avert a loss than to achieve an equal gain
<<< [[Never Split the Difference]]
* Next-generation AI Voiceover & Text to Speech Platform with human-like voices
* https://www.lovo.ai/
[[AI Businesses]] | [[Text to Speech]]
!! Facts
* ''Founded in'' : 2012 (Listed 4 years back as of 2020)
* ''Founders'': A. M. Naik (founder Chairman)
* ''Sector'': Engineering Services Provider
* ''Product'': world-leading engineering, research and development (ER&D) and digitalization solutions to its customers
* ''Applications'': Transportation, Telecom, Med-Tech, Industrial Products, Plant Engineering
* [[ROCE]] - (38.5% 5 Year Avg) - 38, 45, 43 (Mar'20) and 29 (Mar'21)
* ''Sales Growth'': 12.2% (5 Year Avg), -3% (Mar'21)
* ''Promoter Share'': High, 74.23% (public share at 10%)
* Part of [[Saurabh Mukherjea]]'s [[Little Champs]] portfolio
* ''Barriers to entry'' - Additives are ubiquitous and used in very small quantities (typically constitute <1% of the molecular weight of the end product) but lend critical functional characteristics to the end product. Hence, ''high quality alongside consistency, customisation, safety'' (since these are used in food products) and ''environmental considerations create strong barriers to entry''
* ''Competitive Advantage''
** R&D: 502 Patents (from Annual Report)
** 69 of Fortune 500 Companies
* ''Key Risks''
** Regulatory or customer actions
** Price of Raw materials
* Exports accounted for ~55% of the Company’s revenues in FY20
* strong global presence in food and polymer additives. These two segments together account for nearly 60-70% of the Company’s revenues
!! In the News
<<<
20-25% earnings compounding over a long time should be feasible for Fine Organics and therefore we have built a substantial position in the small caps and specialty chemicals companies
<<< [[Saurabh Mujherjea in ET Prime|https://economictimes.indiatimes.com/markets/expert-view/autos-and-financials-best-way-to-play-recovery-saurabh-mukherjea/articleshow/81686017.cms?from=mdr]]
!! Why invest in this Stock
''Key Success Factors''
* ''Competition'' - Not much competition in Food and plastic additives. 4-5 global competitors, no significant competition in India
* ''Vetting process is stringent''. Good and consistent quality is required since directly used in the products
* This ''specialised nature'' of product creates entry barriers around know-how, a long gestation period for product development and highly technical sales skills.
* Strong relationships and increased customer stickiness
* Strong technical and product development team
''Strong R&D Focus''
* ''Packaging'' - introduced oleo-chemical based additive can be used to package vegetarian food not possible with additives derived from animal fats
* ''Cattle Feed'' - additive to be mixed with cattle feed which on digestion lowers the content of harmful saturated fats in milk produced by the cattle
* ''First Mover advantage and market leadership'' - Oleo Chemicals are derived from plants and are important for customers turning towards green and environment friendly products
!! Key Risks
* ''Any regulations/action surrounding products or production processes'' - Fine Organics was issued a show cause notice from Maharashtra Pollution Control Board and production on one of the plants was stopped, later plant was issued a Zero Effluent plant notice to continue production
* ''Significant volatility in Raw material prices''
** imposition of duties by Govt of India or by Exporting countries
** Short term impact on margins due to mismatch in duration and timing of contracts with vendors and customers
!! Financial Performance
<img src='https://marcellus.in/wp-content/uploads/2021/05/Exhibit-4.jpg' width=600>
!! Information on [[Screener]]
Fine Organic Industries is carries on business in India and abroad, as manufacturers, processors, suppliers, distributors, dealers, importers, exporters of wide range of oleochemical-based additives used in foods, plastics, cosmetics, coatings and other specialty application in various industries.
* ''Largest in India and among top 6 global players''
:Fine Organic is the largest manufacturer of oleochemical-based niche additives in India. It is among the six largest global players in polymer additives and among leading global players in specialty food emulsifiers.
* ''Diversified customer base''
:Fine's client/customer base includes companies like [[Coca-Cola]], [[Britannia]], [[Asian Paints]], [[Parle]], [[Pidilite]], [[Berger Paints]] etc. No individual customer accounts for more than 5% of revenue. Fine Organic’s product portfolio comprises of over 400 products including food additives, polymer additives, emollients for cosmetics, additives for rubber & elastomers, etc.
* ''Shift from synthetic chemicals to oleo-chemicals''
: Demand for [[Oleo-chemicals]] are increasing as they are green additives and environment friendly
!! References
* [[L&T Technology Services Annual Report|https://www.bseindia.com/bseplus/AnnualReport/540115/5401150320.pdf#page=4]]
* [[Little Champs: Spotlighting Fine Organic Industries Limited|https://marcellus.in/newsletter/little-champs/little-champs-spotlighting-fine-organic-industries-limited/]]
* [[Fine Organics, Where Saurabh Mukherjea Bought Stake, Has Gained 41% Since April|https://in.investing.com/news/fine-organics-where-saurabh-mukherjea-bought-stake-has-gained-41-since-april-2730549]]
* [[Information from Screener|https://www.screener.in/company/FINEORG/consolidated/]]
* [[Investor Presentaion|https://www.fineorganics.com/images/stories/download/Investors/Presentations/Intimationletter-presentationNovember2020.pdf]]
:<embed src='https://www.fineorganics.com/images/stories/download/Investors/Presentations/Intimationletter-presentationNovember2020.pdf' width=1000, height=400>
MACD stands for moving average convergence and divergence
* developed by Gerald Appel in late 70’s
* most reliable indicators by momentum traders
* Convergence → 2MA move towards each other
* Divergence → 2 MA moves away from each other
* Default (12EMA, 26 EMA)
* Convergence Divergence Value = 26 EMA - 12 EMA = MACD line
!! Sign of MACD
* tells us direction of stock’s movement
* positive sign → positive momentum
* higher momentum → higher MACD magnitude
* MACD spread
** Increases when momentum increases
** Decreases when momentum decreases
* MACD Crosses center line
** From negative to positive → Bullish momentum → go long
** From positive to negative → Bearish momentum → go short
''Waiting for the MACD line to cross over → bulk of the move already done → overcome by adding a signal line (9EMA)''
* Bullish → MACD crosses 9 EMA → buy
* Bearish → MACD crosses below 9 EMA → sell
The core of MACD is MAs, so all properties related to MA will apply here too.
<<<
Machine Learning is the field of study that gives computers the ability to learn without being explicitly programmed
<<< Arthur Samuel
<img src='https://lh3.googleusercontent.com/clkBngno1ILTTba93mgH10C_L1rt3Izfrzq9E1VK3V1bgPUP6f2uD0MLwVUapsNPidQntJs3Y8gu4-wS2TW3cnSvteSS8CkIGLsERwVFRcHfddoIZPJmZF3zfG0fywEJPNT49p3c91uTBXlIlVfm0mAM_doUFvGQ9E2FUHAuiSrzifCHQqTz_-Ox6o5l467e-dHQoCXD9WP3a68Ar0GxrHvrTtJCc0FBdu102utOKIPOKoxzymXU6RwEVTpasDvfjb9Atho19ENOizOPz9xMUWJGg_5eVuDHp0MmvkfRFJViyY3vnZCcIRB8_x25sn5hAcwzrC99XdjPNCK4QaIzhdFWGPS4OsRKXs8joGmKaTKp1C71OZNBtPR6_YHMuDTAhC2FTjhGgCWX_7n15uTVJ8-C--ye_ZA_QFYxHvEaTdXTDmCYHCrp1IDJMGUvg70mxF63oSxX1kJM2KBA3-3MP0rDnTqiPvBEekZSiseqzsrUJYVGMwPL1HcgpWnBrc38XnprSNxbOmS1XGu-mvEAHIdZkvQkhEFqbC6InEj0scNBF1CNQBQ5ZCoA5P_YebeJgvlOGVKSsYSzswnTDAIoofTjGCz1tyvLikBWeWtSz-cpRJBbzGia4ddq8tfFHmvUDg4XkQsCPlkWLJp0DJfzTUFM-VDKnlDENetobDix_xgYtcbKv5JzupbtJBGJ5tcrIR9pRYdp3C8fFaNVg1OJ-nWS6w=w549-h349-no?authuser=0'>
Improvement goes down as you go down the list
!! 1. Data
!! 2. Algorithms
!! 3. Algorithm Tuning
!! 4. Ensembling
!!! Reference
* https://machinelearningmastery.com/machine-learning-performance-improvement-cheat-sheet/
,,Tags: [[Methods to improve performance of Multi-class models]] | [[08 August 2021]],,
* https://magicstudio.com/
* Create stunning Profile Pictures with AI Profile Pictures that make you look awesome!
[[AI Businesses]] | [[AI Art]]
* [[Body Language]]
* [[Postures]]
<<<
Audience is the Luke Skywalker, presenter is master Yoda. Job of the speaker is to guide the audience on their journey
<<<
<iframe width="560" height="315" src="https://www.youtube.com/embed/cFLjudWTuGQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,[[Stanford Graduate School of Business]] ,,
!! Stock Selection
Checks for [[Momentum Investing]] stocks for achieving super-performance. If you want to make 20-25%, you can give them to mutual fund managers and chill, otherwise you should compound your wealth faster than MF managers. This is already in favor of retail investors because [[Mutual Fund]] managers have to keep position size high
* Stocks within 25% of their 52 week high
* Eliminate stocks trading below 30
* 200MA is rising for at least 3 months - there is some buying power within the [[Stock]]
* 50MA > 200MA
* Current Price > 200MA & preferably Current Price > 50MA
* Current price > 50-100% from 52W Low
* The stock should have made a new 52W High at least once every six months
Gives a list of around 100 stocks
!! Entries
''Volatility Contraction''
* up move, inside bar, smaller inside bar, enter at the high of inside bar, SL at 8% of the buying price.
* If the [[Inside Bar]] stop loss hit but the closing is within the same buying range that means, it has shaken weak hands, and the next breakout is going to be much bigger, so double position size
''Urgency Strategy''
!! Managing Trades
* Max 5 stocks invested in
* Free Float < 5000 Cr. [[Large Cap]] companies have very high [[Free Float Market Capitalization]] than 5000. Not enough buying power to move the stocks up 40-50% in few months
* IF multiple stop losses hit within one day. Take a break of two weeks - markets sentiment change - gauge market post 2 weeks with 1 or 2 trades, let them get profitable and then enter with full capital.
!! Managing Risk
* Max Risk is 1% of portfolio
! PySpark basics - Tutorial 2
This tutorial covers
* Using `map` function on PySpark Data frames
* Using Lambda functions to define anonymous functions
!! 1. Map Function
* ''Map'' - makes a copy of original input data and transforms that copy according to function inside the map
* ''SparkContext'' - `sc - pyspark.SparkContext()`
** `parallelize` takes a python object and distributes the object across the cluster for Spark to use functional features on dataset
** `df.map(<function>)` - instantly runs because of lazy evaluation (not actually ran)
** `collect()` - to collect the results from all the machines and send it back to the user
```python
import pyspark
sc = pyspark.SparkContext(appName="maps_and_lazy_evaluation_example")
log_of_songs = [
"Despacito",
"Nice for what",
"No tears left to cry",
"Despacito",
"Havana",
"In my feelings",
"Nice for what",
"despacito",
"All the stars"
]
distributed_song_log = sc.parallelize(list_of_songs)
def convert_song_to_lowercase(song):
return song.lower()
distributed_song_log.map(convert_song_to_lowercase)
distributed_song_log.map(convert_song_to_lowercase).collect()
```
!!! 2. Lambda for Anonymous functions
```python
distributed_song_log.map(lambda song: song.lower()).collect()
```
[[Lesson 3 : Spark by Udacity]] | [[07 July 2020]]
MapReduce is a programming technique for manipulating large data sets. [[Hadoop MapReduce]] is a specific implementation of this programming technique.
# ''Map'' - [[HDFS]] breaks data into chunks called ''partitions''. Each map process reads partition from disk. Transforms each record in each partition and writes the output in the intermediate file. In the map step, each data is analyzed and converted into a (key, value) pair (tuples).
# ''Shuffle'' - shuffled across the cluster so that all keys are on the same machine. (''This is why the KNN fails for large keys of sic|zip'')
# ''Reduce'' - In the reduce step, the values with the same keys are combined together.
While [[Apache Spark]] doesn't implement MapReduce, you can write Spark programs that behave in a similar way to the map-reduce paradigm.
* The slope of the line reflects the speed of the train
* The intersection of two lines reflect the time and place the trains are going to cross each other
<img src = 'https://miro.medium.com/max/2928/1*0gHhGPMNUiaH0kV1QTnjLg.jpeg', width = '1000'>
Marginal Effects tells us how the outcome changes when a specific independent variable changes
For example if an individual saw her income rise by 5000 and as part of her response she increased her yearly purchase of amontillado from two casks two three. The marginal increase is 5000 and marginal effect on het purchase of amontillado was increase in 1 cask per 5000
!! References
* [[Marginal Effects: Definition|https://www.statisticshowto.com/marginal-effects/#:~:text=Marginal%20effects%20tells%20us%20how,when%20analyzing%20regression%20analysis%20results.]]
<table>
<thead>
<tr>
<td>Source</td>
<td>Information</td>
</tr>
</thead>
<tbody>
<tr>
<td>TradingView</td>
<td>Information on [[stock]] price and [[Price Action]], News
</td>
</tr>
<tr>
<td>[[Economic Times]]</td>
<td>News, Financial Data</td>
</tr>
<tr>
<td>[[MoneyControl]]</td>
<td>News, Financial Data</td>
</tr>
<tr>
<td>[[Screener]]</td>
<td>Financial Data</td>
</tr>
<tr>
<td>[[NSE]]</td>
<td>Bulk Deals</td>
</tr>
<tr>
<td>[[Tickertape]]</td>
<td>Mutual Funds</td>
</tr>
</tbody>
</table>
<<<
* retail is attracted to volatility. Stocks that are volatile have higher retail participation measured in terms of beta.
* [[Beta Anomaly]] that high-beta stocks underperform low-beta ones on a risk-adjusted basis. While gambling-prone investors pay the price for high-beta stocks in terms of poor returns, over the long run, investors of low-beta stocks benefit, not only from superior returns of these stocks but also from the boost in geometric returns that comes with low risk-taking,”
*
<<< [[Caught in a value-buying trap: why retail investors often get it wrong|https://economictimes.indiatimes.com/prime/money-and-markets/caught-in-a-value-buying-trap-why-retail-investors-often-get-it-wrong/primearticleshow/84944136.cms]]
Market sentiment refers to the overall attitude of investors toward a particular security or financial market. It is the feeling or tone of a market, or its crowd psychology, as revealed through the activity and price movement of the securities traded in that market.
!! 1. Percentage of stocks trading above 200EMA
* percentage of NIFTY 50 stocks trading above 200 day moving average
** Imbalance in the market
!! 2. Put-Call Ratio
* Low PCR means, less traders buying put leading to strong bullish sentiment
!! 3. VIX
!! COT Report
* The Commodity Futures Trading Commission (CFTC) of the US releases a Commitments of Traders (CoT) report every week on Friday showing a breakdown of previous Tuesday’s open interest in derivatives (futures and options) contracts of various commodities across different exchanges in US.
!! Other Interesting Ideas
* Fractal Indicator derived from [[Chaos Theory]] applied to financial markets. [ext[The Fractal Indicator — Detecting Tops & Bottoms in Markets|https://medium.com/swlh/the-fractal-indicator-detecting-tops-bottoms-in-markets-1d8aac0269e8]] - usese [[Rescaled Range Analysis]] on highs and lows to create an indicator.
** If the indicator reaches `1.0` when the market is trending downwards/upwards - it demonstrates a structural break in the market
!!! Resources
* [ext[Market Sentiment|https://www.investopedia.com/terms/m/marketsentiment.asp]] on [[Investopedia]]
* [ext[Using Python to Download Sentiment Data for Financial Trading|https://medium.com/swlh/using-python-to-download-sentiment-data-for-financial-trading-1c44346926e2]] on [[Medium]]
!! [[Price Action]] Trading
* Taking trades based only on price movements
** Indicators - negative connotation
* Too many indicators on chart
** Decision making complex
** Stress Level is High
** [[Price Action]] cognitive stress is less
* Knowing why something happened is human behavior - you don't really need to know.
* Don't predict the markets
* Trendlines are discretionary - figure out what all actions are discretionary in your trading system
!! Rally Decline
* Rally - Higher Highs
* Decline - Lower Lows
!! [[Structural Pivots]]
* Identifying pivots on current day market movement
* ''Small Pivot'' - Meeting point of Rally/Decline
*
!! Trading Psychology
* ''Don't borrow someone's system, as you would be trading on borrowed conviction. Build your own system''
* If you are not able to stick to something for 6 months, then how can you accomplish anything
!! Secret of [[Trend Following]]
* ''Smaller [[Stoploss]]'' - highly important - win ratio is lower by Reward/risk is very high
* [[Moving Averages]] and [[Supertrend]] works well
!! [[Options Trading]]
* Options follow futures and not spot
!! [[VIX]]
* [[VIX]] is based on [[OTM]] premiums mostly
* VIX not necessarily indicates volatility
!! [[Backtesting]]
* In [[Backtesting]] don't go to 2008 time frame
* Even in trading, think long term -> not monthly weekly, but yearly or couple of years
A first-order Markov process is a [[stochastic process]] in which the future state solely depends on the current state only. The first-order Markov process is often simply called the Markov process. If it is in a discrete space, it is called the Markov chain
Markov Chains are a class of [[Probabilistic Graphical Models]] (PGM) that represent dynamic processes i.e., a process which is not static but rather changes with time. A Markov Chain assumes Markov property.
!! Markov Property
Markov property states that, a state at time $$t+1$$ is dependent only on the current state $$t$$ and is independent of all previous states from $$t-1, t-2, . . .$$. In short, ''to know a future state, we just need to know the current state''.
!! Three components of Markov Chain
# Set of states
# Vector of prior probabilities (probabilities of occurrence of each state)
# Matrix of transition probabilities. Transition from one state to another given a state. The sum of probabilities in a row should sum to 1.
!! [[Transition Matrix]]
This transition matrix is also called the Markov matrix. The element $$ij$$ is the probability of transiting from state $$j$$ to state $$i$$
!! Problems can a Markov Chain model answer
* Problem 1: What is the probability of a certain state sequence?
* Problem 2: What is the probability that the chain remains in a certain state for a period of time?
* Problem 3: What is the expected time that the chain will remain in a certain state?
!! Resources
* [ext[Gentle Introduction to Markov Chain|https://www.machinelearningplus.com/markov-chain/]] from machinelearningplus.com
* [ext[Hidden markov Model|https://jonathan-hui.medium.com/machine-learning-hidden-markov-model-hmm-31660d217a61]] on [[Medium]]
Markov Decision Process (MDP) is a framework that can solve most [[Reinforcement Learning]] problems with discrete actions. With the Markov Decision Process, an agent can arrive at an optimal policy (which we’ll discuss next week) for maximum rewards over time.
!! MDP vs [[Markov Chain]]
* [[Markov Chain]] work with a set of states $$ S$$, and [[Transition Probability]] $$P$$, from one state to other. It also uses
:<img src='https://miro.medium.com/proxy/1*BsOMhzsJGkcBUovaytomgA.jpeg' width=500>
* Markov Decision Process differs from the [[Markov Chain]] in that it brings actions into play. This means the next state is related not only to the current state itself but also to the actions taken in the current state
:<img src='https://miro.medium.com/max/700/1*OyNXKlBB9zThJo0AHtukuA.jpeg' width=500>
!!! Goal of MDP
* To train an agent to find a policy that will return the maximum cumulative rewards from taking a series of actions in one or more states
1st Order [[Markov Chain]] applied to Large Pivot movements and generating [[Transition Matrix]]
<img src='https://lh3.googleusercontent.com/eEaK5NLKgYhWuhP7UnHbGX78jT62-Tf97H96BVxR6bSRgCxstLbiLMAWtRiTF69r2K2T6c8ntxleqnH3IL3iwPLW6EpUqr1D7Tldfk1KfGPGOKyMPVYzHNkt407EQDY7HMLYqJkgJV-8PYRIR796xb3tVCM4PhLSVvVexj0NEUEJcjBWGYhRo9Gw_QlqUrfakSHBYpTY5CmdA0wKk-OGLNeulN0UcXi-kimK2-bDUX4k--pPe3UN6G6as0qoMhj1kgSsIqgRY7DoZrHIsQZb96pP2c8LcMsPJ5BkVOqB8ix5qw2Shm5412gXRdkSb02jgACzwNJ21d7XqhQAk1J3PB4U8dGrgSKG-wEmfiI6jwJlA22KUGnjlzckmL0xEOb059CLS_g4_mgEIHjxen_UzKk2aUCVEeVQqx3MIKxMBaFrAHQrKwAT1j5f7N85Mh_h05X6kGB1WzWO6v1c_VjCgtlWYrwEso_1HBk3bw4sQvaTZ3lnSxp-su4ZPEv7_wHq5FLTNfTNRhJ3RYYMN_SAHvvgu4EmvG4SHmDfc-qrTLoTyxS_Tg0SKx3LDKGSA3rPhmKk-Alg9Ttd0WvHUrx87E1bZv-Pjg8HOLT0lk7_RaVCNQZUNPQo266qL86BAo5Zy1_cf8_s5ddzoLA_KKytHE8BpOus0V64qh1i7KSHINwxVswFgcd5XVfsid74Jlg=w1776-h483-no?authuser=0' >
!! Basic Visualization
MATLAB like visualization capabilities for [[Python]]
```python
import matplotlib.pyplot as plt
data = dict([(x,np.random.randint(0,24)) for x in range(24)])
plt.plot(data.keys(),data.values())
plt.xticks(np.arange(0,24,6)) # changes x tick labels at increments of 6
plt.xlim(-3,26) # adds space around x axis
plt.ylim(-3,28) # adds space around y axis
plt.xlabel('Hour of the day')
plt.ylabel('Measurements Taken')
plt.title('Measurements By Hour')
plt.show()
```
!! Multiple lines with legends
```python
plt.plot(yearly_avg('Wind_Speed'),label='Wind Speed',color="#2BD31444")
plt.plot(yearly_avg('Wind_Gust'),'d-',label='Wind Gust',color="#2BD314FF")
plt.plot(yearly_avg('Dew_Point'),'d-',label='Dew Point',color="#142BD3FF")
plt.plot(yearly_avg('Barometric_Press'),label='Pressure',color="#142BD366")
plt.legend()
plt.show()
```
<img src='https://media3.giphy.com/media/kvYQSEwUPhtMCYS98k/giphy-downsized-large.gif'>
* Founder of [[Blackberry]]
* Avid reader - was awarded for reading every science book in the public library
,,[[Adam Grant: Think Again]] | [[13 November 2021]],,
One of [[Book]] by [[Psychologist]] [[Carol Dweck]]
<<tabs "[[Mindset - 01 - The Mindsets]] [[Mindset - 02 - Inside the Mindsets]] [[Mindset - 05 - Mindset and Leadership]]" "[[Mindset - 01 - The Mindsets]]" "$:/state/strollhometabs" "tc-vertical">>
!! Introduction
* ''The old issue'': whether human qualities are set in stone or can they be cultivated?
* ''The new issue'': What effect does the above statement have on you?
!! Why do People differ?
* Arguments are put forward for both ''physical'' (like bumps in brain, size and shape of skull & genes) and ''experiential'' (like people's backgrounds, experiences and training) - both are being believed till today
<<<
It's not always the people who start out the smartest but who end up smartest
<<< - [[Alfred Binet]]
!! The Two Mindsets
The view you adopt profoundly affects the way you lead your life
* ''Fixed Mindset'' - believing that your abilities are carved in stone. Creates an urgency to prove yourself over and over.
* ''Growth Mindset'' - belief that you can cultivate your qualities through effort, strategies & help from others
<<<
The passion for stretching yourself and sticking to it, even (or especially) when it's not going well, it is the hallmark of the growth mindset.This mindset allows people to thrive some of the most challenging times in their lives.
<<<
!! What's new?
Books like "Top secrets for most successful people" are a list of unconnected pointers & can inspire for a few days but the secrets are never clear. Understanding these two mindsets will give insight into your beliefs and how that leads to your behaviors.
!! Self Insight
* People are terrible at estimating their abilities.
* ''Fixed mindset'' people accounted for most inaccuracies
<<<
Exceptional individuals have a special talent for identifying their own strengths and weaknesses
<<< - Howard Gardner
!! Grow Your Mindset
* Think about someone you know with ''fixed Mindset'' and think about how they are always trying to prove themselves and how they are ''super-sensitive about being wrong and making mistakes''
* Think about someone skilled in ''growth mindset'' - think about how they confront obstacles and things they do to stretch themselves
Change your mindset from ''fixed to growth''.
<<<
It's okay to be a novice to grow.
<<< - Sumit Kant
,,[[Mindset]],,
! Two meanings to ability
* Trying to understand why some students were so caught up proving their ability, while others just let go and learn.
* ''fixed ability'' that needs to be proven vs ''changeable ability'' that can be developed through training
<<<
"I don't divide the world into weak/strong or success/failure. ''I divide the world into learners and non-learners''
<<< - Benjamin Barber, eminent political theorist
!!! Four year olds were given puzzles
* Once they finished they could choose to play again or try a harder puzzle - ''the children with [[Fixed Mindet]] stuck with the safe one while the ones with [[Growth Mindset]] choose harder puzzles.''
!!! Passing an opportunity
* At University of Hong-Kong, studies are in English. Chinese students not fluent in English were asked for an option to take English course if offered. ''Students with a [[Growth Mindset]] said empathic yes while the ones with fixed mindset were not that interested''
!!! Brain wave stories while receiving feedback
* Students with [[Fixed Mindset]] were not interested in learning the right answer while the ones with [[Growth Mindset]] were interested to what would strech their abilities
!!! Choosing partners
* People with [[Fixed Mindset]] said that their ideal mate would be the one that will enshrine their abilities while people with [[Growth Mindset]] said they don't want partners that would pick on them but want people who would foster their development
!!! [[CEO Disease]]
* Fixed mindsetters chose short-term strategies while [[Growth Mindset]] CEOs chose long term strategies
!!! Streching
* people with [[Growth Mindset]] don't just seek challenge, they thrive on it
<<<
When you're lying on your deathbed, one of the the cool things to say is , 'I really explored myself'. If you only go through life doing stuff that's easy, shame on you.
<<<
!!! Thriving
* People with fixed mindset thrive when things are safely within their grasp. If things get too challenging they lose interest. In contrast, students with [[Growth Mindset]] continue to show high level of interest even if the work is very challenging.
!!! Feeling smart
* Fixed mindset people feel smart when they are flawless right away. When some thing is easy for them to do, but other people can't do it.
!!! Need for learning
* People with [[Fixed Mindet]] expect any ability to show up on its own, before any learning takes place.
<<<
''Becoming is better than being''
<<< - 1960's saying
:The fixed mindset does not allow the luxury of becoming. They have to already be
!!! Test Score
* Fixed mindset people let them measure themselves on one test forever. While the people with growth mindset understand the test is crucial, but they do not let it define how smart they are.
<<<
You cannot determine the slope of a line with one data point, as there is not line to begin with. Single point does not showcase trend, improvements and ability
<<<
!!! Potential & its judgement
* Potential is someones capacity to develop an ability with effort and coaching over time
* [[Growth Mindset]] people thinks that it takes time for potential to flower
* NASA rejects application for astronauts with pure histories of successes, instead selected people who had significant failures and bounced back from them
!!! Proving you're special
* People with fixed mindset opt for success over growth. They are trying to be special, even //superior//.
! Meaning of failure
* Failure has been transformed from an action (I failed) to an identity (I am a failure). This is true for fixed mindset but for [[Growth Mindset]],people say failure can be a painful experience. But it doesn't define you. It's a problem to be faced, dealt with, and learned from
!!! Responding to an academic failure
* Those with fixed mindset said, they would study less for the next exam while those with growth mindset said that they would study harder
* People with fixed mindset may simply try to repair their self-esteem instead of learning from and repairing their failures
* Growth mindset people looked at the tests of people who had done far better than they had and wanted to correct their deficiency, but ''students with fixed mindset looked at the tests of the people who had done really poorly''
!!! Coping with depression
* Fixed mindset people have higher levels of depression, because they ruminate over their problems and setbacks. While the more Growth mindset people felt depressed, they took more actions, more they kept up with their lives.
<<<
In society we value natural, effortless accomplishment over achievement through effort.
<<< - Malcolm Gladwell
!!! The Big Risk
* ''The idea of trying and still failing - of leaving yourself without excuses - is the worst fear within the fixed mindset''
* //Why is the effort so terrifying?// - For fixed mindset people
** It robs them of their excuses
** great geniuses are not supposed to need it
!! Q & A
//1. Why are fixed mindset people proving themselves again and again?//
* Fixed mindset people are amassing countless affirmations and not ending up where they want to be.
//2. Are mindsets permanent part of makeup or can you change them?//
* just by being aware of these two mindsets, you can start to think & react differently
//3. Can I have both mindsets?//
* Yes, people can have different mindsets in different areas. Whatever mindset an individual has in a particular area will guide them in that area
//4. When people fail despite their effort, is it always their fault?//
* No. But effort is necessary but not sufficient condition. Effort is crucial and so is resources and opportunities. All effort is not created equal
//5. Isn't growth mindset about personal development and not besting others?//
* The success stories for growth mindset just show their far reaching potential
* The growth mindset allows people to ''value what they are doing regardless of the outcome''
//6. Lot of workaholics have fixed mindsets. How does this fit with the idea that fixed mindset people favor low effort and easy tasks?//
* These people might be free of the belief that high effort equals low ability, but they have other parts of the fixed mindset
* They may constantly put their talent on display - Me
* They may be intolerant of their mistakes and setbacks - Also Me
//7. Why should I give up fixed mindset, given i know what my abilities are and where I stand//
* Beware of the drawbacks of this mindset
** you may be robbing yourself of an opportunity by underestimating you talent in the first area.
** you may be undermining your chances of success in the second area assuming that talent alone can take you there
//8. Should people try to change everything they can?//
* Growth mindset does not tell you how much change is possible
* We all need to accept some of our imperfections, especially the ones that don't really harm our lives or the lives of others.
//9. Are people with fixed mindset simply lacking in confidence?//
* Fixed mindset people have ''just as much confidence as growth mindset people''
* Fixed mindset people have to nurse and protect their confidence. That's what excuses are for.
,,[[Mindset]] | [[27 June 2020]] | [[12 July 2020]],,
* [[Groupthink]]
* Praise in workplace
** Current generating habitual of praise. Instead of employee of the month, it’s the employee of the day
** Instead of just giving employees an award for the smartest idea or praise for a brilliant performance, they would get ''praise for taking initiative, for seeing a difficult task through, for struggling and learning something new'', for being undaunted by a setback, or for being open to and acting on criticism
* Negotiations
** Almost half (47 percent) of the people who were taught the fixed mindset about negotiation skills chose the task that simply showed off their skills, but only 12 percent of those who were taught the growth mindset cared to pursue this showoffy task
* Innovations
** not only do those with a growth mindset gain more lucrative outcomes for themselves, but, more important, they also come up with more creative solutions that confer benefits all around
* Corporate Training
** corporate training often fails, because, many managers do not believe in personal change.
* Managers
** Managers with a growth mindset think it’s nice to have talent, but that’s just the starting point. These managers are more committed to their employees’ development, and to their own. They give a great deal more developmental coaching, they notice improvement in employees’ performance, and they welcome critiques from their employees.
** ''most managers and even CEOs become bosses, not leaders''
** most people, when they first become managers, enter a period of great learning
!!! Can an organization as a whole have a mindset?
* An organization might embody a fixed mindset, conveying that employees either “have it” or they don’t: We called this a “''culture of genius''.”
* might embody more of a growth mindset, conveying that people can grow and improve with effort, good strategies, and good mentoring: We call this a “''culture of development.''”
* People who work in growth-mindset organizations have far more trust in their company and a much greater sense of empowerment, ownership, and commitment.
* Fixed-mindset companies, however, expressed greater interest in leaving their company for another
* It's actually the employees in the growth-mindset companies who say that their organization supports (reasonable) risk-taking, innovation, and creativity
* When organizations put the premium on natural talent, then everyone wants to be the superstar, everyone wants to shine brighter than the others, and people may be more likely to cheat or cut corners to do so.
* Supervisors in growth-mindset companies saw their team members as having far greater management potential than did supervisors in fixed-mindset companies
* Are there ways you could be less defensive about your mistakes? Could you profit more from the feedback you get? Are there ways you can create more learning experiences for yourself?
*Do you ever try to hold back high-performing employees because they threaten you?
* Couples may erroneously believe they agree on each person’s rights and duties. Fill in the blank: “As a husband, I have a right to..., and my wife has the duty to ......” “As a wife, I have a right to ....., and my husband has the duty to ......”
* When people had the fixed mindset, they felt judged and labeled by the rejection. Permanently labeled. It was as though a verdict had been handed down and branded on their foreheads: unlovable!
* people with the fixed mindset, their number one goal came through loud and clear. Revenge
<<<
Tout comprendre c’est tout pardonner.” To understand all is to forgive all
<<< French expression
* it will come as no surprise that kids with the fixed mindset are the ones who react to taunting and bullying with thoughts of violent retaliation
* You can believe that your qualities are fixed, your partner’s qualities are fixed, and the relationship’s qualities are fixed—that it’s inherently good or bad, meant-to-be or not meant-to-be
* having a fixed mindset has meant believing your personal traits are fixed. But in relationships, two more things enter the picture—your partner and the relationship itself
** One problem is that people with the fixed mindset expect everything good to happen automatically
** growth mindset, there may still be that exciting initial combustion, but people in this mindset don’t expect magic. They believe that a good, lasting relationship comes from effort and from working through inevitable differences
* Aaron Beck, the renowned psychiatrist, says that one of the most destructive beliefs for a relationship is “If we need to work at it, there’s something seriously wrong with our relationship
** Mind reading instead of communicating inevitably backfires. If you do, then you don’t need communication; you can just assume your partner sees things the way you do.
** A no-effort relationship is a doomed relationship, not a great relationship. It takes work to communicate accurately and it takes work to expose and resolve conflicting hopes and beliefs. It doesn’t mean there is no “they lived happily ever after,” but it’s more like “they worked happily ever after.”
* When people with a fixed mindset talk about their conflicts, they assign blame. Sometimes they blame themselves, but often they blame their partner. And they assign blame to a trait—a character flaw.
* problem of communication, not a problem of personality or character. Yet in the fixed mindset, the blame came fast and furious
* couples in counseling never to think these fixed-mindset thoughts: My partner is incapable of change. Nothing can improve our relationship. These ideas, he says, are almost always wrong.
** The belief that partners have the potential for change should not be confused with the belief that the partner will change.
** The partner has to want to change, commit to change, and take concrete actions toward change.
''no-responsibility and high-denial space''.
* With the fixed mindset, one moment your partner is the light of your life, the next they’re your adversary. Why would people want to transform the loved one into an enemy?
** I invented a third party, an imaginary man named Maurice. Whenever I start in on who’s to blame, we invoke poor Maurice and pin it on him.
** Part of it is that they feel branded by a rejection or breakup. But another part is that if they forgive the partner, if they see him or her as a decent person, then they have to shoulder more of the blame themselves: If my partner’s a good guy, then I must be a bad guy
** In the fixed mindset, I had needed my blame and bitterness. It made me feel more righteous, powerful, and whole than thinking I was at fault. The growth mindset allowed me to give up the blame and move on. The growth mindset gave me a mother.
** Blame may make you feel less foolish, but you still have a shoe full of ice cream—and a friend who’s on the defensive.
** the fixed mindset, where you’ve got to keep proving your competence, it’s easy to get into a competition with your partner. Who’s the smarter, more talented, more likable one?
* Cynthia left her partners no room for their own identity; she needed to equal or surpass them in every skill they arrived with. ''There are many good ways to support our partners or show interest in their lives. This is not one of them.''
** I mean helping partners, within the relationship, to reach their own goals and fulfill their own potential. This is the growth mindset in action.
!!! Friends
* Friends can give each other the wisdom and courage to make growth-enhancing decisions, and friends can reassure each other of their fine qualities
* adolescent boys’ self-esteem and then asked them how much they believed in negative stereotypes about girls
** Boys who believed in the fixed mindset showed a boost in self-esteem when they endorsed the stereotypes
** Boys with the growth mindset were less likely to agree with the stereotypes, but even when they did, it did not give them an ego boost
The lower you are, the better I feel is the idea.
* They can be brilliant, charming, and fun, but after being with them, you feel diminished. You may ask: “Am I just doing a number on myself?” But it is often them, trying to build themselves up by establishing their superiority and your inferiority. Either way, you are a vehicle for (and a casualty of) confirming their worth.
* I’m afraid that in the fixed mindset, I was also a culprit. I don’t think I put people down, but when you need validation, you use people for it.
Conventional wisdom says that you know who your friends are in your times of need. And of course this view has merit. Who will stand by you day after day when you’re in trouble? However, sometimes an even tougher question is: Who can you turn to when good things happen? When you find a wonderful partner. When you get a great job offer or promotion. When your child does well. Who would be glad to hear it?
11 October 2020
6. Relationships: Mindsets in Love (or not)
We’ve been examining people who use others to buoy themselves up. Shy people worry that others will bring them down. They often worry about being judged or embarrassed in social situations.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Beer found, first, that people with the fixed mindset were more likely to be shy. This makes sense. The fixed mindset makes you concerned about judgment, and this can make you more self-conscious and anxious.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Shyness harmed the social interactions of people with the fixed mindset but did not harm the social relations of people with the growth mindset
11 October 2020
6. Relationships: Mindsets in Love (or not)
For one thing, the shy growth-minded people looked on social situations as challenges
11 October 2020
6. Relationships: Mindsets in Love (or not)
The shy fixed people, instead, wanted to avoid meeting someone who might be more socially skilled than they were. They said they were more worried about making mistakes.
11 October 2020
6. Relationships: Mindsets in Love (or not)
fixed-mindset people, the shyness takes control. It keeps them out of social situations with new people, and when they’re in them, they can’t let down their guard and let go of their fears
11 October 2020
6. Relationships: Mindsets in Love (or not)
George, what were you doing? He was trying to protect himself from rejection—by trying not to seem too interested.
11 October 2020
6. Relationships: Mindsets in Love (or not)
In this case, it may be the victims, not the bullies, who are considered to be the problem kids or the misfits.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Bullying is about judging. It’s about establishing who is more worthy or important
11 October 2020
6. Relationships: Mindsets in Love (or not)
The more powerful kids judge the less powerful kids. They judge them to be less valuable human beings
11 October 2020
6. Relationships: Mindsets in Love (or not)
they get a boost in self-esteem
11 October 2020
6. Relationships: Mindsets in Love (or not)
There’s a big dose of fixed-mindset thinking in the bullies: Some people are superior and some are inferior. And the bullies are the judges.
11 October 2020
6. Relationships: Mindsets in Love (or not)
When people feel deeply judged by a rejection, their impulse is to feel bad about themselves and to lash out in bitterness
11 October 2020
6. Relationships: Mindsets in Love (or not)
But it’s startling how quickly average, everyday kids with a fixed mindset think about violent revenge
11 October 2020
6. Relationships: Mindsets in Love (or not)
First, the students with the fixed mindset took the incident more personally. They said, “I would think I was a nobody and that nobody likes me.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Then they wanted violent revenge, saying that they’d explode with rage at them, punch their faces in, or run them over. They strongly agreed with the statement: “My number one goal would be to get revenge.”
11 October 2020
6. Relationships: Mindsets in Love (or not)
the students with the growth mindset were not as prone to see the bullying as a reflection of who they were. Instead, they saw it as a psychological problem of the bullies, a way for the bullies to gain status or charge their self-esteem:
12 October 2020
6. Relationships: Mindsets in Love (or not)
Even if a victim doesn’t have a fixed mindset to begin with, prolonged bullying can instill it. Especially if others stand by and do nothing, or even join in
12 October 2020
6. Relationships: Mindsets in Love (or not)
First, while enforcing consistent discipline, he doesn’t judge the bully as a person. No criticism is directed at traits. Instead, he makes them feel liked and welcome at school every day
12 October 2020
6. Relationships: Mindsets in Love (or not)
he does not praise the person; he praises their effort. “I notice that you have been staying out of fights. That tells me you are working on getting along with people.”
12 October 2020
6. Relationships: Mindsets in Love (or not)
After a rejection, do you feel judged, bitter, and vengeful? Or do you feel hurt, but hopeful of forgiving, learning, and moving on?
12 October 2020
6. Relationships: Mindsets in Love (or not)
What did you learn from it? Did it teach you something about what you want and don’t want in your life? Did it teach you some positive things that were useful in later relationships? Can you forgive that person and wish them well? Can you let go of the bitterness?
12 October 2020
6. Relationships: Mindsets in Love (or not)
Move beyond thinking about fault and blame all the time. Think of me trying to do that too.
12 October 2020
6. Relationships: Mindsets in Love (or not)
Are you shy? Then you really need the growth mindset.
12 October 2020
6. Relationships: Mindsets in Love (or not)
skills are things you can improve and how social interactions are for learning and enjoyment, not judgment. Keep practicing this.
,,[[Mindset]],,
7 October 2020
5. Business: Mindset and Leadership
early 1970s, Irving Janis popularized the term groupthink. It’s when everyone in a group starts thinking alike. No one disagrees. No one takes a critical stance. It can lead to catastrophic decisions
30 September 2020
5. Business: Mindset and Leadership
it often can come right out of a fixed mindset.
7 October 2020
5. Business: Mindset and Leadership
Persians used a version of Sloan’s techniques to prevent groupthink. Whenever a group reached a decision while sober, they later reconsidered it while intoxicated.
7 October 2020
5. Business: Mindset and Leadership
As Robert Wood showed in his study, a growth mindset—by relieving people of the illusions or the burdens of fixed ability—leads to a full and open discussion of the information and to enhanced decision making.
7 October 2020
5. Business: Mindset and Leadership
Instead of employee of the month, it’s the employee of the day. Companies are calling in consultants to teach them how best to lavish rewards on this overpraised generation.
7 October 2020
5. Business: Mindset and Leadership
What would this feedback look or sound like in the workplace? Instead of just giving employees an award for the smartest idea or praise for a brilliant performance, they would get praise for taking initiative, for seeing a difficult task through, for struggling and learning something new, for being undaunted by a setback, or for being open to and acting on criticism
7 October 2020
5. Business: Mindset and Leadership
mindsets have an important impact on negotiation success.
7 October 2020
5. Business: Mindset and Leadership
Almost half (47 percent) of the people who were taught the fixed mindset about negotiation skills chose the task that simply showed off their skills, but only 12 percent of those who were taught the growth mindset cared to pursue this showoffy task
7 October 2020
5. Business: Mindset and Leadership
So, not only do those with a growth mindset gain more lucrative outcomes for themselves, but, more important, they also come up with more creative solutions that confer benefits all around.
7 October 2020
5. Business: Mindset and Leadership
Research sheds light on why corporate training often fails.
7 October 2020
5. Business: Mindset and Leadership
Studies by Peter Heslin, Don VandeWalle, and Gary Latham show that many managers do not believe in personal change
7 October 2020
5. Business: Mindset and Leadership
Managers with a growth mindset think it’s nice to have talent, but that’s just the starting point. These managers are more committed to their employees’ development, and to their own. They give a great deal more developmental coaching, they notice improvement in employees’ performance, and they welcome critiques from their employees.
7 October 2020
5. Business: Mindset and Leadership
Sadly, most managers and even CEOs become bosses, not leaders. They wield power instead of transforming themselves, their workers, and their organization.
7 October 2020
5. Business: Mindset and Leadership
most people, when they first become managers, enter a period of great learning.
7 October 2020
5. Business: Mindset and Leadership
Clearly the leader of an organization can hold a fixed or growth mindset, but can an organization as a whole have a mindset? Can it have a pervasive
9 October 2020
5. Business: Mindset and Leadership
An organization might embody a fixed mindset, conveying that employees either “have it” or they don’t: We called this a “culture of genius.”
9 October 2020
5. Business: Mindset and Leadership
Or it might embody more of a growth mindset, conveying that people can grow and improve with effort, good strategies, and good mentoring: We call this a “culture of development.”
9 October 2020
5. Business: Mindset and Leadership
People who work in growth-mindset organizations have far more trust in their company and a much greater sense of empowerment, ownership, and commitment
9 October 2020
5. Business: Mindset and Leadership
Those who worked in fixed-mindset companies, however, expressed greater interest in leaving their company for another.
9 October 2020
5. Business: Mindset and Leadership
It’s actually the employees in the growth-mindset companies who say that their organization supports (reasonable) risk-taking, innovation, and creativity
11 October 2020
5. Business: Mindset and Leadership
When organizations put the premium on natural talent, then everyone wants to be the superstar, everyone wants to shine brighter than the others, and people may be more likely to cheat or cut corners to do so.
11 October 2020
5. Business: Mindset and Leadership
Supervisors in growth-mindset companies saw their team members as having far greater management potential than did supervisors in fixed-mindset companies
11 October 2020
5. Business: Mindset and Leadership
Are there ways you could be less defensive about your mistakes? Could you profit more from the feedback you get? Are there ways you can create more learning experiences for yourself?
11 October 2020
5. Business: Mindset and Leadership
Do you ever try to hold back high-performing employees because they threaten you?
11 October 2020
5. Business: Mindset and Leadership
Read Gerst ner’s excellent book Who Says Elephants Can’t Dance? to see how it’s done.
11 October 2020
5. Business: Mindset and Leadership
Remember, people can be independent thinkers and team players at the same time.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Couples may erroneously believe they agree on each person’s rights and duties. Fill in the blank: “As a husband, I have a right to ______, and my wife has the duty to ______.” “As a wife, I have a right to ______, and my husband has the duty to ______.”
11 October 2020
6. Relationships: Mindsets in Love (or not)
When people had the fixed mindset, they felt judged and labeled by the rejection. Permanently labeled. It was as though a verdict had been handed down and branded on their foreheads: unlovable!
11 October 2020
6. Relationships: Mindsets in Love (or not)
people with the fixed mindset, their number one goal came through loud and clear. Revenge
11 October 2020
6. Relationships: Mindsets in Love (or not)
French expression: “Tout comprendre c’est tout pardonner.” To understand all is to forgive all
11 October 2020
6. Relationships: Mindsets in Love (or not)
I’ll be damned if I’m going to sit here and feel sorry for myself!” (Perhaps this phrase should be the mantra of the growth mindset.)
11 October 2020
6. Relationships: Mindsets in Love (or not)
it will come as no surprise that kids with the fixed mindset are the ones who react to taunting and bullying with thoughts of violent retaliation. I’ll return to this later.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Daniel Goleman’s Emotional Intelligence
11 October 2020
6. Relationships: Mindsets in Love (or not)
Meaning that as a society, we don’t understand relationship skills
11 October 2020
6. Relationships: Mindsets in Love (or not)
You can believe that your qualities are fixed, your partner’s qualities are fixed, and the relationship’s qualities are fixed—that it’s inherently good or bad, meant-to-be or not meant-to-be
11 October 2020
6. Relationships: Mindsets in Love (or not)
So far, having a fixed mindset has meant believing your personal traits are fixed. But in relationships, two more things enter the picture—your partner and the relationship itself.
11 October 2020
6. Relationships: Mindsets in Love (or not)
One problem is that people with the fixed mindset expect everything good to happen automatically
11 October 2020
6. Relationships: Mindsets in Love (or not)
growth mindset, there may still be that exciting initial combustion, but people in this mindset don’t expect magic. They believe that a good, lasting relationship comes from effort and from working through inevitable differences.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Aaron Beck, the renowned psychiatrist, says that one of the most destructive beliefs for a relationship is “If we need to work at it, there’s something seriously wrong with our relationship
11 October 2020
6. Relationships: Mindsets in Love (or not)
Mind reading instead of communicating inevitably backfires.
11 October 2020
6. Relationships: Mindsets in Love (or not)
fixed mindset believe that a couple should share all of each other’s views.
11 October 2020
6. Relationships: Mindsets in Love (or not)
If you do, then you don’t need communication; you can just assume your partner sees things the way you do.
11 October 2020
6. Relationships: Mindsets in Love (or not)
A no-effort relationship is a doomed relationship, not a great relationship. It takes work to communicate accurately and it takes work to expose and resolve conflicting hopes and beliefs. It doesn’t mean there is no “they lived happily ever after,” but it’s more like “they worked happily ever after.”
11 October 2020
6. Relationships: Mindsets in Love (or not)
When people with a fixed mindset talk about their conflicts, they assign blame. Sometimes they blame themselves, but often they blame their partner. And they assign blame to a trait—a character flaw.
11 October 2020
6. Relationships: Mindsets in Love (or not)
problem of communication, not a problem of personality or character. Yet in the fixed mindset, the blame came fast and furious
11 October 2020
6. Relationships: Mindsets in Love (or not)
What is the mature thing to do?” He answered his own question by starting to clean things up
11 October 2020
6. Relationships: Mindsets in Love (or not)
couples in counseling never to think these fixed-mindset thoughts: My partner is incapable of change. Nothing can improve our relationship. These ideas, he says, are almost always wrong.
11 October 2020
6. Relationships: Mindsets in Love (or not)
The belief that partners have the potential for change should not be confused with the belief that the partner will change.
11 October 2020
6. Relationships: Mindsets in Love (or not)
The partner has to want to change, commit to change, and take concrete actions toward change.
11 October 2020
6. Relationships: Mindsets in Love (or not)
He was in that no-responsibility and high-denial space.
11 October 2020
6. Relationships: Mindsets in Love (or not)
With the fixed mindset, one moment your partner is the light of your life, the next they’re your adversary. Why would people want to transform the loved one into an enemy?
11 October 2020
6. Relationships: Mindsets in Love (or not)
I invented a third party, an imaginary man named Maurice. Whenever I start in on who’s to blame, we invoke poor Maurice and pin it on him.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Part of it is that they feel branded by a rejection or breakup. But another part is that if they forgive the partner, if they see him or her as a decent person, then they have to shoulder more of the blame themselves: If my partner’s a good guy, then I must be a bad guy
11 October 2020
6. Relationships: Mindsets in Love (or not)
In the fixed mindset, I had needed my blame and bitterness. It made me feel more righteous, powerful, and whole than thinking I was at fault. The growth mindset allowed me to give up the blame and move on. The growth mindset gave me a mother.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Blame may make you feel less foolish, but you still have a shoe full of ice cream—and a friend who’s on the defensive.
11 October 2020
6. Relationships: Mindsets in Love (or not)
the fixed mindset, where you’ve got to keep proving your competence, it’s easy to get into a competition with your partner. Who’s the smarter, more talented, more likable one?
11 October 2020
6. Relationships: Mindsets in Love (or not)
Cynthia left her partners no room for their own identity; she needed to equal or surpass them in every skill they arrived with.
11 October 2020
6. Relationships: Mindsets in Love (or not)
There are many good ways to support our partners or show interest in their lives. This is not one of them.
11 October 2020
6. Relationships: Mindsets in Love (or not)
I mean helping partners, within the relationship, to reach their own goals and fulfill their own potential. This is the growth mindset in action.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Friends can give each other the wisdom and courage to make growth-enhancing decisions, and friends can reassure each other of their fine qualities
11 October 2020
6. Relationships: Mindsets in Love (or not)
adolescent boys’ self-esteem and then asked them how much they believed in negative stereotypes about girls
11 October 2020
6. Relationships: Mindsets in Love (or not)
Boys who believed in the fixed mindset showed a boost in self-esteem when they endorsed the stereotypes
11 October 2020
6. Relationships: Mindsets in Love (or not)
Boys with the growth mindset were less likely to agree with the stereotypes, but even when they did, it did not give them an ego boost
11 October 2020
6. Relationships: Mindsets in Love (or not)
The lower you are, the better I feel is the idea.
11 October 2020
6. Relationships: Mindsets in Love (or not)
They can be brilliant, charming, and fun, but after being with them, you feel diminished. You may ask: “Am I just doing a number on myself?” But it is often them, trying to build themselves up by establishing their superiority and your inferiority.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Either way, you are a vehicle for (and a casualty of) confirming their worth.
11 October 2020
6. Relationships: Mindsets in Love (or not)
I’m afraid that in the fixed mindset, I was also a culprit. I don’t think I put people down, but when you need validation, you use people for it.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Conventional wisdom says that you know who your friends are in your times of need. And of course this view has merit. Who will stand by you day after day when you’re in trouble? However, sometimes an even tougher question is: Who can you turn to when good things happen? When you find a wonderful partner. When you get a great job offer or promotion. When your child does well. Who would be glad to hear it?
11 October 2020
6. Relationships: Mindsets in Love (or not)
We’ve been examining people who use others to buoy themselves up. Shy people worry that others will bring them down. They often worry about being judged or embarrassed in social situations.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Beer found, first, that people with the fixed mindset were more likely to be shy. This makes sense. The fixed mindset makes you concerned about judgment, and this can make you more self-conscious and anxious.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Shyness harmed the social interactions of people with the fixed mindset but did not harm the social relations of people with the growth mindset
11 October 2020
6. Relationships: Mindsets in Love (or not)
For one thing, the shy growth-minded people looked on social situations as challenges
11 October 2020
6. Relationships: Mindsets in Love (or not)
The shy fixed people, instead, wanted to avoid meeting someone who might be more socially skilled than they were. They said they were more worried about making mistakes.
11 October 2020
6. Relationships: Mindsets in Love (or not)
fixed-mindset people, the shyness takes control. It keeps them out of social situations with new people, and when they’re in them, they can’t let down their guard and let go of their fears
11 October 2020
6. Relationships: Mindsets in Love (or not)
George, what were you doing? He was trying to protect himself from rejection—by trying not to seem too interested.
11 October 2020
6. Relationships: Mindsets in Love (or not)
In this case, it may be the victims, not the bullies, who are considered to be the problem kids or the misfits.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Bullying is about judging. It’s about establishing who is more worthy or important
11 October 2020
6. Relationships: Mindsets in Love (or not)
The more powerful kids judge the less powerful kids. They judge them to be less valuable human beings
11 October 2020
6. Relationships: Mindsets in Love (or not)
they get a boost in self-esteem
11 October 2020
6. Relationships: Mindsets in Love (or not)
There’s a big dose of fixed-mindset thinking in the bullies: Some people are superior and some are inferior. And the bullies are the judges.
11 October 2020
6. Relationships: Mindsets in Love (or not)
When people feel deeply judged by a rejection, their impulse is to feel bad about themselves and to lash out in bitterness
11 October 2020
6. Relationships: Mindsets in Love (or not)
But it’s startling how quickly average, everyday kids with a fixed mindset think about violent revenge
11 October 2020
6. Relationships: Mindsets in Love (or not)
First, the students with the fixed mindset took the incident more personally. They said, “I would think I was a nobody and that nobody likes me.
11 October 2020
6. Relationships: Mindsets in Love (or not)
Then they wanted violent revenge, saying that they’d explode with rage at them, punch their faces in, or run them over. They strongly agreed with the statement: “My number one goal would be to get revenge.”
11 October 2020
6. Relationships: Mindsets in Love (or not)
the students with the growth mindset were not as prone to see the bullying as a reflection of who they were. Instead, they saw it as a psychological problem of the bullies, a way for the bullies to gain status or charge their self-esteem:
12 October 2020
6. Relationships: Mindsets in Love (or not)
Even if a victim doesn’t have a fixed mindset to begin with, prolonged bullying can instill it. Especially if others stand by and do nothing, or even join in
12 October 2020
6. Relationships: Mindsets in Love (or not)
First, while enforcing consistent discipline, he doesn’t judge the bully as a person. No criticism is directed at traits. Instead, he makes them feel liked and welcome at school every day
12 October 2020
6. Relationships: Mindsets in Love (or not)
he does not praise the person; he praises their effort. “I notice that you have been staying out of fights. That tells me you are working on getting along with people.”
12 October 2020
6. Relationships: Mindsets in Love (or not)
After a rejection, do you feel judged, bitter, and vengeful? Or do you feel hurt, but hopeful of forgiving, learning, and moving on?
12 October 2020
6. Relationships: Mindsets in Love (or not)
What did you learn from it? Did it teach you something about what you want and don’t want in your life? Did it teach you some positive things that were useful in later relationships? Can you forgive that person and wish them well? Can you let go of the bitterness?
12 October 2020
6. Relationships: Mindsets in Love (or not)
Move beyond thinking about fault and blame all the time. Think of me trying to do that too.
12 October 2020
6. Relationships: Mindsets in Love (or not)
Are you shy? Then you really need the growth mindset.
12 October 2020
6. Relationships: Mindsets in Love (or not)
skills are things you can improve and how social interactions are for learning and enjoyment, not judgment. Keep practicing this.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Look at that drawing. Martha, is he the next Picasso or what?” “You’re so brilliant, you got an A without even studying!” If you’re like most parents, you hear these as supportive, esteem-boosting messages. But listen more closely. See if you can hear another message. It’s the one that children hear: If I don’t learn something quickly, I’m not smart. I shouldn’t try drawing anything hard or they’ll see I’m no Picasso. I’d better quit studying or they won’t think I’m brilliant
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
It must be a terrible thing to feel that everyone is evaluating you and you can’t show what you know. We want you to know that we are not evaluating you. We care about your learning, and we know that you’ve learned your stuff. We’re proud that you’ve stuck to it and kept learning.” Messages
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
And remember, we don’t have to always be praising. Inquiring about the child’s process and just showing interest in it goes a very long way. Misunderstanding
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
No parent thinks, “I wonder what I can do today to undermine my children, subvert their effort, turn them off learning, and limit their achievement.” Of course not. They think, “I would do anything, give anything, to make my children successful.” Yet many of the things they do boomerang
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Praising children’s intelligence harms their motivation and it harms their performance.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Yes, children love praise. And they especially love to be praised for their intelligence and talent. It really does give them a boost, a special glow—but only for the moment. The minute they hit a snag, their confidence goes out the window and their motivation hits rock bottom. If success means they’re smart, then failure means they’re dumb.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
He projects an over-inflated view of his abilities and claims he can perform better than others
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
I could not accomplish something right away, to avoid that task or treat it with contempt
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
what’s the alternative to praising talent or intelligence?
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Rather than praising her intelligence or her grade, I asked questions that made her reflect on the effort she put into studying and on how she has improved from the year before
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Praise should deal, not with the child’s personality attributes, but with his efforts and achievements.”
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
We are telling them that what we prize are speed and perfection. Speed and perfection are the enemy of difficult learning: “If you think I’m smart when I’m fast and perfect, I’d better not take on anything challenging.”
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
“Whoops. I guess that was too easy. I apologize for wasting your time. Let’s do something you can really learn from!”
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
How do you make a child feel secure before a test or performance? The same principle applies. Reassuring children about their intelligence or talent backfires. They’ll only be more afraid to show a deficiency.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
There is a strong message in our society about how to boost children’s self-esteem, and a main part of that message is: Protect them from failure! While this may help with the immediate problem of a child’s disappointment, it can be harmful in the long run. Why?
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
she was robbed) places blame on others
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
devalue something if she doesn’t do well
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
The fourth (she has the ability) may be the most dangerous message of all. Does
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
she didn’t deserve to win) seems hardhearted under the circumstances
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
what her growth-minded father
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
told her.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Constructive means helping the child to fix something, build a better product, or do a better job
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Gee, I’m so clumsy. FATHER: That’s not what we say when nails spill. PHILIP: What do you say? FATHER: You say, the nails spilled—I’ll pick them up! PHILIP: Just like that? FATHER: Just like that. PHILIP: Thanks, Dad.
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Kids with the fixed mindset tell us they get constant messages of judgment from their parents
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
growth mindset think. They think their parents are just trying to encourage learning and good study habits
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
kids with the fixed mindset felt judged, but the kids with the growth mindset felt helped.
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
All kids misbehave. Research shows that normal young children misbehave every three minutes. Does it become an occasion for judgment of their character or an occasion for teaching
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
downgrading himself for his errors and having no good plan for fixing them
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Another way we know that children learn these messages is that we can see how they pass them on.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Abusive parents often don’t understand that children’s crying is a signal of their needs, or that babies can’t stop crying on command. Instead, they judge the child as disobedient, willful, or bad for crying.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
They are teaching their children that if they go against the parents’ rules or values, they’ll be judged and punished. They’re not teaching their children how to think through the issues and come to ethical, mature decisions on their own.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
It’s not that growth-minded parents indulge and coddle their children. Not at all. They set high standards, but they teach the children how to reach them
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
It’s a real tragedy to take a brilliant and wonderful kid like Sandy and crush her with the weight of these labels.
12 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
It’s not just I’m judging you. It’s I’m judging you and I’ll only love you if you succeed—on my terms.
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
McEnroe brought his father the success he craved, but McEnroe didn’t enjoy a moment of it. He says he enjoyed the consequences of his success
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Tiger Woods’s father presents a contrast
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Tiger says in return, “My parents have been the biggest influence in my life. They taught me to give of myself, my time, talent, and, most of all, my love.”
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Isn’t it natural for parents to set goals and have ideals for their children? Yes, but some ideals are helpful and others are not
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
ideals disrupted their thinking, made them procrastinate, made them give up, and made them stressed-out. They were demoralized by the ideal they could never hope to be.
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Students with the growth mindset described ideals
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
A successful student is one whose primary goal is to expand their knowledge and their ways of thinking and investigating the world
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Many educators think that lowering their standards will give students success experiences, boost their self-esteem, and raise their achievement
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Well, it doesn’t work. Lowering standards just leads to poorly educated students who feel entitled to easy work and lavish praise
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
On the other hand, simply raising standards in our schools, without giving students the means of reaching them, is a recipe for disaster. It just pushes the poorly prepared or poorly motivated students into failure and out of school.
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
The great teachers believe in the growth of the intellect and talent, and they are fascinated with the process of learning
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
For her, teaching was about watching something grow before her very eyes. And the challenge was to figure out how to make it happen
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Too many teachers hide their own lack of ability behind that statement.
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Great teachers set high standards for all their students, not just the ones who are already achieving
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
But are challenge and love enough? Not quite
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
When students don’t know how to do something and others do, the gap seems unbridgeable
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
How can growth-minded teachers be so selfless, devoting untold hours to the worst students? Are they just saints? Is it reasonable to expect that everyone can become a saint
14 October 2020
7. Parents, Teachers, and Coaches: Where do Mindsets Come From?
Fixed-minded teachers often
Mirroring is the behavior in which one person unconsciously imitates the gesture, speech pattern, or attitude of another. Mirroring often occurs in social situations, particularly in the company of close friends or family.
* ''Couples married together for a long time begin to resemble each other and longer they are married the stronger the effect. Their patterns and wrinkles start to look the same.''
!! Why do we mirror
* ''Experiment'': Compared facial expressions of people with [[Botox]] and non-[[Botox]] users by showing them images of people with facial expressions.
** ''Result'' - Botox users on average were worse at identifying the emotions in the pictures correctly.
** Hypotheses - Lack of feedback from facial muscles impaired their ability to read other people.]
* Conclusion - Botox users with frozen facial muscles makes it hard for them to read people.
! Introduction to Deep Learning
The difference between AI, ML and DL
* AI - Any technique that enables computers to mimic human behavior
* ML - Ability to learn without being explicitly programmed
* DL - Extract new patterns directly from data
!!! Core Idea of Deep learning
* Can we learn underlying patters directly from data
!!! Why Now?
* huge data avaiability
* Availability of computing power
* Improved software and tools (TensorFlow)
!! Perceptron
The structural building block of deep learning
<img src = "https://paper-attachments.dropbox.com/s_F8B139AB70429D72FB1FB5B3CCD28DD08B76268CA86989F01E4BD68ABEBB7B56_1601627174874_file.jpeg" width = "1000">
!!! Non Linear Activation Functions
The purpose of non-linear activation functions is to introduce non linearity These include, `sigmoid`, `relu` and `tanh`.
!!! Multi Output Perceptron
Dense layers - all inputs directly connected to all the outputs
!!! Single Layer NN
this has one hidden layer apart from the input and output layers.
!!! Deep Neural Network
Multiple hidden layers within the network
!! Applying Neural Networks
Consider a binary classification problem to predict whether a student will pass this class or not. There are two variables
* `x1` : Number of lectures attended
* `x2` : Number of hours spent in the final project
Training the model will require optimizing on the loss function. The loss $$L(f(x_i; W), y_i)$$ where $$f(x_i;W)$$ is the predicted value vs $$y_i$$ which is the actual value. The loss needs to be minimized for all instances in the data.
The total average loss across all instances can be described using the following formula
$$
J(w) = \frac{1}{n} \sum_{i=1}^{n} L(f(x^{(i)};W), y^{(i)}) $$
!!! Training Objective
Find the best set of weights that minimizes the total loss
!!! Gradient Descent
''Algorithm''
# Initialize the weights randomly - $$ N (0, \sigma^{2})$$
# Loop until convergence
#* Compute Gradient : $$ \frac{\delta J (w)}{\delta w} $$
#* Update weights in the direction of downward slope $$ w \leftarrow w - \eta \frac{\delta J (w)}{\delta w}$$ where $$ \eta$$ is the learning rate
# Return weights
!!! Computing gradients using backpropagation
<img src= 'asds' width = '1000'>
Computing gradients with respect to $$ w_2 $$ : ''how much a differential change in $$w_2$$ affects the loss''
$$
\frac{\delta J (w)}{\delta w_2} = \frac{\delta \hat{y_1}}{\delta w_2} \times \frac{\delta J (w)}{\delta \hat{y_1}}
$$
Similarly computing the gradient with respect to $$w_1$$
$$
\frac{\delta J (w)}{\delta w_1} = \frac{\delta \hat{y_1}}{\delta z_1} \times \frac{\delta z_1}{\delta w_1} \times \frac{\delta J (w)}{\delta \hat{y_1}}
$$
!!! Setting the learning rate
* Learning rate decides how fast the gradient descent algorithm converges.
* ''Too Low value'' : can get stuck in local minima
* ''Too High value'' : can can overshoot the minima and diverge
* setting the eta value
** fixed: trial and error
** adaptive: changes with change in landscape
*** SGD - [[Stochastic Gradient Descent]]
*** Adam
*** RMSProp
*** Adagrad
*** Adadelta
!!! [[Stochastic Gradient Descent]]
!!! Overfitting
Neural Networks can overfit the training data quite easily. The exists some regularization techniques to contain overfitting
''1. Dropout'' - Dropout randomly sets some activations to ZERO. Does not let the neural network memorize the data
''2. Early Stopping'' - Stop the training when the loss reaches minimum
<img src = 'asd' width = '1000'>
! Deep Sequence Modelling
Sequences in deep learning can be audio or text. For text sequences they can be either, sequences of ''words'' or sequences of ''characters''
While dealing with sequences, we can face the following problems when training using fully connected layers
!!! Problem 1
Sentences in sequences are of variable length. To solve this, we can use a fixed window sizes to predict the outcome. For example, using sequences of last two words to predict the next word.
!!! Problem 2
Contextual information from earlier part of the sentence is not captured. ''The idea to solve this is to use a bag of words representation for complex vocabulary''
!!! Problem 3
Count of words/characters does not preserve order.
* //The food was good, not bad at all//
* //The food was bad, not good at all//
These two sentences differ in contextual meaning but the length and words are preserved. ''Can be solved using a really long fixed window.''
!!! Problem 4
No parameter sharing. A phrase that starts at the start of the sentence would be considered a different meaning if that phrase comes at the end of sentence even if the contextual meaning of the sentence is preserved, when applied to feed forward neural network. For example,
* //This morning// took the cat out
* took the cat out //this morning//
The phrase //this morning// could be considered different just because of the placement of phrase by a feed forward NN
!! Sequence Modelling design criteria
Develop sequence models such that
# It can handle variable length sequences
# It can track long term dependencies
# It maintains information about the order
# It shares parameters across the sequence
[[Recurrent Neural Network]]s are such kind of models suited for sequence modelling
! [[Reinforcement Learning]]
''Goal of RL'' - is to maximize reward or future reward over many time steps.
<style type="text/css">
table.tableizer-table {}
.tableizer-table td {
padding: 4px;
margin: 3px;
border: 1px solid #CCC;
}
.tableizer-table th {
background-color: #104E8B;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Concept</th><th>Definition</th><th>Variable</th></tr></thead><tbody>
<tr><td>Agent</td><td>Takes Action</td><td> </td></tr>
<tr><td>Environment</td><td>A world in which the agent operates</td><td> </td></tr>
<tr><td>Action</td><td>A move that an agent can make in the environment</td><td> </td></tr>
<tr><td>Observations</td><td>of the environment after taking actions</td><td> </td></tr>
<tr><td>State</td><td>A concrete and immitiate situation in which the agent finds itself</td><td> </td></tr>
<tr><td>Reward</td><td>Feedback that measures the success or failure of agent's action. Can be immidiate or delayed</td><td> </td></tr>
<tr><td>Total Reward</td><td>Sum of all rewards that an agent collects after a certain time $$t$$. $$ R_{t} \sum_{i=t}^{\infty} r_{i}$$ </td><td> </td></tr>
<tr><td>Discounted total Rewards</td><td>Rewards with discounting factor gamma. Makes future rewards less important than immidiate rewards. Promotes short term learning</td><td> </td></tr>
<tr><td>Q Function</td><td>Returns expected total future reardst that the agent can receive after a point in time. $$ E[R_{t}|S_{t},a_{t}] $$ </td><td> </td></tr>
<tr><td>Policy</td><td>Agent needs a policy to learn the best action to take at its state $$\pi(s) = argmax\ Q(s,a)$$ that results in highest expected total return</td><td></td></tr>
</tbody></table>
!! Q learning
Using state and training to a DNN model to determine expected total rewards $$Q(s,a)$$ for all actions in the action space $$A$$.
!!! Train a [[Neural Network]]
* Think of a best case scenario - What if the agent took all the best actions. Target return is maximized.
:$$ QLoss (L) = E[|(r + \gamma max\ Q(s',a')) - Q(s,a)|^2]$$
!!! Downsides of [[Q learning]]
''Complexity''
* can only handle small and discrete action spaces
* Not for continous
''Flexibility''
* cannot learn stochastic processes
* Policy deterministically computed from Q function by maximizing reward
!! Policy Gradient Methods
* Directly optimized policy and get probability distribution of Action space and sample from that space for action. This can handle continuous actions spaces
!! Applications
* Self-Driving Car
* AlphaGo / AlphaZero
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/93M1l_nrhpQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
! Deep Learning Limitations
!! Universal Approximation Theorem
!! Encoding Structures
A lecuture series on Deep Learning by Alexander Amini
<<tabs "[[MIT 6.S191 - LEC 1]] [[MIT 6.S191 - LEC 2]] [[MIT 6.S191 - LEC 3]] [[MIT 6.S191 - LEC 4]] [[MIT 6.S191 - LEC 5]] [[MIT 6.S191 - LEC 6]]" "[[MIT 6.S191 - LEC 1]]" "$:/state/strollhometabs" "tc-vertical">>
# [[Genetic Algorithm]] - Done
# [[H2O AutoML]]
# [[TPOT AutoML]]
# [[auto-sklearn]]
# [[Auto TS]]
# [[Multi Label Classification]]
# [[Word Cloud in Python]] - Done
# [[Recommender System]]
# [[FastAI]]
# [[GAN]] - Done
# [[Autoencoders]]
# [[Natural Language Processing (NLP)]]
# [[Graph Methods]]
# [[BERT]]
# [[Reinforcement Learning]]
# [[Word Embeddings]] - Done [[GloVe]], [[word2vec]]
# [[Named Entity Recognition]]
# [[U-Net]] - Done
# [[MLFlow]]
# [[Inductive Learning]]
# [[RNN]] - Done
# [[GRU]] - Done
# [[LSTM]] - Done
# [[Recurrent Neural Network]] - Done
# [[Topic Models]]
# [[YOLOv3]] - Done [[YOLO]]
# [[Contrastive Learning]]
# [[PyCaret]]
# [[DISTIL]]
# [[Attention Model]] - Done [[Self-Attention]], [[Multi-Head Attention]]
# [[BLEU Score]] - Done
# [[Multi-Head Attention]] - Done
,,[[Idea Book]] | [[30 April 2021]],,
!!! 1. Time Series of Stock price
This model will try to identify the next stock price with the information from the previous stock prices.
!!! 2. GBM Based Model for Buy or sell
''Classification Model for Probability of Profit''
This model will try to identify, for a given stock, the probability of making a profit for a defined holding period, if you buy at this price point and sell after the holding period. This model may contain features like
# Actual, Mean & STD Deviation of OHLC of the stock in the last 1,2,3,5,7 & 15days, 1, 3, 6, 9, 12 months, 3 & 5 years
# Actual, Mean & STD Deviation of OHLC of the INDEX in the last 1,2,3,5,7 & 15days, 1, 3, 6, 9, 12 months, 3 & 5 years
# Correlation with the index (SENSEX, NIFTY) in the last 15 days, 1 mo, 3mo, 6mo, 1y, 3y, 5y
# Correlation with the sector specific index (IT, BANKING etc.) 15 days, 1 mo, 3mo, 6mo, 1y, 3y, 5y
# Max [[Drawdown]] in these different vintages
''Regression model for amount of profit''
With the same set of variables, one can also build a regression model on the amount of profit generated after the holding period
!!! 3. Optimum holding period
''Objective functions''
# Cumulative profit generated by the stock for the [[Holding Period]]. (Maximise)
# Cumulative loss generated (minimise)
# Number of streaks of profits (maximise)
# Number of streaks of losses (minimise)
!!! 4. NLP model for favourable and unfavourable terms / news for stocks
Can use this model as input to the GBM model to identify the probability of profit with the latest news information
''Objective function''
# Number of favourable indicators (words) in the news (regression)
# Sentiment of the news (+/-)
# Top words
!! 1. Customer Activity and Engagement
* ''Downloads ''
* ''Monthly Active Users (MAU) ''- count of unique users over a month. Measures stickiness of product
* ''Daily Active Users (DAU)'' - count of unique users in a day. Measures loyalty
* ''Session length'' - time between app open or close or timeout. Greater length means more engaged
* ''Session Interval'' - time diff between first session and next session. Measures stickiness
* ''Time in App'' - Sum of session length in over a certain time period
!! Conversion and Retention
* Conversion Rate - converts by trails/leads
* Churn - unsubscribes/dollars. customers lost in a month / total number of users in prior month
* Retention -
* Build and Deploy NN in low compute environment
* useful for mobile and embedded applications
* Key Idea: Normal [[Convolution]] vs [[Depthwise Separable Convolution]]
''Computational Cost for Normal Convolution'':
= # of filter params $$\times $$ # of filter positions $$\times$$ # of filters
= $$(3\times3\times3)\times(4\times4)\times5 = 2160$$
!! [[Depthwise Separable Convolution]]
$$
\bigg[\begin{matrix} 6 \times 6 \times 3 \\ Input \end{matrix}\bigg]
\rightarrow
\bigg[\begin{matrix} Depthwise \\ Conv\end{matrix}\bigg]
\rightarrow
\bigg[\begin{matrix} Pointwise\\ Conv\end{matrix}\bigg]
\rightarrow
\bigg[\begin{matrix} 4 \times 4 \times 5 \\ Output\end{matrix}\bigg]
$$
[[Depthwise Convolution]]
<img src='https://images4.programmersought.com/760/10/10d9a49d7871b15aab633b27105fc4d8.png' width=500>
Instead of multiplying 27 numbers like in normal $$3 \times 3$$ convolution for each of three channels, you isolate one channel and apply $$3 \times 3$$ convolution to that channel, similarly 2nd channel of filter is convolved with 2nd channel of input and so on.
''Computational Cost''
= # of filter params $$\times $$ # of filter positions $$\times$$ # of filters
= $$(3\times3)\times(4\times4)\times3 = 432$$
[[Pointwise Convolution]]
<img src='http://media5.datahacker.rs/2019/02/16_2_new.png' width=600>
''Computational Cost''
= # of filter params $$\times $$ # of filter positions $$\times$$ # of filters
= $$(1\times1\times3)\times(4\times4)\times5 = 240$$
Total Computation Cost for [[Depthwise Separable Convolution]] = Cost for [[Depthwise Convolution]] + Cost for [[Pointwise Convolution]] = $$432 + 240 = 672$$. This is 31% of the computational cost for Normal Convolution. i.e. 3x savings on computation cost using [[Depthwise Separable Convolution]].
In general, the computation cost can be defined as $$\frac{1}{n_c'} + \frac{1}{f^2} = \frac{1}{5} + \frac{1}{9} = 0.31$$ savings on normal conv layer.
In general case $$n_c'$$ would be mich higher, say 512 then $$\frac{1}{512} + \frac{1}{9} = 0.11$$ or ~10x savings in computational cost.
!! Architecture V1
$$\bigg[Image\bigg] \rightarrow \bigg[\begin{matrix}Depthwise \rightarrow Pointwise \\\times 13\end{matrix}\bigg] \rightarrow Avg Pool \rightarrow FC \rightarrow Softmax$$
!! Architecture - [[MobileNetV2]]
<img src='https://dummyimage.com/600x400/000/fff' width=250>
In mobile net V2, there are two main changes from [[MobileNet]]
* Addition of [[Skip Connection]]
* Addition of Expansion Layer
!! MobileNet V2 Bottleneck
<img src='https://dummyimage.com/600x400/000/fff' width=250>
* In mobilnetv2 expansion factor of 6 is quite common
* ''Why bottleneck blocks?'' - It accomplishes two things
** By using the expansion operation it increases the size of representation within the bottleneck block allowing NNs to learn richer function
** When deploying in edge-node, these richer functions are projected down to smaller representation to save on computation and memory constraints (size of activations you need to pass from layer to layer)
* Injection Molded plastic containers to paints and lubricants industry
* 70% of revenue from paints and lubricants
* Commands high market share across all the players
** Innovative Company - Tin to Plastic for paints
** Sprouts - New methods to open plastic
** Customer stickiness - companies don't want to share inventory for plastics - takes space - customers need JIT inventory
* Breakthrough in Food and FMCG - ice creams and confectionary
* In mold labelling - labelling at the time of molding - difficult process - in house robots to control handling of plastic
* Last 6 years - 22% earnings growth
* rate at which price changes
* 100 → 105 → 115 - 15% momentum in 3 days
* high price changes → Higher momentum
* [[Relative Strength Index]]
* [[MACD]]
!! Can use Amazon Affiliate links of the books in bookself on [ext[sumitkant.github.io|https://sumitkant.github.io/]]
Eg. [ext[brainpickings.org|https://www.brainpickings.org/]] - Brain Pickings participates in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn commissions by linking to Amazon. In more human terms, this means that whenever you buy a book on Amazon from a link on here, I receive a small percentage of its price
* [[Monetizing Blog using Amazon Affiliate Program]]
* [[Money Control Metadata Scrape]]
* ''Historical Data''
** https://priceapi.moneycontrol.com/techCharts/techChartController/history?symbol=ZEEL&resolution=1D&from=1580393494&to=1612015954
* ''Financials''
** https://www.moneycontrol.com/stocks/company_info/print_financials.php?sc_did=AD&type=profit
** ''type=''
*** P&L: profit_cons_VI, profit_cons, profit_VI, profit
*** Cash Flow: cons_cashflow_VI, cons_cashflow
*** Fin Ratios: keyfinratio_VI, keyfinratio
*** Balance Sheet: balance, balance_VI, balance_cons_VI
** [[Capture Money Control Financials]]
Python script to scrape money control variables
```python
import pandas as pd
from bs4 import BeautifulSoup
import requests
import re
import json
from datetime import datetime, timedelta
URL = "https://www.moneycontrol.com/india/stockpricequote/"
response = requests.get(URL)
soup = BeautifulSoup(response.content, features='lxml')
table = soup.find('table', attrs={'class':'pcq_tbl MT10'})
links = table.findAll('a')
links_df = pd.DataFrame()
# looping through all links in the table
for i, l in enumerate(links):
if l.text.strip() != '':
page = requests.get(l['href']).content
page_soup = BeautifulSoup(page, features='lxml')
# looking for script that has identifiers for tickers
js_scripts = page_soup.findAll('script')
var_script = None
for script in js_scripts:
if 'scdid' in str(script):
var_script = script
break
# splitting the script containing variable names
itemized_script = [x.strip() for x in str(var_script).split(';')]
for item in itemized_script:
if 'scdid' in item:
scdid = item.split('"')[1]
if 'scid' in item:
scid = item.split('"')[1]
if 'nseId' in item:
nseId = item.split('"')[1]
if 'bseId' in item:
bseId = item.split('"')[1]
if 'stkname' in item:
stkname = item.split('"')[1]
# storing extracted variables in dataframe
links_df = links_df.append(pd.DataFrame({
'name': [l.text.strip()],
'scdid': [scdid],
'scid': [scid],
'nseId': [nseId],
'bseId': [bseId],
'stkname': [stkname],
'scdid_href': [l['href'].split('/')[-1]],
'stkname_href': [l['href'].split('/')[-2]],
'href': [l['href']]
}), ignore_index=True)
print('{} > Done for {}'.format(i, l))
print(links_df)
# links_df.to_csv('moneycontrol_metadata.csv')
```
```python
import requests
import pandas as pd
from datetime import datetime, timedelta
import time
import json
symbol = 'BAJFINANCE'
resolution = 1
start_time = int((datetime.now() - timedelta(days=365)).timestamp())
end_time = int(datetime.now().timestamp())
print(symbol, resolution, start_time, end_time)
URL = 'https://priceapi.moneycontrol.com/techCharts/techChartController/history?symbol={}&resolution={}&from={}&to={}'.format(symbol, resolution, start_time, end_time)
print(URL)
response = requests.get(URL)
if response.status_code == requests.codes.ok:
df = pd.DataFrame(response.json())
df.drop('s', axis=1, inplace=True)
df.columns = ['time', 'open', 'high', 'low', 'close', 'volume']
df['datetime'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=5.5)
print(df.tail(20))
df.to_csv('moneycontrol_priceapi_{}_{}_{}_{}.csv'.format(symbol, resolution, start_time, end_time), index=False)
else:
print('Request Failed')
```
Japanese word for thing making
!!References
* [ext[https://courses.lumenlearning.com/waymaker-psychology/chapter/psych-in-real-life-moral-reasoning/]]
!!! Tags:
* [[The Brain - Chapter 5]]
* [[31 March 2021]]
Core principles of a practice in which the central premise is that ''we can rarely motivate someone else to change, we are better off helping them find their own motivation to change''
!! Process
* Starts with an attitude of [[Humility]] and [[Curiosity]], asking open ended questions
* Engaging in reflective listening
* Affirming the person's desire and ability to change
* ''Important step'': Summarize. Explain the understanding of other people's reasons for change, to check on whether you've missed or misrepresented anything and to inquire about their plans and possible next steps
[[Adam Grant: Think Again]]
* Helps trade fewer trades in the sideways market
* Combination of two MAs - Smoothing
* For example, 50 EMA (faster EMA) and 100 EMA (slower EMA)
* smoothens entry and exit points
* Chances of trade being profitable are quite high
!! Trade Setup
* Go Long when 50 EMA crosses over 100 EMA
* Square off when 50 EMA crosses below 100 EMA
<img src = 'https://forexop.com/assets/uploads/2018/03/SMA_false_crossover-1280x720.png' width='500'>
!! Popular Combinations
* 9 EMA, 21 EMA → short term trades (few trading sessions)
* 25 EMA, 50 EMA → medium term trades (few weeks)
* 50 EMA, 100 EMA → longish duration (few months)
* 100 EMA, 200 EMA → long term investment opportunities (>=1 year)
''Longer the time frame, lesser the signals''. Cross overs can be applied to [[Intraday Trading]] (15 x 30 mins) or (5 x 10 min)
* SMA - Simple moving average
* EMA - exponential moving average
SMA gives equal weights to all points. But the basic assumption of [[Technical Analysis]] is ''markets discounts everything''. That means, latest price would have discounted all known or unknown information, hence, the latest price is more sacred. Which is why ''EMA is quicker to react is preferred over SMA by traders''
> A good trading system gives you a signal to enter a and trade and signal to close out on the trade
!!! Simple trading system - 50 Day EMA
* Go long when market price > 50 EMA
* Square off when market price < 50 EMA
Notice that there are multiple signals generated during sideways market and more often than not these ar marginally profitable if not loss making.
!!! Conclusion by MA
* MAs work when there is a trend in the market and fails to perform in the sideways market.
* MAs are simplest form of trend following syste,
!!! Important Characteristics
# Gives many trading signals during sideways market
# Usually one trade will result in massive rally
# Difficult to segregate big winner from many small trades and hence trader should not be selective in trading the signals. In fact, the trade should trade all the signals generated by the system
# Losses are minimum and 1 trade is enough to compensate all losses
# MA - ''proxy to identifying long term investment ideas''
```python
import matplotlib.pyplot as plt
from scipy import stats
def analysis_to_pdf(t):
data = df[df.ticker==t][['date','sigmabymu','sigmabymu10','sigmabymu50','RS','close','volume','vol50','sma50','sma200','open','obv200','volratio']].dropna().tail(150).sort_values('date').set_index('date')
data['nifty'] = data.index.map(df[df.ticker == 'NSE:NIFTY'].set_index('date')['close'])
data['volumecolor'] = np.where(data.open < data.close, '#1f77b4', '#e377c2')
data['low'] = data.nifty.rolling(5).min()
data['RS_max'] = data.RS.rolling(5).max()
data['dateint'] = list(data.reset_index().index)
dflr = data[['dateint','low', 'RS_max']].tail(25)
res = stats.linregress(dflr.dateint, dflr.low)
dflr['preds'] = res.intercept + res.slope*dflr.dateint
resrs = stats.linregress(dflr.dateint, dflr.RS_max)
dflr['regliners'] = resrs.intercept + resrs.slope*dflr.dateint
data['preds'] = data.index.map(dflr['preds'])
data['regliners'] = data.index.map(dflr['regliners'])
f, axes = plt.subplots(2, 2, figsize=(25,16), sharex=True)
ax00, ax1, ax01, ax2 = axes.ravel()
mc = mpf.make_marketcolors(up='g',down='r')
s = mpf.make_mpf_style(marketcolors=mc)
dfmpl = df[df.ticker==t][['open','high','low','close','date']].dropna().tail(150).set_index('date')
dfmpl.index = pd.to_datetime(dfmpl.index)
mpf.plot(dfmpl, ax=ax00, figratio=(25,12), figscale=0.85, style=s)
# ax00.plot(data['close'], linewidth=3)
ax00.plot(data['sma50'], '--',linewidth=1, color='red')
ax00.plot(data['sma200'], '--',linewidth=1, color='green')
# ax00.legend(['Close','50DMA','200DMA'])
# ax00_1 = ax00.twinx()
# ax00_1.bar(x=data.index, height = data['volume'], alpha=0.3, color =data['volumecolor'].values)
ax00.set_title(f'Closing Price (Daily Level) : {t}')
# ax00.set_title(f'Closing Price (Daily Level) : {t}', fontdict = {'fontsize':40})
ax00.set_xticks(data.index, data.index, rotation=90)
ax01.plot(data['obv200'], linewidth=3)
ax01.set_title('On Balance Volume')
ax01.set_xticks(data.index, data.index, rotation=90)
ax01_1 = ax01.twinx()
ax01_1.bar(x=data.index, height = data['volume'], alpha=0.3, color =data['volumecolor'].values)
ax01_1.plot(data['vol50'], '--',linewidth=1, color='green')
ax1.plot(data[['sigmabymu']], linewidth=3)
ax1.plot(data[['sigmabymu10']], linewidth=1, linestyle='--', color='red')
ax1.plot(data[['sigmabymu50']], linewidth=1, linestyle='--', color='green')
ax1.legend(title='Days',labels=['20','10','50'])
ax1.set_title('Volatility in Closing Price in last X days (Std/Mean)')
ax1.plot([data['sigmabymu'].iloc[-1]]*len(data), linestyle='--', linewidth=1, color='gray', alpha=0.3)
ax2.plot(data.RS, linewidth=3)
ax2.plot(data['regliners'], linestyle='--', linewidth=1, color='#1f77b4')
ax2.legend([f'RS {t}'])
ax2.set_title('Strength relative to Index')
ax2_1 = ax2.twinx()
ax2_1.plot(data.nifty, color='red')
ax2_1.plot(data.preds, 'r--', linewidth=1)
ax2_1.legend(['NIFTY'], loc=9)
ax2.set_xticks(data.index, data.index, rotation=90)
plt.locator_params(nbins=50, axis='x')
plt.suptitle(f'{t}', fontsize=30)
plt.savefig(f"/kaggle/working/TECHNICAL/{t.split(':')[1]}.pdf", bbox_inches='tight', pad_inches=0.5)
```
[[Small Pivot Marking - Code]]
```python
def analysis_to_pdf_v2(t):
blue, pink = ('#0984e3','#e84393')
mc = mpf.make_marketcolors(up=blue,down=pink,volume='in',edge='inherit', ohlc='i')
s = mpf.make_mpf_style(marketcolors=mc, gridstyle=':', gridaxis='vertical', gridcolor='#dfe6e9', rc={'font.size':8})
# data
dfmpl = df[df.ticker==t][['open','high','low','close','date','volume','obv200','sma50','sma200','vol50','sigmabymu','sigmabymu10','sigmabymu50','RS']].dropna().tail(250).set_index('date')
dfmpl['nifty'] = dfmpl.index.map(df[df.ticker == 'NSE:NIFTY'].set_index('date')['close'])
dfmpl.index = pd.to_datetime(dfmpl.index)
volat_within_10pc = dfmpl.sigmabymu.min() + (dfmpl.sigmabymu.max() - dfmpl.sigmabymu.min())/10
# Additional Plots
# Moving Averages, Current Price and ATH
ap_sma50 = mpf.make_addplot(dfmpl['sma50'].values,panel=0,color='gray',ylabel='SMA50', linestyle= 'dotted')
ap_sma200 = mpf.make_addplot(dfmpl['sma200'].values,panel=0,color='black',ylabel='SMA200', linestyle= 'dotted')
ap_currentprice = mpf.make_addplot([dfmpl.tail(1)['close'].iloc[0]]*dfmpl.shape[0], panel=0,color=blue, ylabel='CLOSE', linestyle= 'dotted')
ap_ath = mpf.make_addplot([dfmpl['high'].max()]*dfmpl.shape[0], panel=0,color=pink, ylabel='ATH', linestyle= 'dotted')
# On Balance Volume
ap = mpf.make_addplot(dfmpl['obv200'].values,panel=2,ylabel='OBV', linewidths=(3), color=blue)
# 50 Day Volume average line
ap_vol = mpf.make_addplot(dfmpl['vol50'].values,panel=1,ylabel='VolSMA', color='black',linestyle= 'dotted')
# Volatility Charts:
# Fill whether the volatility is in the lowest 10 percentile
fb2 = dict(y1=[volat_within_10pc]*dfmpl.shape[0], y2=0, alpha=0.1, color='gray')
ap_volat = mpf.make_addplot(dfmpl['sigmabymu'],panel=3,color=blue, ylabel='Volatility', fill_between=fb2)
ap_volat2 = mpf.make_addplot(dfmpl['sigmabymu10'],panel=3,color=pink, ylabel='',linestyle= 'dotted')
ap_volat3 = mpf.make_addplot(dfmpl['sigmabymu50'],panel=3,color='gray', ylabel='',linestyle= 'dotted')
# ap_volat3 = mpf.make_addplot(,panel=3,color='gray', ylabel='',linestyle= 'dotted', )
# Relative strength line and NIFTY 50 market
ap_rs2 = mpf.make_addplot(dfmpl['RS'],panel=4,color=blue, ylabel='RS')
ap_rs1 = mpf.make_addplot(dfmpl['nifty'],panel=4,color=pink, ylabel='NIFTY50')
# Main PLot
f, ax = mpf.plot(
dfmpl,
addplot=[ap,ap_vol, ap_sma50, ap_sma200, ap_currentprice, ap_ath, ap_volat, ap_volat2, ap_volat3,ap_rs1,ap_rs2],
figratio=(10,12),
figscale=4,
panel_ratios=(2,0.5, 0.5,0.5,1),
style=s,
volume=True,
type='ohlc',
scale_width_adjustment=dict(volume_linewidth=0, volume=0.8),
returnfig=True,
yscale='log'
)
# Next, determine the tick locations, and the tick labels:
ticks = dfmpl.index[::-1][0:-1:9][::-1]
ticklocations = [ dfmpl.index.get_loc(tick) for tick in ticks ]
ticklabels = [ tick.strftime('%d %b %y') for tick in ticks ]
# Set the tick locations and labels on the 2nd to last Axes object (the primary axis of the bottom panel)
ax[-2].xaxis.set_ticks(ticklocations)
ax[-2].set_xticklabels(ticklabels, rotation=90)
ax[0].text(ticklocations[0] - 5 , dfmpl['high'].max()*0.98, f'{t}', fontdict={'size':15, 'color':blue,'family':'monospace','weight':'bold'})
ax[0].text(ticklocations[-1] + 1, dfmpl.tail(1)['close'].iloc[0], f"{round(dfmpl.tail(1)['close'].iloc[0],2)}", fontdict={'size':8, 'color':blue,'family':'monospace'})
ax[0].text(ticklocations[-1] + 1, dfmpl['high'].max(), f"{round(dfmpl['high'].max(),2)}", fontdict={'size':8, 'color':pink,'family':'monospace'})
ax[0].text(ticklocations[-1] + 1, dfmpl.tail(1)['sma50'].iloc[0], f"{round(dfmpl.tail(1)['sma50'].iloc[0],2)}", fontdict={'size':8, 'color':'gray','family':'monospace'})
ax[0].text(ticklocations[-1] + 1, dfmpl.tail(1)['sma200'].iloc[0], f"{round(dfmpl.tail(1)['sma200'].iloc[0],2)}", fontdict={'size':8, 'color':'black','family':'monospace'})
ax[0].text(ticklocations[0] - 7, dfmpl.head(1)['sma50'].iloc[0]*1.01, f"SMA50", fontdict={'size':8, 'color':'gray','family':'monospace'})
ax[0].text(ticklocations[0] - 7, dfmpl.head(1)['sma200'].iloc[0]*1.01, f"SMA200", fontdict={'size':8, 'color':'black','family':'monospace'})
ax[0].locator_params(tight=True, axis='y')
ax[-1].text(ticklocations[-1] + 1, dfmpl.tail(1)['RS'].iloc[0], f"RS:{int(dfmpl.tail(1)['RS'].iloc[0])}", fontdict={'size':8, 'color':blue,'family':'monospace','weight':'bold'})
ax[6].text(ticklocations[-1] + 1, dfmpl.tail(1)['sigmabymu'].iloc[0], f"{round(dfmpl.tail(1)['sigmabymu'].iloc[0],2)}", fontdict={'size':8, 'color':blue,'family':'monospace','weight':'bold'})
# Display:
plt.savefig(f"/kaggle/working/TECHNICAL/{t.split(':')[1]}.pdf", bbox_inches='tight', pad_inches=0.25)
```
[[MPL finance - Version 1]]
```python
def analysis_to_pdf_v3(t):
blue, pink = ('#0984e3','#e84393')
mc = mpf.make_marketcolors(up=blue,down=pink,volume='in',edge='inherit', ohlc='i')
s = mpf.make_mpf_style(marketcolors=mc, gridstyle=':', gridaxis='vertical', gridcolor='#dfe6e9', rc={'font.size':8})
# data
dfmpl = df_marked[df_marked.ticker==t].tail(250).set_index('date')
dfmpl['nifty'] = dfmpl.index.map(df[df.ticker == 'NSE:NIFTY'].set_index('date')['close'])
dfmpl.index = pd.to_datetime(dfmpl.index)
volat_within_10pc = dfmpl.sigmabymu.min() + (dfmpl.sigmabymu.max() - dfmpl.sigmabymu.min())/10
# Additional Plots
# Moving Averages, Current Price and ATH
ap_sma50 = mpf.make_addplot(dfmpl['sma50'].values,panel=0,color='gray',ylabel='SMA50', linestyle= 'dotted')
ap_sma200 = mpf.make_addplot(dfmpl['sma200'].values,panel=0,color='black',ylabel='SMA200', linestyle= 'dotted')
#ap_currentprice = mpf.make_addplot([dfmpl.tail(1)['close'].iloc[0]]*dfmpl.shape[0], panel=0,color=blue, ylabel='CLOSE', linestyle= 'dotted')
dfmpl['ATH'] = np.nan
dfmpl.loc[dfmpl.high == dfmpl['high'].max(),'ATH'] = dfmpl.high
ap_ath = mpf.make_addplot(dfmpl.ATH*1.01, panel=0, color='red', label=f"ATH: {dfmpl['high'].max():.2f}", type='scatter', marker='v', markersize=50)
# Small Pivot highs and lows
dfmpl['sph'] = np.nan
dfmpl['lph'] = np.nan
dfmpl['lpl'] = np.nan
dfmpl['spl'] = np.nan
dfmpl.loc[dfmpl.pivot_text == 'SPH', 'sph'] = dfmpl.high
dfmpl.loc[dfmpl.pivot_text == 'SPL', 'spl'] = dfmpl.low
dfmpl.loc[dfmpl.LARGE_PIVOT == 'LPL', 'lpl'] = dfmpl.low*0.98
dfmpl.loc[dfmpl.LARGE_PIVOT == 'LPH', 'lph'] = dfmpl.high*1.02
ap_spl = mpf.make_addplot(dfmpl[['spl']], panel=0, color=pink, type='scatter', marker='^', label='SMALL PIVOT LOW')
ap_sph = mpf.make_addplot(dfmpl[['sph']], panel=0, color=blue, type='scatter', marker='v', label='SMALL PIVOT HIGH')
ap_lp = mpf.make_addplot(dfmpl[['lph','lpl']], panel=0, color='black', type='scatter', label='LARGE PIVOTS')
# On Balance Volume
ap = mpf.make_addplot(dfmpl['obv200'].values,panel=2,ylabel='OBV', linewidths=(3), color=blue)
# 50 Day Volume average line
ap_vol = mpf.make_addplot(dfmpl['vol50'].values,panel=1,ylabel='VolSMA', color='black',linestyle= 'dotted')
# Volatility Charts:
# Fill whether the volatility is in the lowest 10 percentile
fb2 = dict(y1=[volat_within_10pc]*dfmpl.shape[0], y2=0, alpha=0.1, color='gray')
ap_volat = mpf.make_addplot(dfmpl['sigmabymu'],panel=3,color=blue, ylabel='Volatility', fill_between=fb2)
ap_volat2 = mpf.make_addplot(dfmpl['sigmabymu10'],panel=3,color=pink, ylabel='',linestyle= 'dotted')
ap_volat3 = mpf.make_addplot(dfmpl['sigmabymu50'],panel=3,color='gray', ylabel='',linestyle= 'dotted')
# ap_volat3 = mpf.make_addplot(,panel=3,color='gray', ylabel='',linestyle= 'dotted', )
# Relative strength line and NIFTY 50 market
ap_rs2 = mpf.make_addplot(dfmpl['RS'],panel=4,color=blue, ylabel='RS')
ap_rs1 = mpf.make_addplot(dfmpl['nifty'],panel=4,color=pink, ylabel='NIFTY50')
# Main PLot
f, ax = mpf.plot(
dfmpl,
addplot=[ap,ap_vol,ap_spl,ap_lp,ap_sph, ap_sma50, ap_sma200, ap_ath, ap_volat, ap_volat2, ap_volat3,ap_rs1,ap_rs2],
figratio=(10,12),
figscale=4,
panel_ratios=(2,0.5, 0.5,0.5,1),
style=s,
volume=True,
type='ohlc',
scale_width_adjustment=dict(volume_linewidth=0, volume=0.8),
returnfig=True,
yscale='log'
)
# Next, determine the tick locations, and the tick labels:
ticks = dfmpl.index[::-1][0:-1:9][::-1]
ticklocations = [ dfmpl.index.get_loc(tick) for tick in ticks ]
ticklabels = [ tick.strftime('%d %b %y') for tick in ticks ]
# Set the tick locations and labels on the 2nd to last Axes object (the primary axis of the bottom panel)
ax[-2].xaxis.set_ticks(ticklocations)
ax[-2].set_xticklabels(ticklabels, rotation=90)
ax[0].text(ticklocations[0] - 5 , dfmpl['high'].max()*0.98, f'{t}', fontdict={'size':15, 'color':blue,'family':'monospace','weight':'bold'})
ax[0].text(ticklocations[-1] + 1, dfmpl.tail(1)['close'].iloc[0], f"{round(dfmpl.tail(1)['close'].iloc[0],2)}", fontdict={'size':8, 'color':blue,'family':'monospace'})
ax[0].text(ticklocations[-1] + 1, dfmpl['high'].max(), f"{round(dfmpl['high'].max(),2)}", fontdict={'size':8, 'color':pink,'family':'monospace'})
ax[0].text(ticklocations[-1] + 1, dfmpl.tail(1)['sma50'].iloc[0], f"{round(dfmpl.tail(1)['sma50'].iloc[0],2)}", fontdict={'size':8, 'color':'gray','family':'monospace'})
ax[0].text(ticklocations[-1] + 1, dfmpl.tail(1)['sma200'].iloc[0], f"{round(dfmpl.tail(1)['sma200'].iloc[0],2)}", fontdict={'size':8, 'color':'black','family':'monospace'})
ax[0].text(ticklocations[0] - 7, dfmpl.head(1)['sma50'].iloc[0]*0.98, f"SMA50", fontdict={'size':8, 'color':'gray','family':'monospace'})
ax[0].text(ticklocations[0] - 7, dfmpl.head(1)['sma200'].iloc[0]*0.98, f"SMA200", fontdict={'size':8, 'color':'black','family':'monospace'})
ax[0].locator_params(tight=True, axis='y')
ax[-1].text(ticklocations[-1] + 1, dfmpl.tail(1)['RS'].iloc[0], f"RS:{int(dfmpl.tail(1)['RS'].iloc[0])}", fontdict={'size':8, 'color':blue,'family':'monospace','weight':'bold'})
ax[6].text(ticklocations[-1] + 1, dfmpl.tail(1)['sigmabymu'].iloc[0], f"{round(dfmpl.tail(1)['sigmabymu'].iloc[0],2)}", fontdict={'size':8, 'color':blue,'family':'monospace','weight':'bold'})
# Mark tightness in price
p = dfmpl[['pivot_text','high','low']].dropna()
p['sph'] = p.high.shift(1)
if p.pivot_text.iloc[0] == 'SPH':
pass
else:
p = p[1:]
p['corrections'] = p.low/p.sph-1
p = p[p.pivot_text == 'SPL']
for i, r in p.iterrows():
ax[0].text(dfmpl.index.get_loc(i), r.low*0.97 ,f"{int(r.corrections*100)}%", fontdict={'size':7, 'color':'black','family':'monospace'})
# legend
ax[0].legend(loc='lower right')
# Display:
plt.savefig(f"/kaggle/working/TECHNICAL/{t.split(':')[1]}.pdf", bbox_inches='tight', pad_inches=0.25)
```
[[MPL Finance - Version 2]]
!! Multi-Label v/s Multi-Class
<img src='https://cdn.analyticsvidhya.com/wp-content/uploads/2017/08/25230542/Screen-Shot-2017-08-20-at-12.20.24-AM.png'>
* ''Multi Class'' - Central Board of Film Certification (U/A or U or A)
* ''Multi Label'' - tags (Comedy, Romance)
!! Approaches
Given the following dataset structure
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>X</th><th>Y1</th><th>Y2</th><th>Y3</th><th>Y4</th></tr></thead><tbody>
<tr><td>x1</td><td>0</td><td>1</td><td>1</td><td>0</td></tr>
<tr><td>x2</td><td>1</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>x3</td><td>0</td><td>1</td><td>0</td><td>0</td></tr>
<tr><td>x4</td><td>1</td><td>0</td><td>0</td><td>1</td></tr>
<tr><td>x5</td><td>0</td><td>0</td><td>0</td><td>1</td></tr>
</tbody></table>
!!! ''Approach 1: Binary Relevance''
<<<
* Treat each label `y` as separate binary classification problem
* Information due to correlation between labels is dissolved
<table>
<thead>
<tr><th>X</th><th>Y1</th><th> </th><th>X</th><th>Y2</th><th> </th><th>X</th><th>Y3</th><th> </th><th>X</th><th>Y4</th>
</tr>
</thead>
<tbody>
<tr><td>x1</td><td>0</td><td rowspan=5> </td><td>x1</td><td>1</td><td rowspan=5> </td><td>x1</td><td>1</td><td rowspan=5> </td><td>x1</td><td>0</td>
</tr>
<tr><td>x2</td><td>1</td><td>x2</td><td>0</td><td>x2</td><td>0</td><td>x2</td><td>0</td>
</tr>
<tr><td>x3</td><td>0</td><td>x3</td><td>1</td><td>x3</td><td>0</td><td>x3</td><td>0</td>
</tr>
<tr><td>x4</td><td>1</td><td>x4</td><td>0</td><td>x4</td><td>0</td><td>x4</td><td>1</td>
</tr>
<tr><td>x5</td><td>0</td><td>x5</td><td>0</td><td>x5</td><td>0</td><td>x5</td><td>1</td>
</tr>
</tbody>
</table>
```python
from skmultilearn.problem_transform import BinaryRelevance
from sklearn.naive_bayes import GaussianNB
classifier = BinaryRelevance(GaussianNB())
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
```
<<<
!!! ''Approach 2: Classifier Chain''
<<<
* 1st classifier trained on $$X \rightarrow Y_1$$. 2nd classifier trained on $$X, Y_1 \rightarrow Y_2$$
* Preserves label correlation
* Performance may drop if no label correlation
<table>
<thead>
<tr><th colspan="2">Classifier 1</th><td rowspan="6"> </td><th colspan="3">Classifier 2</th><td rowspan="6"> </td><th colspan="4">Classififer 3</th><td rowspan="6"> </td><th colspan="5">Classifier 4</th>
</tr>
</thead>
<tbody>
<tr><td>X</td><td>Y1</td><td rowspan="6"> </td><td>X</td><td>Y1</td><td>Y2</td><td rowspan="6"> </td><td>X</td><td>Y1</td><td>Y2</td><td>Y3</td><td rowspan="6"> </td><td>X</td><td>Y1</td><td>Y2</td><td>Y3</td><td>Y4</td>
</tr>
<tr><td>x1</td><td>0</td><td>x1</td><td>0</td><td>1</td><td>x1</td><td>0</td><td>1</td><td>1</td><td>x1</td><td>0</td><td>1</td><td>1</td><td>0</td>
</tr>
<tr><td>x2</td><td>1</td><td>x2</td><td>1</td><td>0</td><td>x2</td><td>1</td><td>0</td><td>0</td><td>x2</td><td>1</td><td>0</td><td>0</td><td>0</td>
</tr>
<tr><td>x3</td><td>0</td><td>x3</td><td>0</td><td>1</td><td>x3</td><td>0</td><td>1</td><td>0</td><td>x3</td><td>0</td><td>1</td><td>0</td><td>0</td>
</tr>
<tr><td>x4</td><td>1</td><td>x4</td><td>1</td><td>0</td><td>x4</td><td>1</td><td>0</td><td>0</td><td>x4</td><td>1</td><td>0</td><td>0</td><td>1</td>
</tr>
<tr><td>x5</td><td>0</td><td>x5</td><td>0</td><td>0</td><td>x5</td><td>0</td><td>0</td><td>0</td><td>x5</td><td>0</td><td>0</td><td>0</td><td>1</td>
</tr>
</tbody>
</table>
```python
from skmultilearn.problem_transform import ClassifierChain
```
<<<
!!! ''Approach 3: Label Powerset''
<<<
* Transforming into a [[Multiclass Classification]] problem
* Model complexity increases, the number of classes become higher
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>X</th><th>Y1</th><th>Y2</th><th>Y3</th><th>Y4</th><th>Class</th></tr></thead><tbody>
<tr><td>x1</td><td>0</td><td>1</td><td>1</td><td>0</td><td>1</td></tr>
<tr><td>x2</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td></tr>
<tr><td>x3</td><td>0</td><td>1</td><td>0</td><td>0</td><td>3</td></tr>
<tr><td>x4</td><td>1</td><td>0</td><td>0</td><td>1</td><td>4</td></tr>
<tr><td>x5</td><td>0</td><td>0</td><td>0</td><td>1</td><td>5</td></tr>
<tr><td>x6</td><td>1</td><td>0</td><td>0</td><td>1</td><td>4</td></tr>
<tr><td>x7</td><td>1</td><td>0</td><td>0</td><td>0</td><td>2</td></tr>
</tbody></table>
```python
from skmultilearn.problem_transform import LabelPowerset
```
<<<
!! References
[ext[Solving Multi-Label Classification problems|https://www.analyticsvidhya.com/blog/2017/08/introduction-to-multi-label-classification/]] from [[Analytics Vidhya]]
<iframe src="https://drive.google.com/file/d/14PBW0AJBZey3TKVsE0-PBRUPj4WxNllF/preview" width="800" height="480"></iframe>
!! Types
Multi-class classification can in-turn be separated into three groups
<<<
# ''Native classifiers'': These include familiar classifier families such as Support Vector Machines (SVM)s, Classification And Regression Trees (CART), KNN, Naïve Bayes (NB), and Neural Nets with multi-layer output nodes.
# ''Multi-class wrappers on binary classifiers'': These hybrid classifiers reduce the problem to smaller chunks which can then be solved with dedicated binary classifiers. The two main variants are:
#* ''One vs All (OVA)'': a binary classifier tuned to each class separately identifies that class as a positive and all others as negative.
#* ''All vs All (AVA)'': Each binary classifier is trained to discriminate between individual pairs of classes and discard the rest. Each new data point is evaluated by the classifier and assigned the class with the most votes.
# ''Hierarchical classifiers'': This group uses hierarchical methods to separate output space into nodes corresponding to target classes using a tree-based architecture.
<<< [[Evaluating Multi-Class Classifiers|https://medium.com/apprentice-journal/evaluating-multi-class-classifiers-12b2946e755b]]
!! Ways to improve performance
* Using GANs to oversample minority classes
* Using SMOTE to oversample minority classes
* Improve variable selection
* Cost Sensitive Learning - applying class weights
!! Measurement
* [[F1 Score]] - Weighted, Micro, Macro
* [[Confusion Matrix]]
* [[Cohen's Kappa]]
* [[Precision & Recall]]
* [[Accuracy]] - Average of accuracy for each class
* [[ROC AUC]]
<img src='https://machinelearningmastery.com/wp-content/uploads/2019/12/How-to-Choose-a-Metric-for-Imbalanced-Classification-latest.png' width=700>
!! Imbalanced
* [[SMOTE]] - https://machinelearningmastery.com/multi-class-imbalanced-classification/
* Randomly Undersampling
* Randomly Oversampling
* Cluster based over sampling
* [[MSMOTE]]
* [[GAN]]s
!! Implementation
* Implemented Multi-class model using [[XGBoost]] in this [[Kaggle Notebook|https://www.kaggle.com/sumitkant/xgboost-multiclass-with-weighted-f1-confusion]]
* Metrics for Multiclass - https://www.datascienceblog.net/post/machine-learning/performance-measures-multi-class-problems/
* Metrics for [[Imbalanced Classification]] - https://machinelearningmastery.com/tour-of-evaluation-metrics-for-imbalanced-classification/
,,Tags: [[14 May 2021]],,
Multicollinearity (similar to [[Collinearity]]) describes a situation in which more than two predictor variables are associated so that, when all are included in the model, a decrease in statistical significance is observed.
,,[[06 July 2020]],,
!! Multiprocessing
```python
from multiprocessing import Pool
MAX_CORES = multiprocessing.cpu_count()
with Pool(MAX_CORES-1) as p:
l = p.map(myfunction, mylist)
```
!! Multithreading
```python
import concurrent.futures
MAX_THREADS = 24
with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_THREADS) as p:
p.map(myfunction, mylist)
```
Generalizes the idea of [[Normal Distribution]] to higher dimension. This allows you to model much more complex distribution in just one distribution parameterized by single mean and single [[Standard Deviation]].
Features in the data are not nicely distributed in a single distribution and peaks in different regions
* MuseNet is developed by [[OpenAI]]
* uses [[MIDI]] files as input to generate music
Tags: [[Deep Learning Algorithm]]
!! Information
* MF page can be accessed from URL - https://www.tickertape.in/mutualfunds/sbi-liquid-fund-M_SBQA
* Collection of MF URLS - https://www.tickertape.in/screener/mutual-fund
```html
<span class="jsx-3425801674 data-cell screener-cell ellipsis mob--only" data-row="M_SBIMO" title="Medium Duration Fund"><span width="115"><span><span>Medium Duration</span><br><span>Fund</span></span><span style="position: fixed; visibility: hidden; top: 0px; left: 0px;">…</span></span></span>
```
!! REference
* [[Kotak Emerging Equity Fund|https://www.tickertape.in/mutualfunds/kotak-emerging-equity-fund-M_KORY?chartScope=5y]]
* N-BEATS is a custom [[Deep Learning]] [[Algorithm]] which is based on backward and forward residual links for univariate [[Time series]] point forecasting.
* Can be implemented using [[KerasBeats]]
<embed src='https://arxiv.org/pdf/1905.10437.pdf' width=1000 height=400>
* Fast & straightforward algorithm for [[Classification]]
* suitable for large chunk of data
* [[Supervised Learning]] algorithm
* ''assumes that the effect of a particular feature in a class is independent of other features'' - This assumption simplifies computation, and that's why it is considered as ''naive assumption''
The Nanjing Massacre or the Rape of Nanjing was an episode of mass murder and mass rape committed by Imperial Japanese troops against the residents of Nanjing, at that time the capital of China, during the Second Sino-Japanese War
Napoleon's Army by Charles Joseph Minard may well be the ''Best statistical graphic ever drawn''. Six Variables are plotted
# The size of the army
# location on 2D surface
# direction of army's movement
# Temperature on various dates
# French Lithograph (upper right)
# English Translation (lower right)
<img src = 'https://upload.wikimedia.org/wikipedia/commons/2/29/Minard.png' width ='1200'>
,,[[12 July 2020]],,
<<<
* Serves two distinct , vital life functions - information gathering and behavior influencing - and this includes almost any interaction
* It is nothing more than ''communication with results''
* Effective negotiation is applied people smarts, a psychological edge in every domain of life: how to size someone up, how to influence their sizing up of you, and how to use that knowledge to get what you want.
<<< [[Never Split the Difference]]
NAS is the process of finding the ''best performing architecture'' from ''all possible architectures'' in by following a ''search strategy'' in a given ''search space''
<img src = 'https://miro.medium.com/max/1400/1*cr1OHTq9lE4GDyOCYeknxQ.png' width = '600'>
* Neural Architecture Search (NAS), the process of automating architecture engineering i.e. finding the design of our [[Machine Learning]] model.
* Need to provide a NAS system with a dataset and a task ([[Classification]], [[Regression]], etc), and it will give us the architecture
* NAS can be seen as a subfield of AutoML and has a significant overlap with hyperparameter optimization
References
* [ext[Neural Architecture Search (NAS)- The Future of Deep Learning|https://towardsdatascience.com/neural-architecture-search-nas-the-future-of-deep-learning-c99356351136]] on [[Medium]]
,,[[04 July 2020]],,
It is the brain's ability to change. It can happen with
* Brain forming new connection between [[Neuron]]s
* Brain forming new [[Neuron]]s
* A blog Idea for discovering unusual stuff to inspire and spark createtivity
,,[[Idea Book]],,
An acknowledgement that most of you would want to read. By [[Cole Nussbaumer Knaflic]] in her book [[Storytelling with Data - Let's Practice!]]
<img src="https://lh3.googleusercontent.com/alNiw9Vaxq4mrtxu25efd0kB0j-dcjw0wvtg3DL-r5CEQaTZFDicsztgUcOjy9qYj5cpCIkzHfBHqE66BgOG7g_KwAH8Hz760s9pHXXXXfOyfv7MGQ6tJo6DJMdqP2AOB4YdTYJl1O7LfvH1mbbNHRM58pyGPiQ4C2cxiYLCOcG1BjjZqWf62Cfrfi4D6jdZptSbwXXq-sUm07Ltpu8wjLq5QIlp5AJkPQoBYYhTY6OJekP2iT36Nga2-Zhbn7LksDuYRkASANqGrll2fLclMedbxmmcKklVKbucbSz5ECn4AQMTzEC-6GUcH-UKblsbxDzCEEpzyidgRSCb5Y5DSgvoHKDelG81ZX7QlzYVSyDjquJe_tOXiQd1JFe_37KNUJAuWeho3J48ecgHpKamzLIhatM3w4-VOQWII1CLr1vZgv-ufoFDx3vN4Gtzrf-vj-OjcclLwbarnBncvKKTFiiG0Vsd8k1zaP8VRTlZTtCHGsqq_8OxajHSTyLwjnz1oJojAB_gvxwn5ISmJTKwOoD4H4eB2VWfDeGrauVxEdpZS675gTDLDjx0bsfgPuiP_nSbP-VJnosSJKFpvvU7rcgvu8IRVaFMH2sPYhJ9K4nyXQyE6_e7hHdY9hPTtZ65x3r5L7TpW9nnLAhdlcwQ8XGkMVa4sJKKtMcLrAMjQlm1JvN-bIjxNwGCYfMHCf4=w1180-h748-no?authuser=0">
[[Never Have I Ever]]
A pop-up/interstitial in [ext[brainpickings.org|https://www.brainpickings.org/]]. Good way to intrigue the visitor and promote an article
<img src="https://lh3.googleusercontent.com/bzxsToutAOIe82HPbTKBMDzNEzlCGu3IPoY1Rsx-3oagZEmliiobD8r-a1GXmWXIHwQpk56pPZp6EgtWOv-a_oGoIEeXhza753MwkOjjuY6uFcBWnQ5BD_8Fn6PxneXrdaVuyS9y1R2Je812r2TkAUhQd7eAiUa7LlQu8ZLgwACChIoYMEuFasvHfSmLCWI9rDAE90ozve67NaJ_CFM43auWEuU7QdpM3JSa9_krxENtcfM8rNvL70MPOb5Bcb_qxLdGr0jVktRsDo_iv6a42BV2w_zHf6x8D5-d_BGuyF22cRtLUWL_-6cRxgNRcOsXYxQT47anle9e1v4ZgT69R3De5yGztsLPx0m1xkjhC0wp6Ov3uUIAL3d2LP4YPa7rp5g8OkneqrdOkfi7f1A17fIYvneJWfWNAlNg2t9j9LGo181gnaW5I9sj90tzzeeGlOOitC7geqw4FZs5PJ5gjY0ebKZN_HO85lu2gSeA-ECVZdj7rsFHAY0YGsmB3uT-zlwLs0PsCe2mhTThaeilplYpRGIYBy0VNGpAoHASCbMy7YlJVxybp99WcxUmd1iv_hh_GlKgsVMrFqeG2hwuIeQNdppkAkJUHkcZVw4eedA_N9RWSCLwCP9cLha0-zKvT34RYHS9kHAs8fVO0Z6lW4qJdBOCv9KF75e56aeN12PAVV7KuziQBjzDSTV_hVM=w509-h503-no?authuser=0" width ="500">
,,[[Never Have I Ever]],,
<img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcQWg_Qrwq0ToIhZ2o1lkKgrCntori32zMHQP3qn7UyGitlfo-3o" width = '200'>
[[Dear Data]] is a book by Giorgia Lupi and Stefanie Posavec who have tracked their lives for one year. Each week they selected a theme to track their routines and share their experiences via drawings on a post card. They sent each other these postcards with legends across the continent.
Dear Data is a book made from these post cards.
* [ext[Ebook link |http://93.174.95.29/main/14091F4212076FD2F854648CE014C998]]
* [ext[Amazon link |https://www.amazon.in/Dear-Data-Giorgia-Lupi-Posavec/dp/1846149061/ref=sr_1_1?dchild=1&keywords=Dear+Data&qid=1592760222&sr=8-1]]
,,[[Never Have I Ever]],,
* A book on practical [[Negotiation]] by [[Chris Voss]]
* Practical insights from hostage negotiations
* Focus on using [[Emotional Intelligence]]
* [[Tactical Empathy]] is the centerpiece
Two major things to be aware about
* Awareness
* communication
!! Notes
* NGBoost is a [[Probabilistic Regression]] model
* The objective is to give uncertainty estimates to regression models
* [[Bayesian]] approaches scale poorly on large datasets
* [[Neural Network]]s excel at perception tasks (audio/visual) but perform on par with traditional methods on limited data and tabular datasets
* Not built for point estimates but they can be extracted and compared with other point estimate based algorithms
!!! Parameters
* Learning Rate - eg 0.01 -- 0.1
* Scoring rule - similar to loss function for point estimate algorithms like [[XGBoost]] - eg. ''log''
* [[Probability Distribution]] - eg. [[Normal Distribution]]
* Number of [[Boosting]] iterations
!!! Experiments
* Data sets - 90% train (80% train + 20% validation to select final parameters ''M'') + 10% test
* Retrained on full 90% with selected parameters ''M'' and scored on 10% initial holdout
!!! Practices
* recommended smaller learning rates
!! Reference
* [[introduction to the methodology underlying NGBoost - Deck|https://drive.google.com/file/d/183BWFAdFms81MKy6hSku8qI97OwS_JH_/view]]
* Original Paper
<embed src='https://arxiv.org/pdf/1910.03225.pdf' width=800 height=400>
* Consists of 50 companies
* Maintained by India Index Services and Products Limited (IISL)
Generate Neural network architecture schematics using [ext[NN SVG|http://alexlenail.me/NN-SVG/index.html]]
<img src ='https://lh3.googleusercontent.com/AJVGX6WZOBaBKgMMa1FbYf63PToYEaQkaEzmHIiHPEmxyYVUOsUIjMfFj_ngLG-0h2ru9ZPzb6lY3kRObwg1Gj772nejf0HAt3R_AFeGAfa26ITViY9cl569XoS5SvhzNFu5oiiBOYp_Z5WGLsd54jL-po2VKuKsjXHJD0hmPONCysj1FAZFxR5FztCuLPLtN8KFsfpdWGh6MP7GSmWN0z8AH02RcRDePVNUxqhFb7SbKHVdD6qoRYy5UwwcixY9OnA5dsZ0VIkMBLRavzoMqjIUVwEr32XjG_NYTJgxPqYm_618Q-yC7caZuwo76-SdMwCRnLVkQvukkdf5l_OaYADRyjgA4SmAkHxrhxAD_ydIoIpqMSirOK-UH6ntvrfiAh5JD7r7vo_9kLDlxGGFGBKX2bFeZtb18FpaDEbJ08cg5PMNcjUDtVDmm8msXYd_rs4Hz1TirnWNPmkMQzEUTBaGTQxJFa4JasZoVrL2XQPfwIQGXJEL9Fwmyy63jSb-4ZRFvWekN4sqBSccNeLfnovY2VUlxSylAGKUmQng2pt9E_lxyEvjaXkU7ow-vH2C398q-U0_09GeZOZmjhohSfy9LyORw6s5qbGqDrFSLBytW5LrOrM57jGTYxYq-3P3bfGIGgexYkHmpkwSC46OT-OLOnmuR9yq78Lo0vvNn0iXsJ1gzQ9QI32nAXkFsHg=w1840-h676-no?authuser=0' width = '1000'>
* book by [[Daniel Kahneman]]
* Two kinds of error : [[Bias]] and [[Noise by Daniel Kahneman]]
* The human judgement has high degree of variability in fields like [[Insurance]], [[Criminal Justice]], [[Medicine]], [[Forecasting]] etc.
* In human judgement, there are two kinds of error: [[Bias]] and [[Noise]]
** Bias is systematic deviation which may have a causal explanation
** Noise is random scatter which is not explainable. But, a general property of noise is that it can be measured while knowing nothing about bias
* This book focuses on Noise in human judgement, as organisations all over the world focus on bias but do not recognise the noise and its effects
* Fields that are noisy
** Medicine - No two doctors have same judgment about patients health
** [[Criminal Justice]] - Prison sentence is factor of which judge is assigned and not the person
** Interviewing candidates for job
** [[Forecast]]s are noisy
** Decision to grant [[Patent]]s
* [[Noise Audit]] is a randomised control experiment designed to measure variability in judgement
* Several noise reduction techniques are also laid out in the book under the definition - [[Decision Hygiene]]
[[Noise by Daniel Kahneman]] | [[18 April 2022]]
* In [[Criminal Justice]] system, the same defendant in the same case could get widely different sentences depending on which judge the case is assigned to. For example, sentencing Cases involving burglary have recommended sentences ranging from 30 days to 5 years.
* There is ample information that some irrelevant information in seemingly random factors can produce major differences in outcomes. Major insights include
** Judges have been found to grant parole at the beginning of the day or after a food break than immediately before break. Hungry judges are tougher
** Judges are more severe on the days that follow a loss by local city’s football team than days that team wins
** Defendants are given more leniency on their birthday
** If it is hot outside, people are less likely to get asylum
* Reducing noise in sentencing is mandating guidelines to consider two factors to establish sentencing - the crime and criminal history of defendant
* Guidelines are now not mandatory but just as advisory - as judges raised objections
[[Noise by Daniel Kahneman]] | [[18 April 2022]]
* In [[Insurance]]
** The [[Underwriting]] process depends on who is assigned to decide the premium.
** The case adjuster may come up with different claim estimates for the same case
* The risk of high premium and losing customers and low premium to losing business follows a [[Goldilocks Principle]] - neither too high, nor too low - but just right
* [[Noise Audit]] was conducted to measure the variability of underwriting process. The executives estimated the variability to be around 10% but it turned out to be median variability of 55% for underwriting and median 43% for claim adjusters
* Variability loses hundreds of billions of dollars in insurance business
* The premium and the claim depends on who in the lottery has been assigned the case
* In [[Noisy System]], the errors do not cancel out they add up
* [[Naive Realism]] is that other people view the world in the same way we do. We view occasional disagreements as lapses in judgement on their part.
* [[Naive Realism]] enforces [[Illusion of Agreement]]. Respected professionals believed that the premium they decided is right as other people would also recommend the same, even though they have disagreements with their colleagues on daily basis
* Bad judgment is easier to identify than good judgement. Calling out egregious mistakes and marginalising bad colleagues will not help professionals discover the noise that exists
* The conclusion is simple, where there is judgement, there is noise an more of it than you think
[[Noise by Daniel Kahneman]] | [[18 April 2022]]
* Judgements that are made repeatedly are [[Recurrent Decisions]] - like deciding parole length, sentencing and premium for insurance
* Judgements made only once are [[Singular Decisions]] - [[Barack Obama]]’s call to send a team of medical doctors to fight [[Ebola]] in 2014 when there was pressure to close borders
** Important [[Political]] decisions
** For an individual, decisions for choosing a job, partner, buying a house are examples
* analysis of recurrent decisions have taken a statistical bent, but singular decisions have taken a casual path that explores the decision in hindsight
* The noise for singular decision cannot be measured but it can be noticed [[Counterfactual]]ly the noise exists because no two person would have chosen to do the same
* From the perspective of [[Noise Reduction]], a singular decision can be treated as a recurrent decision occuring once.
* ''The goal in [[Decision Making]] is to reduce both bias and noise '' whether the decision is singular or recurring
[[Noise by Daniel Kahneman]] | [[19 April 2022]]
* A matter of [[Judgement]] is one with some uncertainity about the answer and where we allow for the possibility for reasonable people might disagree
* ''Matters of Judgement'' are different from ''Matters of opinions and taste'' where unresolved differences are acceptable
* Matters of judgement lie between facts and computation on one hand and opinions and taste on the other. They are defined by the [[Expectation of Bounded disagreement]]
* Exactly how much disagreement is acceptable in a judgement is also a judgement call and depends on the difficulty of the problem
!! How we judge
* [[Selective Attention]] and [[Selective Recall]] are sources of variability across people - people attend to and recall different aspects of the cases presented to them
* These cues are informally integrated to form an impression - mind worked to construct a coherent story
* Finally convert the overall impression and quantify: A number comes to mind $$\longrightarrow$$ check if it feels right $$\longrightarrow$$ if not, another number comes to mind
* Two kinds of judgement variabilities
** [[Within-person reliability]] - appears when same person takes different measurements
** [[Between person reliability]] - appears when multiple people are judging the same case
!! The Internal Signal : Judgement's Aim
* A judgement assigned a [[Probability]] of 90% and fails doesn't mean it is a bad one
* The thing that you feel that your judgement is right is the ''internal signal of judgement completion''
* Internal signal is available for both verifiable (answer is available) and non-verifiable (answer is probabilistic) judgements
* internal signal is not contingent on the outcome
!! How judgement is evaluated: Outcome and the process
* verifiable judgements can be compared on outcome - does not work for non-verifiable ones
* Evaluating process of judgement works for both verifiable and non-verifiable outcomes
!! Evaluative Judgments
* Like [[Predictive Judgements]], [[Evaluative Judgements]] also entail expectation of bounded disagreement
* Evaluative judgements depend on the values and preferences of those who make them - trial sentencing
* Noise Predictive Judgments can have serious consequences for those who rely on the judgement of forecasters - stage of cancer, detecting malignant or benign tumor
* Large disagreements on evaluative judgements violate expectations of fairness and consistency - different jail time for similar felonies - [[arbitrary cruelties]]
,,[[Noise by Daniel Kahneman]] | [[24 April 2022]],,
* Get noise by looking at the [[Distribution]] of predictions
* Identify the distribution of error by getting the distribution of prediction minus the actual
!! Mean squares
* [[Gauss]] born in 1777 invented [[method of least squares]] in 1795. Proposed [[Mean Squared Error]] as measure of overall error
* The [[Mean]] contains more information and is affected by outliers while median is only affected by the order
* Mean is our best estimate because it minimizes the overall error
!! The Error Equations
* Error in a single measurement = Bias + Noise
* $$Overall \ Error \ (MSE) = Bias^2 + Noise^2$$
* bias an noise play an identical role in the error equation. They are independent of each other and equally weighted in the determination of overall error
* Decrease in the overall error is same by reducing either bias or noise
* if you reduce noise - the forecasts may look precise but more wrong. Despite appearances, noise reduction reduces the overall error, even when the bias is clear. ''Reducing noise makes bias more visible'' - can be clear guide to where to adjust the scores
* It requires bias to be large and to have as much effect as noise. ''Don't be surprised if you find more noise than bias in your data''
!! The Cost of Noise
* The ''error equation'' is the intellectual foundation of this book. It provides rationale for the goal of reducing system noise in predictive judgements which is as important as reducing bias
* THE error equation does not apply to evaluative judgements, because the cost of bias and noise could rarely be symmetrical. For example, a company making elevators, the consequence of estimating the maximum load on elevator are asymmetrical - underestimation is costly and overestimation is catastropic
* [[Squared Error]] is similarly irrelevant to the decision of when to leave from home to catch a train - the consequence of being 1min or 5 min late are same
* ''A widely accepted maxim of a good [[Decision Making]] is that you should not mix your values with your facts''
,,[[Noise by Daniel Kahneman]] | [[24 April 2022]],,
[[System Noise]] is undesirable variability between judgements of the same case by multiple individuals. Two major components
* [[Level Noise]] - variability in average level of judgement by different judges.
** some judges are more lenient than others
* [[Pattern Noise]] - variability in judge's response to particular cases. Pattern Noise also contains, [[Occasion Noise]] which is similar to random error.
** Pattern noise is more stable than occasion noise
** Pattern noise is the interaction effect b/w judges x cases
$$System \ Noise = Level \ Noise ^ 2 + Pattern \ Noise ^ 2$$
,,[[Noise by Daniel Kahneman]] | [[25 April 2022]],,
* Our judgements change without any apparent reason driven by extraneous factors
* Measuring occasion noise
** hard when the judgement is memorable - we tend to give the same judgement for ease and consistency
** is evident when the judgement is not memorable, like blind wine tasking - only 18% identified identical wines by experts
** Indirect way of measuring using [[Big Data]] and [[Econometrics]]
!!! One is the Crowd
* A crowd can make the best estimate than an individual. The same can be applied to [[Occasion Noise]]
* You can get closer to the truth by combining guesses from the same person - it is called [[Crowd Within]] by Vul ad Pashler
* The gain is about 1/10th as much from asking yourself than asking someone else for a second opinion. So better ask somebody else, or else better sleep on it and think again
* Thinking about the estimates the second time assuming the first one is off the mark helps you reconsider opinions, facts and the best judgement arises by ''averaging the two''. This is called [[Dialectical Bootstrapping]] - this time it was 1/2 the improvement than asking from someone else. you can do this after sometime has passed
!!! Sources of Occasion Noise
* [[Mood]] - [[Australia]]n [[Psychologist]] - [[Joseph Forgas]] has published around 100 scientific papers on mood
** people in good mood tend to be generally positive. They find it easier to recall good memories, more approving of people, more generous and helpful
** Mood Changes how you think - You are not the same person at all times
*** In [[Negotiation]], good mood leads to being cooperative and reciprocative. People who shift from good mood to angry often get good results - works with stubborn people
*** Good mood makes you more likely to accept first impression as true without challenging them
*** Good mood makes people more [[Bullshit receptive]] and gullible
* [[Stress]] and [[Fatigue]]
** [[Physician]]s are more likely to prescribe [[Opiod]]s after end of a long day
** more inclined to use quick fix solutions despite serious downsides
** Physicians are more likely to prescribe [[Antibiotics]] and less likely to prescribe flu shots
* [[Weather]]
** ''Clouds make nerds look good''. College administration is more sensitive to Academic attributes on cloudy days and are more sensitive to non-academic attributes on sunnier days
* Order in which the cases are examined
** [[Gambler's Fallacy]] - we tend to underestimate the likelihood that streaks will occur by chance
** Asylum judges are 19% less likely to grant asylum to an applicant if the previous cases were apporved
** Loans are more likely to be declined if previous cases have been approved
!!! Sizing Occasion Noise
* [[Occasion Noise]] is a much smaller contributor compared to individual differences. ''You are not always the same person, but you are more similar to yourself than another person today''
,,[[Noise by Daniel Kahneman]] | [[26 April 2022]],,
!! [[Social Influence]]
* ''Music'' : People are influenced by the number of downloads of songs - if one song is downloaded more than the other more people will download it further. This phenomenon is called [[Social Influence]]
** Popularity is self-reinforcing. Good songs never ended at the very bottom and bad songs never ended at the top, but popularity was defined by early downloads
* ''[[Political]] opinions'' - visible views popular among [[Democrats]] would be unpopular among [[Republicans]] and vice versa. These can be just like songs. Depends on which side a view gains early popularity, it will be rejected by the other side
* ''Upvotes on stories on websites'' : Initial vote ups resulted in the next story viewer to be 32% more likely to upvote. Initial vote increased the mean rating of comments by 25%. In summary, a single positive early vote is a recipe for noise
* Independent crowds are wiser, but social influence reduces the group diversity resulting in worse estimates due to herd behavior
!! Cascades
* [[Informational Cascades]] - similar groups in business, government can go in multiple directions depending on who speaks up first, who speaks confidently etc. They make noise across groups more likely. This is not entirely irrational but,
** People tend to neglect the possibility that most people in the crowd are in a cascade
** Can lead to groups in terrible directions.
* People assume that the other person has more information that themselves because the other person spoke first and was confident, or was in a position of power.
* [[Social Pressure]] also leads to people silence themselves and follow the majority so as to not look stupid, obtuse, truculent or uncongenial
!! Group Polarization
* Juries suffer from [[Group Polarization]] - When people speak with one another, they often end up with more extreme viewpoint that their original inclinations
* Statistical juries on one had are more consistent and less noisy, deliberating juries had the effect of increasing noise
* A lenient inclination led to more lenience and severe inclination led to extreme punishment
,,[[Noise by Daniel Kahneman]] | [[27 April 2022]],,
!!! In predictive judgements, human experts are easily outperformed by simple formulas - models of reality, models of a judge and even random models
!! Case of choosing the better executive
* [[Clinical Judgement]] - informal approach of weighing parameters intuitively. May not give same weight to a parameter on different case
* [[Mechanical Prediction]] using [[Simple Model]]s like - [[Linear Regression]] - uses weighted average of predictors - generally superior to human judgement
** Contrary to their belief, professionals and experts are weak in integrating information
** In a [[Simple Model]], the effect of change in the value of predictor is same across cases, which is not considered in Clinical Judgement
* [[Illusion of Validity]] - we are quite confident in the assessment of our judgement, but it differs from actually being accurate
* A study of 136 concluded that mechanical aggregation outperforms clinical judgement. It is also faster and cheaper
* [[Lewis Goldberg]] - developer of [[Big Five Personality Traits]] - conducted study to conclude that a simple model created by the judge themselves outperforms their clinical judgement. The difference between model of you and you is you fail to reproduce subtle rules you created, which creates noise in judgement and thus reduces accuracy. It also eliminates [[Pattern Noise]]
** You assume being subtle makes valid judgments but instead they are more noisy
* Complex rules created by us even with the strong feelings that they are based on valid insights
** the rules may not be true
** They may apply under specific conditions which are rare
* One more finding was that, any [[Linear Model]] when applied consistently to all cases, was likely to outdo human judges in predicting an outcome from the same information
,,[[Noise by Daniel Kahneman]] | [[30 April 2022]],,
* All mechanical approaches are noise-free and outperform human judgment
''Outperformance follows this order'': [[Machine Learning]] ([[AI]])> [[Simple Model]] > human judgement
* [[Frugal Rules]] - Even simple models where the variables have equal weights on <=5 variables outperform human judgement. Therefore, it boils down to selecting important predictors
** This is because social sciences is marked by small sample sizes, and building complex models can adjust to flukes in original data, the real life performance on hold out data my significantly decrease
** [[Dawes]] phrase - there is a robust beauty in equal weights
* Predictors which share high [[Correlation]] with dependent variable may be correlated with one another and thus using them together only improves the correlation by a smaller amount over and above the higher of the two
''When to override the model ?''
*Very large datasets and [[Machine Learning]] allows us to deal with [[Broken-leg exceptions]], because they are good at discovering it
** Broken-leg exceptions allows us to know when to override the model. If we have an evidence suggesting otherwise, we should go ahead with the model's predictions
* [[Machine Learning]] models are do better than most judges even in cases where there is [[Racial Discrimination]], and algorithms are much less biased (depends on the representation)
** An algorithm jails 41% fewer people of color
* [[Resume]] screening
** Candidates selected by algorithm are 14% more likely to be given a job offer and 18% more likely the offer is accepted - not biased by universities, [[Race]], and was much better at selecting non-traditional candidates
''Why don't we use rules more often?''
* We want to prefer algorithms over human judgement, but we stop giving chance as soon as we see it making mistakes. Term called [[Algorithmic Aversion]]. We want the machine to be perfect
** But model is any day better than human judgement
,,[[Noise by Daniel Kahneman]] | [[01 May 2022]],,
!!! When there is a prediction, there is ignorance. And when you chose to trust your gut not knowing why is denial of [[Objective Ignorance]]
''Objective ignorance increases the further we look in to the future''
''Intuition ''
* A judgement for a given course of action that comes to mind with an aura of conviction of rightness or plausibility, but without clearly articulated reasons or justifications - essentially knowing bug without knowing why - It is an [[Internal Signal]] of judgement
* most experienced leaders trust their gut sometimes more than analysis
* What makes internal signal most important and misleading is that it is construed as a belief rather than as a feeling
!!! Overconfident Pundits
* [[Overconfidence]] is the best documented [[Cognitive Bias]]es
* [[Phillip Tetlock]] studied experts and their predictions about major political events and found - ''average expert is roughly as accurate as a dart throwing chimpanzee'', but on tv their make their case for predictions with so much confidence. The most confident were found to be least accurate
* Limit on expert political judgment is not set by cognitive limits of forecasters by by their objective ignorance of the future
* [[Superforecasters]] were found to be better than most experts and professionals
!!! The Denial of Ignorance
* The intuitive judgements comes with the emotional reward of [[Internal Signal]]. People will trust the algorithm if the certainity of prediction >= provided by internal signal
,,[[Noise by Daniel Kahneman]] | [[01 May 2022]],,
!!! [[Social Science]] can achieve about 0.2 correlation with human affairs (there is much we don't understand).
* Even on social science tasks - the performance was [[Machine Learning]] > [[Simple Model]]s > Human Judgment
* [[Correlation]] does not imply [[Causation]], but [[Causation]] implies [[Correlation]] - The things that can be
* Two models of thinking
** [[Causal Thinking]] - we create stories of specific events, people and objects affect one another. This removes unnecessary effort while maintaining vigilance for abnormal events. This comes much more naturally to us
*** our general understanding of lie as it unfolds consists of steady flow of [[Hindsight]] in the valley of normal. The memories of uncertainties are erased when uncertainties are resolved
*** Genuine surprise occurs when routine hindsight fails
** [[Statistical Thinking]] - concerned with samples, and average and variances. This thinking is effortful and based on [[System 2]]. This is also called the outside view
,,[[Noise by Daniel Kahneman]] | [[02 May 2022]],,
!!! [[Psychological]] biases are universal and they produce shared errors - Prejudgments and context triggers in biases create noise
!! [[Heuristic]]s and biases
The central idea is that when people are asked a difficult question they use simplifying operations called [[Heuristic]]s. Heuristic identify what people have in common
!! Diagnosing Bias
* Bias in [[Predictive Judgements]] are mostly in one direction - for example [[Planning Fallacy]] and [[Scope Insensitivity]]
!!! Substitution
* We substitute the likelihood problem to a similarity question and answer. This is intuitively done by [[System 1]] or [[Heuristic]].
* A [[Heuristic]] answers difficult question by finding answer for easier one, which causes predictable errors and [[Psychological Bias]]
* [[Venn Diagram]]s apply to [[Probability]] not similarity
* [[Base Rate Neglect]] - is a [[Psychological Bias]] that does not account information from outside view.
** To answer the question whether this candidate will stick around for 2 years, we don't look at historical data, whether how many candidates have stuck around for 2 years. Focusing on the case alone would produce errors
* [[Availability Heuristic]] substitutes judgement of how easily examples come to mind
* [[Conclusion Bias]] or [[Prejudgement]] - we often start the judgement to reach a conclusion, where [[System 1]] suggests a conclusion. When we use [[System 2]] then the evidence we gather to reach the conclusion will either be selective or distorted leading to [[Confirmation Bias]]
** [[Prejudgement]]s have emotional component - people determine what they think by consulting their feelings - [[Affect Heuristic]]. This is one reason why companies work hard to attach positive effect to the brand
** A subtler example of [[Conclusion Bias]] is [[Anchoring Effect]]. This is when an arbitrary number affects your quantitative judgement
* [[Excessive Coherence]] - We form coherent impressions quickly and are slow to change them. The order in which the information is presented matter to us
** Can develop a positive impression of the candidate based on little evidence. This causes [[Halo Effect]]
,,[[Noise by Daniel Kahneman]] | [[05 May 2022]],,
This chapter focuses on the ''role of response scale'' as a source of noise using the following case
//A six year old kid was hospitalized for several days and sustained severe damage to lungs while overdosed on a pill they she accidentally ate. This was a result of negligence of pharmaceutical company that applies child protective caps on pill bottles which has high failure rate, and their internal document says that FDA won't do anything except warn to change the cap.. Company makes $100M to $200M in profits every year //
Answer the Following
# ''Outrage'': Which of the follwing best expresses your opinion of defendant's actions
#* Completely Acceptable (0) -> Objectionable (2) -> Shocking (4) -> Outrageous (6)
# ''Punitive Intent'': In addition to paying compensatory damages, how much should the defendant be punished
#* No punishment (0) -> Mild Punishment (2) -> Severe Punishment (4) -> Extremely severe punishment (6)
# ''Damages'': In addition to paying compensatory damages, what amount of punitive damages (if any) should the defendant be required to pay as punishment and to deter any similar actions from the defendant or anyone else in future? $......
!! Analysis
* People may differ in their adjustments, not because they disagree on the substance but because they use the scale in different ways.
* Ambiguity in naming the scales is a general problem. For example on the scale of completely acceptable to absolutely outrageous, people can have standards of acceptability and outrageousness based on leniency and angriness
In this chapter, author test the [[Psychology]] of [[Punitive Damage]]s and the role of monetary scale as the main source of noise
!! [[The Outrage Hypothesis]]
This is a case of [[Substitution]], where people substitute the answer of a difficult question with an easy one. For example, //How much a company should be punished//, is substituted by //How angry am i?//
* Also the correlation between outrage and punitive intent is very high - 0.98.
* Outrage is the main driver of punitive intent but not the only one
* While rating outrage, level of harm (mild, severe) matters little in fast thinking, but while rating punitive intent, people assign significant weight to level of harm.
!! Punitive Damages are noisy
* jurors agree on how severely they wish the defendant to be punished but differ highly on how to translate punitive intent into scale of dollars
''Variance in judgements = Variance of Just Punishments + (Level Noise)**2 + (Pattern Noise)**2''
*Punitive Intent - Least noisy - System noise accounts for 51% of variance : as much noise as there is Justice - ''Punitive intent more specific as upper bound limited by law''
* Outrage scale - Noisier - [[System Noise]] 71% - lack of clarity at the upper end of the scale leading to noise
* Dollar Scale - Noisiest - 94% [[System Noise]]
!! Dollars and Anchors
* Legendary [[Harvard]] [[Psychologist]] [[S. S. Stevens]] discovered the surprising fact that people share strong intuitions about the ratios of intensity of many subjective experiences and attitudes. Stevens called these scales as [[Ratio Scale]]s
* Stevens discovered that [[Ratio Scale]] like the dollar scale can be tied down by single intermediate [[Anchor]] -called [[Modulus]]
** In a pricing experiment, initial anchors affected the willingness to pay for a whole list of objects
** People are much more sensitive to the relative value of comparable goods that to their absolute value. This is called [[Coherent Arbitrariness]]
* Stevens reported that in the absence of an anchor, people are forced to make an arbitrary choice when they use the scale for the first time. After that, they use their first answer as anchor and make their judgements consistently
* However, despite the absolute value, the relative rank ordering of objects remain consistent.
* The Dollar scale can thus be transformed to a ranking scale - which eliminates all juror-level errors (1-10) scale is same for everyone
!! An Unfortunate conclusion
''Dollar awards were consistently anchored on the arbitrary number that each juror picked for the first case they saw''
Professional judgements are rarely expressed on scales that are so hopelessly ambiguous and this has effect in business, education, sports, govt. etc
* ''The choice of the scale can make a huge difference on the amount of noise in judgements because ambiguous scales are noisy''
* ''Replacing absolute judgements with relative ones, when feasible, is likely to reduce noise''
,,[[Noise by Daniel Kahneman]]| [[20 June 2022]],,
!! Speaking of [[Pattern Noise]]
* You seem confident in your conclusion, but this is not an easy problem: there are cues pointing in different directions. Have you overlooked alternative interpretations of the evidence?
* You and I have interviewed the same candidate, and usually we are equally demanding interviewers. Yet we have completely different judgements. Where does this pattern noise come from?
* The uniqueness of people's personalities is what makes them capable of [[Innovation]] and [[Creativity]], and simply exciting to be around. When it comes to judgement, however, uniqueness is not an asset.
!! When do you feel confident in your judgements
* The story your believe must be comprehensively coherent
* There must be no attractive alternatives
* ''But, confidence does not guarantee accuracy'' and suppression of alternatives induces [[Illusion of Agreement]]
!! [[Pattern Noise]] is Out of Pattern Behavior
* Pattern Error = Stable Pattern Error + Transient (Occasion) Error
** Both these errors are independent and uncorrelated, variance can be written as
* ''(Pattern Noise)**2 = (Stable Pattern Noise)**2 + ([[Occasion Noise]])**2''
** ''Stable Pattern Noise'': stems out of [[Personality]] and personal experiences (wisdom you have gained from past experience, errors to avoid, mental model unique to you)
** [[Occasion Noise]]: stems out of different situations (the mood, the weather)
,,[[Noise by Daniel Kahneman]] | [[22 June 2022]],,
!! Speaking of Sources of Noise
* We easily see differences in average level of judgements, but how large is the pattern noise we do not see?
* You say the judgement was caused by biases, but would you say the same thing if the outcome had been different? And can you tell if there was noise
* We are rightly focussed on reducing biases. Let's also worry about reducing noise
!! Sources of Error
* The author concluded that in judgements, [[Noise]] is often the larger component of error than [[Bias]] is
* Stable [[Pattern Noise]] is more significant than the other components of [[System Noise]]
* [[Pattern Noise]] contributes more than [[Level Noise]]. Stable [[Pattern Noise]] is 4x larger than [[Level Noise]]
!! Explaining Error
!!! Why do we focus more on [[Bias]] than on [[Noise]] despite its ubiquity?
* ''Judgements that produce satisfactory outcomes are normal and seldom questioned!''
* A success story - explains itself once the outcome is known. We do feel the need of explaining abnormal outcomes - both good and bad ones
* [[Fundamental Attribution Error]] - is a strong tendency to assign blame or credit to agents for actions and outcomes that are better explained by luck or by objective circumstances
* [[Hindsight]] also distorts judgements so that outcomes that could not have been anticipated appear easily foreseeable in retrospect
* A long list of [[Psychological]] [[Bias]]es - [[Planning Fallacy]], [[Overconfidence]], [[Loss Aversion]], [[Endowment Effect]], [[Status Quo bias]], [[Present Bias]] -could explain the judgement error if the bias could be predicted in advance or detected in real-time
!! Noise is statistical
* ''Causally, noise is nowhere; Statistically it is everywhere''
<img src='https://miro.medium.com/max/1114/1*zVDkL77mYT7x3fmwhVnn_A.jpeg' width=500>
,,[[Noise by Daniel Kahneman]] | [[01 July 2022]],,
!! How to identify better judges?
* Based on three things - Judgements are both less noisy and biased when judges are ''well trained, more intelligent and have the right cognitive style''
** In other words, Good judgements depend on ''what you know'', ''how well you think'' and ''how you think
''
!! Experts and Respect-Experts
* Individuals are ''experts'' - If the superiority on a task is ''verifiable''
* Individuals are [[Respect-Experts]] - if the judgements are ''not verifiable''
** The confidence these experts have is entirely based on the respect they enjoy from the peers
** In the absence of true values to determine who is right or wrong, we often value the opinion of respect-experts even when they disagree with one another
!!! What makes a [[Respect-Expert]]?
How do people who are respected for the quality of their judgement decide to trust someone as an expert where there is no data to establish the expertise objectively?
# Based on ''shared norms'' or professional doctrine - These experts have obtained qualifications from professional communities and receive training and supervision in these org. Shared norms give professionals a sense of which inputs should be taken into account and how to make final judgements
# Requires ''Experience'' for credibility
# ''Explaining the judgements with confidence'' - able to construct coherent stories
!! Intelligence
Training, expertise and confidence enables [[Respect-Experts]] to command trust. But these attributes do not guarantee the quality of their judgements. [[General Intelligence]] is likely to be associated with better judgement
* [[General Mental Ability (GMA)]] Test quantifies intelligence, which is now being used over [[Intelligence Quotient (IQ)]]
** People with higher GMA score tend to do better in academics and in jobs
** GMA does not measure practical intelligence and [[Creativity]]
** GMA by far remains the single best predictor for important outcomes
* [[Psychologist]]s and [[Neuroscientist]]s distinguish between
** [[Crystallized Intelligence]] - The ability to solve problems by relying on the store of knowledge of the world (including arithmetic operations)
** [[Fluid Intelligence]] - The ability to solve novel problems
,,[[Noise by Daniel Kahneman]] | [[01 July 2022]],,
!! Speaking of Debiasing and Decision Hygiene
* Do you know what specific bias are you fighting and in what direction it affects the outcome? If not, there are probably several biases at work, and it is hard to predict which one will dominate
* Before we start discussing this decision, let's designate a decision observer
* We have kept a good decision Hygiene in the decision process, chances are the decision is as good as it can be
!! Bias is visible and can be corrected
Two main approaches to debiasing
* ''Ex Post'' - Correct the bias after the judgment has been made
** For example, adding buffer to timelines in a project to correct [[Planning Fallacy]]
* ''Ex Ante'' - addressing bias by intervening before the judgement or decision
** Using ''Nudges ''- modifies the environment where the decisions take place. For example, auto-enrollment in pension plans to increase saving
** Using ''Boosting'' - training decision makers to recognize their [[Bias]]es and to overcome them. For example, teaching people statistical literacy
!!! Limitation of Debiasing
* Most debiasing approaches assume that bias exists in a certain direction. This assumption maybe wrong.
* There may be more than one bias at play - we need to cast a broader net to detect more than one bias at a time
!!! The [[Decision Observer]]
* Decision Observer is someone who watches a group and uses a checklist to diagnose whether any biases may be pushing the group away from the best possible judgement
** This is given, that the people in the group are committed to reduce bias
* Plays the role of [[Devil's Advocate]] inside the group
!! Noise Reduction: [[Decision Hygiene]]
Bias is the error we often see and can explain. ''Noise'' is unpredictable error that we cannot see or explain. Use [[Decision Hygiene]] to reduce noise. This is like washing your hands, where you don't know which germ you are avoiding but you know it is good prevention for a variety of germs. Same goes for decision hygiene
Correcting a well-identified bias may at least give you a tangible sense of achieving something, but the procedures that reduce noise will not. Noise is an invisible enemy
,,[[Noise by Daniel Kahneman]] | [[02 July 2022]],,
We tend to think [[Forensic Fingerprinting]] to be an exact science, but in fact it is subject to [[Psychological Bias]]es of the examiners. To understand the decision hygiene implemented in Forensic Science, we need to understand how fingerprinting works
!!! [[Fingerprint]]s
* [[Henry Faulds]], a Scottish [[Physician]] published first scientific paper suggesting the use of fingerprints as an identification technique
* Two types of Fingerprints
** ''[[Latent Prints]]'' - those left by the owner at the scene of the crime. Often partial unclear, smuged
** ''[[Exemplar Prints]]'' - those collected in controlled conditions from known individuals - often are very clear
** whether the latent print matches the exemplar becomes a judgement call
* Examiners follow ''ACE-V'' procedure - Analysis, Comparison, Evaluation and Verification by and independent expert
** There exists [[Occasion Noise]] in Examiners evaluation of fingerprints
** In the verification phase, there is [[Confirmation Bias]] - Knowing the conclusions of the first examiner biases the independent verifier. A cascade of confirmation bias can happen if multiple independent verifications were done and the first evaluation was done by a respected examiner
!! Sequencing information - 3 Decision Hygiene Recommendations
''Sequencing information to limit the formation of premature intuitions'' - this has broad applicability to reduce [[Occasion Noise]]
* ''Recommendation 1'': [[Linear Sequential Unmasking]] - More information is not always better, especially if it has the potential to bias judgements by leading the judge to form a premature intuition. The laboratory experts on fingerprinting are kept in the dark about the context of the case so not to bias them prematurely and the information is gradually revealed
* ''recommendation 2'': The examiner should document the analysis of latent fingerprint before moving on exemplar fingerprints to decide whether they are a match - limits premature intuition
* ''recommendation 3:'' When a different examiner is called on to verify the identification made by the first person, the second person should not be aware of the first judgment
''A Good decision maker should aim to keep a "Shadow of a Doubt" not and "not to be the man who knew too much"''
,,[[Noise by Daniel Kahneman]] | [[02 July 2022]],,
<<<
''When the facts change, I change my mind. What do you do?''
<<< [[John Maynard Keynes]]
* Forecasters tend to be overconfident, if asked for forecasts as [[Confidence Interval]]s, they provide narrow range
* Forecasters are also noisy
** [[Occasion Noise]] is common - forecasters do not agree with themselves
** Between person noise is also pervasive - forecasters disagree with one another even if they are specialists
!! Improving [[Forecast]]s
Two methods
* Selecting better judges who produces better judgements
* [[Decision Hygiene]] - Aggregating multiple independent estimates
** Simple Average - guaranteed to reduce [[Noise]]. If you average 100 observations your will reduce noise by 90%, for 400 - noise reduced by 95%
** [[Select-Crowd]] strategy - average the judgements of a small number of judges
** [[Prediction Markets]] - individual bet on likely outcomes and are incentivized to make right forecasts
** [[Delphi Method]] - Benefits both from aggregation and social learning. Involves multiple rounds of anonymous voting and reasoning to converge to an estimate. Challenging to implement
*** [[Mini-Delphi Method]] - Implemented in a single meeting by estimate-talk-estimate
!! [[Good Judgement]] Project
[[Phillip Tetlock]] assembled thousands of volunteers to - ordinary people from all walks of life to make
* large number of forecasts about world events
* in terms of probabilities
* allowed participants to revise forecasts continuously
to learn whether
* some people are especially good forecasters, and
* this skill can be learned
and they were evaluated on [[Brier Scores]] - to measure the distance between the forecast and what actually happened, for which the forecast were required to have
* Good [[Calibration]] - The % of likely events that forecasters predicted and that actually happened
* Good [[Resolution]] - The probably assigned to likely events is higher and to unlikely events were lower - then only the forecasts were useful
and 2% stood out in Brier Scores (Lower the better) - they were called [[Superforecasters]] who were better than average volunteer due to
* [[Intelligence]] - Had higher [[General Mental Ability (GMA)]] scores
* Ease in thinking analytically and probabilistically
* Willingness and ability structure and to disaggregate problems
** They ask - ''What would it take for the answer to be yes?''
* [[Open Mindedness]] - Also excel at taking outside view, and care about [[Base Rate]]s
essentially the thinking style of [[Superforecasters]] is like [[Perpetual Beta]] - borrowed from [[Computer Science]] for a program that is not meant to be released in a final version but it is endlessly tested , used analyzed and improved upon.
!! Learning the skill used by [[Superforecasters]]
* Training - Learning probabilistic reasoning
* Teaming (form of aggregation) - debating predictions to improve accuracy by debating predictions and being actively open-minded. Leads to large noise reduction
* Selection - top 2% were designated as superforecasters
The training was designed to reduce noise by reducing [[Psychological Bias]]es. Note that the effect of [[Psychological Bias]]es is not statistical bias
!! Why some forecasters are better
* They can be more skilled in finding relevant information and analyzing data
* Some forecasters have a general tendency to err on one side of bias
* Some forecasters may be less susceptible to noise
!! Where Selection and Aggregation Work
* Multiple [[Regression]] - Works by selecting variables in succession with orthogonal information
** Select a team, not based on people who are similar but who will also bring something complementary to the table. This helps reduce noise to a large extent
** [[Pattern Noise]] will be very large in this team, but the average of the noisy group will be more accurate than the average of a unanimous one
,,[[Noise by Daniel Kahneman]] | [[03 July 2022]],,
Guidelines have been highly successful in reducing both bias and noise. They have helped [[Doctor]]s, [[Nurse]]s and [[Patient]]s and greatly improved public health in process
!! Speaking of Guidelines in [[Medicine]]
* Among doctors, the level of [[Noise]] is far higher than we might have suspected. In diagnosing, [[Cancer]], [[Heart Disease]] - even in reading [[X-rays]], specialists sometimes disagree
* [[Doctor]]s like to think that they make the same decision, whether the day of week or time of day, but it depends on how tired they are
* Medical guidelines can make doctors less likely to blunder at a patient's expense. Such guidelines can also help in medical professions as a whole, because they reduce variability
!! Summary
* [[White Coat Syndrome]] - when blood pressure readings are higher in doctor's offices than at home
* [[Diabetes]] - If you have a fasting blood sugar level of 126mg per decileter or higher or an [[HbA1c]] - average measure of blood sugar level over the prior three months of at least 6.5, you are considered to have diabetes
* ''[[Doctor]]s exercise judgement - standard practice is to get a second opinion''
** Variation in the skill explains 44% of variation in diagnostic decisions
** Between-person noise or [[Interrater Reliability]] is measured using [[Kappa Statistic]]. The higher the kappa, the less the noise. 1 - perfect agreement, 0 - agreement at a level of monkey throwing darts into diagnoses
!! Findings from literature
!!! [[Heart Disease]]
[[Coronary Angiogram]]s are a primary method use to test for heart disease, assess the degree of blockage in [[Heart]]'s [[Artery]] in both acute and non-acute settings
* Non Acute settings - patients with recurrent [[Chest Pain]] - [[Stent]] placement if more than 70% of an [[Artery]] is blocked
* [[Physician]]s disagreed 31% of time when evaluating 70% blockage on an artery
!!! [[Endometriosis]] -
* a disorder of endometrial [[Tissue]] (lining inside the [[Uterus]], grows outside of Uterus)
* Diagnosed with [[Laparoscopy]] - small camera surgically inserted into the body
* [[Gynecologist]]s disagree in the number and locations of eudiometric [[Lesion]]s
!!! [[Tuberculosis (TB)]]
* Diagnosed using Chest [[X-rays]] - to examine empty space caused by the TB [[Bacteria]]
* Huge amount of variability
!!! [[Melanoma]]
* Most dangerous form of skin cancer
* Diagnostic Accuracy of melanoma's was 64%, other times [[Dermatologist]]s failed to detect it 36% of the time
!!! [[Breast Cancer]]
* Diagnosed by screening [[Mammogram]]s
* [[False Positive]] rates ranged from 1% to 64% of the time
!!! [[Psychiatry]]
* An extreme case of noise in diagnosis as the levels of noise continue to be high in psychiatry despite the guidelines
!! [[Occasion Noise]]
* When assessing the blockage using [[Coronary Angiogram]]s, [[Radiologist]]s disagreed with themselves 62% - 93% of the time
* ''Doctors are significantly more likely to order cancer screenings early in the morning than late in the afternoon''
** Patients with appointment times later in the day were less likely to receive guidelines-recommended cancer screening
* [[Deep Learning]] [[Algorithm]]s and [[AI]] reduce [[Noise]]
!! Guidelines in [[Medicine]]
!!![[Apgar Score]]
* developed in 1952 by obsteric [[Anesthesiologist]] - Virginia Apgar
* [[Backronym]] - Appearance, Pulse, Grimace, Activity, Respiration
* to Asses whether a new born baby is in distress - instead of being a judgement call, became a guideline
<img src='https://browntrialfirm.com/infographics/apgar-scores-explained.jpg' width=500>
!! [[Breast Imaging Reporting and Data System (BI-RADS)]]
* lays out guidelines for [[Breast Cancer]] diagnosis
* Helped increase greater interrater agreement in the interpretations of [[Mammogram]]s
*
,,[[Noise by Daniel Kahneman]] | [[04 July 2022]],,
!!! Problem
performance ratings can be subject to [[Pattern Noise]] (opinions of your rater), [[Level Noise]] (how the same scale is used by different people differently) and [[Occasion Noise]] (the effect of mood, weather) - In fact 3/4 of it is [[System Noise]] and only 1/4th contributes to person's actual performance
!!! Existing Solutions
Two common approaches prevalent in organizations
* Aggregation - 360 degree feedback - suffers questionnaire overload, system integration - does more harm than good
* Forced Ranking - Forcing employees to fall under certain distribution - there can be cases where some people might not fall under the worse category (like [[NASA]] engineers)
!!! How to solve?
One solution is ''Common frame of reference''. Raters are trained to recognize different dimensions of performance, and rate based on shared set of anchors since many people agree on different meanings of good/great
<img src='https://www.aihr.com/wp-content/uploads/2021/02/Artboard-3@2x.png' width=700>
,,[[Noise by Daniel Kahneman]] | [[07 August 2022]],,
* Unstructured interviews are often useless, as they are a minefield of [[Psychological Bias]]es. Interviewers are likely to ask a question that confirm their initial impression, and the interviewer has a vivid feeling of knowing the candidates that invariably produces noise
* Bringing structure to the interviews can help. [[Google]] is one such company that uses aggregation - interviewing the same person 4 times (diminishing returns larger than this number) to reduce [[Noise]]. They have also deployed a [[Decision Hygiene]] strategy - [[Structuring Complex Judgements]]
** ''Decomposition ''- breaks down components into mediating assessments
** ''Independence ''- requires information of each assessment to be collected independently - structured interviews (asking predefined questions and rating on a rubric)
** ''Delayed Holistic Judgement'' - do not exclude intuition, simply delay it. Google's final hiring recommendation is made by hiring committee
,,[[Noise by Daniel Kahneman]] | [[09 August 2022]],,
[[Mediating Assessment Protocol]] is a [[Decision Hygiene]] strategy that can be applied broadly and whenever the options require considering multiple dimensions
# At the beginning of the process, structure the decision into mediating assessments
# Ensure that whenever possible, mediating assessments use an outside view. For relative judgements use case with scale if possible
# In the analytical phase, keep the assessments as independent as possible
# In the decision meeting, review each assessment separately
# On each assessment - ensure that participants make their judgement indiviaully - then use [[Estimate-talk-Estimate]] method
# To make the final decision, delay intuition, but don't ban it
The [[Mediating Assessment Protocol]] can be applied to recurring decisions as well
# Define the list of mediating assessments - one time. For VC, it is fund investment criteria
# Experience from prior judgements can be used to calibrate judgements. Comparative judgements become much easier in context of recurring decision
,,[[Noise by Daniel Kahneman]] | [[09 August 2022]],,
* Noise reduction strategies can be costly, but much of their costs are merely and excuse and not a sufficient reasons to tolerate the unfairness and costs of noise - the solution is not to abandon noise reduction efforts but to come up with better ones
* Noise reduction could be costly - like teachers grading students - which can be reduced by aggregating results of multiple teachers - which is costly
* There are rules and [[Algorithm]]s that are biased - but people have biases too. Algorithm's lose credibility due to
** Being trained on biased data
** Trained where the predictors are correlated with disparate classes
** For example, [[COMPAS]] - an algorithm widely used in [[Recidivism]] risk assessments - is strongly biased against the members of racial minorities
,,[[Noise by Daniel Kahneman]] | [[12 August 2022]],,
* People like to be treated with individuality. They value and need face to face interactions, which inevitably produces noise. But human [[Dignity]] is priceless
* If some rules end up being too rigid, people may not follow them - which would in turn create more noise
* The uncertainty of punishment is also a deterrent. If the expected value of punishment = 50% chance of 5000 punishment vs 100% chance of 2500 punishment
** Risk averse people might be more deterred by $5000 fine than risk seeking people
** To know whether noisy system imposes more deterrence, we need to know whether potential wrongdoers are risk-averse or risk-seeking
,,[[Noise by Daniel Kahneman]] | [[12 August 2022]],,
!! Rules vs Standards
* ''Rules ''are meant to eliminate discretion by those who apply them. ''Standards ''are meant to grant such discretion. Whenever rules are in place, noise out to be severely reduced
* Rules have an important feature - they reduce the role of judgement, however, getting noise reducing rules is difficult for diverse people to agree on, thus standards are put in place
* Those who devise standards effectively export decision making authority to others. They delegate power
* [[Algorithm]]s work as rules not standards
* [[Bureaucratic justice]] - effort to eliminate noisy judgments in law. if rules produce terrible results in particular cases, judges might simply ignore them and the noise will re-emerge. [[Jury Nullification]] refers to jury not following the law on that ground that is senselessly rigid and harsh
!! Framework
Choice between rules and standards depends on just two factors
* ''The costs of decisions'' - With rules - the cost of decision is often much lower. But before the rule is put in place someone has to figure it out, so producing a rule can he hard and costly.
* ''The costs of Errors'' - A rule might lead to only a few mistakes, but if they are catastrophic, a standard might be required
* Whenever numerous decisions must be made, there might well be a lot of noise, and there is a strong argument for clear rules
* The law should do much more to reduce the costs. It should combat that unfairness
,,[[Noise by Daniel Kahneman]] | [[12 August 2022]],,
* data does not belong [[parameteric]] distribution like normal distribution describe by parameters mean and variance $$\mathcal{N} = (\mu, \sigma^2)$$
* or belongs to a distribution which is unknown
!!! Code
```python
a = np.arange(10)
np.where(a<5, a, a*10)
```
!!! Psuedo-code
```sql
np.where(condition, value if true, value if false)
```
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/6oXedk2tGfk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[NumPy]] ravel function - Returns flattened array having same type as the Input array and and order as per choice.
```python
import mumpy as np
array = np.arange(15).reshape(3, 5)
print("ravel() : ", array.ravel())
print("Reshaping array : ", array.reshape(-1))
```
!!! output
```python
array.reshape(-1) == array.ravel()
```
!! References
* [[numpy.ravel() in Python|https://www.geeksforgeeks.org/numpy-ravel-python/]]
Given two explanations for something, the explanation most likely to be correct is the simplest one—the one that makes fewer assumptions.
!! PLotting OHLC Bars/Candlesticks
```python
# plotting bars
master_df['datetime_formatted'] = pd.to_datetime(master_df['datetime']).dt.strftime('%H:%M %m-%d-%Y')
master_df['pivot_text'] = np.nan
master_df['pivot_text'][master_df.SMALL_PIVOTS == -1] = 'SPL'
master_df['pivot_text'][master_df.SMALL_PIVOTS == 1] = 'SPH'
master_df['pivot_y'] = (master_df.low + master_df.high)/2
master_df['pivot_y'][master_df.SMALL_PIVOTS == -1] = master_df.low - 30
master_df['pivot_y'][master_df.SMALL_PIVOTS == 1] = master_df.high + 25
print(master_df.head())
plot_df = master_df.copy()
# plot candlestick chart
fig = go.Figure(data=[
go.Ohlc(
x=plot_df['datetime_formatted'],
open=plot_df['open'],
high=plot_df['high'],
low=plot_df['low'],
close=plot_df['close'],
increasing_line_color='rgb(46, 204, 113)',
decreasing_line_color='rgb(231, 76, 60)', name='OHLC'),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.pivot_y,
mode="text",
name="Small Pivots",
text=plot_df.pivot_text,
textposition="middle center",
textfont=dict(size=12)
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.low - 12,
mode="text",
name="SPL Bars",
text=plot_df.SPL_bars,
textposition="middle center",
textfont=dict(size=10, color='rgb(254, 202, 87)'),
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.high + 10,
mode="text",
name="SPH Bars",
text=plot_df.SPH_bars,
textposition="middle center",
textfont=dict(size=10, color='rgb(10, 189, 227)'),
)
])
fig.update_layout(xaxis_rangeslider_visible=False,
margin=dict(l=50, r=0, b=100, t=100, pad=0),
height=900,
template='plotly_dark',
title='Markings NIFTY 50 DEC FUTURES',
paper_bgcolor='black',
plot_bgcolor='black'
# paper_bgcolor='rgb(48, 57, 82)',
# plot_bgcolor='rgb(48, 57, 82)'
)
fig.update_xaxes(type='category', gridcolor='rgba(255, 255, 255, 0.1)', color='rgb(127, 140, 141)')
fig.update_yaxes(gridcolor='rgba(255, 255, 255, 0.1)', color='rgb(127, 140, 141)')
pio.write_image(fig, 'markings_2000.svg', width=1920*5, height=1080*2, format='svg')
fig.show()
```
!! Output
<img src='https://lh3.googleusercontent.com/78Icrq0BoOqEJB0U-B6TzdfWqKKc7g1IfS4MTGtN4S8S2sc5z7vYtJOYssHGx2uI8EBFjJamFns98rmXiUWHqHPHSfNtTFLpLS4b6nOWJ7378tBw-7HAYfx6hr0ht5arPsy7GxCQtv85Y8fttjef4QiP9csbQSQ0-8AOiZmQdeTYOqXZ2h07XqV90Dg1SVF3y-aDLiXhm8t22RCucHjHusUE0oXiXbvu3Xnn845eJCAFpi8jEVotEzS1q6XyFFGkN68q5IAZBMDxPOaHUOi_6unkHyNv2JLwCVf44-pRKLynY1iSGD7HGBdKFu9k4zi41T9bOYrDMAUc695cDevOlneCNpApQE_td5bFwFWfaD5Ya7PJB2vKTr-KikNeFKl7uRpa8Zqz5Kh50L2eF2SSYJ3ly2fQSpG5IOPh2VieLbEJZoPDe34r7lxKmHoojivEvAiMYVT9vVo5jhyP8oKLqyCUbQQ5HgYNVQzgQyRFYgQH2UPeryN-1sGMBHQJxPrujVgTWsixR8IQg11czFZoHawfzjOKeQjQgg853CJRoyns1R_nOaxplRbPNmWYpn2g2UM1SACaGewQRDcmXvGHJRNZoIcFD1wSlTGAYIEqi8vpLya9YHgXR8mAiBtkFYJVxXo_7YFcEG47CdBTAIKsh2ECZRndl6h8EsBPsZ2wx18_Ea_j2yLt5CdfSE0ycZ0=w1723-h969-no?authuser=0' />
[[Plotly]]
Cart-Pole balancing act
<img src='https://miro.medium.com/max/1575/1*oMSg2_mKguAGKy1C64UFlw.gif' width=300>
The policy can be programmed in any way you like. It can be based on if-else rules or a neural network
```python
import gym
def policy(observation):
angle = observation[2]
if angle < 0:
return 0
else:
return 1
env = gym.make("CartPole-v1")
observation = env.reset()
for _ in range(1000):
env.render()
action = policy(observation)
observation, reward, done, info = env.step(action)
if done:
observation = env.reset()
env.close()
```
!! references
[ext[Reinforcement Learning, Part 1: A Brief Introduction|https://medium.com/ai%C2%B3-theory-practice-business/reinforcement-learning-part-1-a-brief-introduction-a53a849771cf]] on [[Medium]]
!! [[Demand Generation]] - [[Up-Sell]], [[Cross-Sell]], [[Deep Sell]]
* Direct marketing works better on some customers
** Some customers will drop their engagement after treatment
** Some customers will increase their engagement after treatment
** Some will grow with or without treatment
* Uplift modeling approach should also include unsolicited responders to identify change in probability of response
!! Applicability
* Start with full customer base and measure cohorts of spend growth/change
* Subset to targeted customers and identify customers who demonstrated same growth despite treatment
* Subset to response customers and identify customers who demonstrated same growth/change despite response
!! reference
* [[Optimal Targeting through Uplift Modeling -Whitepaper|http://www.crmxchange.com/uploadedFiles/White_Papers/PDF/Optimal_Targeting_with_Uplift_Modeling_white_paper.pdf]]
[[Uplift Modeling]]
Is a region of the brain is critical for integration signals streaming in from the body - signals that tell us the state of the body is in - hungry, nervous, excited, embarrassed, thirsty, joyful.
* variant of [[Regression]] models
* variable is [[Ordinal]]
* Considered a problem between [[Regression]] and [[Classification]]. ''Ordinal Regression = Ordinal Classification''
* Rank Ordering between the values on an arbitrary scale is significant
* In [[Machine Learning]], Ordinal Regression may also be called [[Ranking Learning]]
!! References
* [[A complete tutorial on Ordinal Regression in Python|https://analyticsindiamag.com/a-complete-tutorial-on-ordinal-regression-in-python/]]
[[05 June 2022]]
* [[Speech to Text]]
* Take Minutes of meetings
* Summarize at the end automatically
https://otter.ai/
[[AI Businesses]]
[[Psychologist]]s have studied the effect of [[outer space]] on [[astronaut]]s through interviews, surveys, and analysis of [[autobiograph]]ies. Upon returning from space, astronauts are less focused on individual achievements and personal [[happiness]] and are more concerned about collective good
,,[[Adam Grant: Think Again]] | [[14 November 2021]],,
!! Price of Stock
We as humans tend to use price as a heuristic for the things that we don't understand or know what makes that product
* ''P/E is irrelevant''
** ''hardest thing to learn''
** ''Lazy hueristic''
* $$ P = (P/E) \times E $$
* $$ \delta P = \delta (P/E) + \delta E $$
* 90 % of the companies in India does not have competitive advantage - so they can't grow earnings.
** Close to impossible to make any return on these stocks because return on capital never exceeds [[cost of capital]].
** ''Fueling a car without an engine''. Value research never works in India because most undervalued companies have shoddy financials.
** Any airlines even Indigo, have passenger growth of 20% but 0 earnings
** Volume growth driven by earnings growth
** If structural re-rating happens - P/E doubles (max 7% at best) over a decade
* Around 8-9% of the companies have competitive advantage
** For example, maruti - competitive advantage
** 6/10 - ROCE 20-30%
** 10 year cycle - earnings growth @ 12%
** P/E multiple bought at lowest and p/e doubles - making 7%. So at best 19% (but timing is never perfect)
** Has barriers to entry
* Remaining 1% of the Indian market that defies both norms
** For example, Nestle ROCE - 50%. FCF is 3x of Maruti
** Reinvestment of capital - 24-25% earnings growth
** Far sighted manager - 25% + 7% = 32% (Doesn't exist)
** Structural derating - nestle's multiple halfs. Earnings = 25% - 7% + 2% (dividend yield) = 20% (more money than investing as Warren Buffet style in Maruti)
!! Investing in India
* ROCE - WACC in India is very high and rarely found in other economies
* Free Cash Flow = Spread between [[WACC]] and [[ROCE]]
* FCF around 30% for 20-25 companies in India
* 60% Cash Flow invested - only happens in India
* Nifty earnings growth - 0%
!! Investing in Tech
* InfoEdge and TCS Maybe
* ''Problem'': Revenue growth based on global demand. ROCE is consistently high, but revenue growth is not consistent, thus unable to pass the filter. Global demand is harder number to predict
!! Reference
<iframe width="700" height="400" src="https://www.youtube.com/embed/GBq-H2m9Q7w" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* Papa's [[Aadhaar Card]] is linked to [[PAN]]
* Diksha's [[Aadhaar Card]] is linked to [[PAN]]
* Mammi's [[Aadhaar Card]] is linked to [[PAN]]
* Sumit's [[Aadhaar Card]] is linked to [[PAN]]
[ext[Check status here|https://www1.incometaxindiaefiling.gov.in/e-FilingGS/Services/AadhaarPreloginStatus.html]]
,,[[24 Jun 2020]],,
[[Pandas]] while reading files can load data in chunks.
```python
chunk_list = [] # append each chunk df here
# Each chunk is in df format
for chunk in df_chunk:
# perform data filtering
chunk_filter = chunk_preprocessing(chunk)
# Once the data filtering is done, append the chunk to list
chunk_list.append(chunk_filter)
# concat the list into dataframe
df_concat = pd.concat(chunk_list)
```
!!! Reference
* [ext[Why and How to Use Pandas with Large Data|https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c]] on [[Medium]]
Panic causes [[Perceptual Narrowing]]. It is about thinking too little. It is the opposite of [[Choking]]. Choking is about thinking too much. Choking is the loss of instinct. Panic is reversion to instinct. They may look the same but they are worlds apart
* data belongs to a distribution than can be parameterized
* [[Normal Distribution]] parameterized by mean and variance $$\mathcal{N} = (\mu, \sigma^2)$$
Introduced by Vilfred Pareto in 1790s - ''About 20% efforts generate 80% of results.''
Prisoners are more likely to be granted parole early in the day or after a break such as lunch. The likelihood is as high as 65% after a food break. But towards the end of day it remains merely 20%. This effect is called [[Ego-depletion]]
!! References
* [[Judges are more lenient after taking a break, study finds|https://www.theguardian.com/law/2011/apr/11/judges-lenient-break]] from [[Guardian]]
Apache Parquet is an open source, ''column-oriented data file format designed for efficient data storage and retrieval''. It provides efficient data compression and encoding schemes with enhanced performance to handle complex data in bulk
* Columnar storage like Apache Parquet is designed to bring efficiency compared to row-based files like CSV. When querying, columnar storage you can skip over the non-relevant data very quickly. As a result, aggregation queries are less time-consuming compared to row-oriented databases.
!! Benefits
* free and open source
* column based format - faster for aggregation
* high compression - 5-10x lower space consumed than csv
* can store both structured and unstructured data
<table>
<tr>
<td>Dataset</td>
<td>Size on Amazon S3</td>
<td>Query Run Time</td>
<td>Data Scanned</td>
<td>Cost</td>
</tr>
<tr>
<td>Data stored as CSV files</td>
<td>1 TB</td>
<td>236 seconds</td>
<td>1.15 TB</td>
<td>$5.75</td>
</tr>
<tr>
<td>Data stored in Apache Parquet Format</td>
<td>130 GB</td>
<td>6.78 seconds</td>
<td>2.51 GB</td>
<td>$0.01</td>
</tr>
<tr>
<td>Savings</td>
<td>87% less when using Parquet</td>
<td>34x faster</td>
<td>99% less data scanned</td>
<td>99.7% savings</td>
</tr>
</table>
!! Loading in Python
```python
import pandas as pd
train = pd.read_parquet(r'train_data.parquet')
test = pd.read_parquet(r'test_data.parquet')
```
!! References
* [[Parquet|https://databricks.com/glossary/what-is-parquet]] by [[Databricks]]
The partial Dependence Plot (PDP) or PD plot shows the [[Marginal Effects]] of one or two features on the predicted outcome of an [[Machine Learning]] model
* Global method - plots the average effect on features on prediction
* PDP provides a clear and causal interpretation by providing the changes in prediction due to changes in particular features
* ''Assumes'' features under the plot are not correlated with the remaining features
!! References
* Plotting PDP using [[sklearn]] - [[link|https://scikit-learn.org/stable/auto_examples/inspection/plot_partial_dependence.html#sphx-glr-auto-examples-inspection-plot-partial-dependence-py]]
''(Pattern Noise)**2 = (Stable Pattern Noise)**2 + ([[Occasion Noise]])**2''
* ''Stable Pattern Noise'': stems out of [[Personality]] and personal experiences (wisdom you have gained from past experience, errors to avoid, mental model unique to you)
* [[Occasion Noise]]: stems out of different situations (the mood, the weather)
<<<
!! Flywheel
Wallets & Payments $$\rightarrow$$ Lending $$\rightarrow$$ Money management
!! Overview
* India's biggest [[Initial Public Offering (IPO)]]
* Raising INR 18,300 Cr. pre-IPO round ~ INR 2000 Cr. Pays 10,000 Cr to existing investors cashing out their stake and 8300 Cr to Paytm's account
* Valuation about $20B- 70x of operating revenue
* [[BlackRock]] and [[Canada Pension Plan Investment Board]] are anchor investors and raised ₹8,235 Cr
* revenues stagnating but also cut expenses - losses for last 3 years since 2019 on a declining trajectory
!! Business Model
* 13% share in [[Unified Payments Interface (UPI)]] payments
* ''50% share'' in [[Peer to Merchant (P2M)]] - ''this segment matters''
** UPI doesn't make money, but can make money from [[Value added Services]] on top through [[Merchant Loans]]
** understand merchant [[Creditworthiness]] from data routed through their payment gateway
** Currently only a [[Payments Bank]], but can convert it to [[Small Finance Bank]] after 5 years of operation, according to [[Government Regulations]], which can lend money
** $700M in deposits from 60 million retail users of [[Payments Bank]]
* For individual users, 300 million users and 50 million monthly active users the opportunities is from [[Mutual Fund]]s, [[Insurance]] and [[Stock Brokers]] segment
!! Risks
* high [[Valuation]] in Stagnating [[Revenue]]s
* Loss making company
* Seems user acquisition more important than [[Profitability]]
* [[Ashwath Damodaran]] says Paytm is an adolescent with [[Attention Deficit]] issues (low focus on business details, [[Revenue]] and [[Profit]]s
<<< [[Unpacking the Paytm IPO|https://finshots.in/markets/unpacking-the-paytm-ipo/]] on [[Finshots]]
<<<
* IN 2016, Paytm had market share of about 25% of all digital transactions and [[Demonetization]] was the best thing that could have happened to Paytm
* [[Gorilla Games]] - strategy of investing in high-technology companies where the “winner takes it all” approach works (specifically for 90s companies) - the idea applies to current startups as well. As soon as it is clear which company is the gorilla, consolidate your holdings and hang on, but these candidates are never [[Undervalued]]
* Technology companies that come out with a unique proposition. They have hyper-growth periods where the offering or the product becomes sticky, and users simply cannot do without it
* Unless Paytm lends, it can’t make significant money by merely being a distributor. We, therefore, question its ability to achieve scale with profitability
* revenues were driven by 52% growth in non-UPI payment volumes (GMV) and more than three times growth in financial services and other revenues.
* Paytm is still a “wait and watch” company at the right price. But then, what is the right price? Macquarie had answered that on the day of its listing.
<<< [[Paytm: how the thousand-pound gorilla squandered its best opportunity to list in 2017|https://economictimes.indiatimes.com/prime/money-and-markets/paytm-how-the-thousand-pound-gorilla-squandered-its-best-opportunity-to-list-in-2017/primearticleshow/88016026.cms]]
!! Summary
* summarizes strength of linear relationship between two random variables
* normalized [[Covariance]]
* assumes [[Gaussian]] distritbution
* 0 means no correlation, < -0.5 & > 0.5 means notable negative or positive correlation
!! Detail
The Pearson correlation coefficient (named for Karl Pearson) can be used to ''summarize the strength of the linear relationship between two data samples''.
Pearson's correlation coefficient = `covariance(X, Y) / (stdv(X) * stdv(Y))`
<<<
The coefficient returns a value between -1 and 1 that represents the limits of correlation from a full negative correlation to a full positive correlation
* ZERO : No [[Correlation]]
* -0.5 <= or >= 0.5 : notable correlation
<<<
!!! Python
```python
from scipy.stats import pearsonr
corr, _ = pearsonr(data1, data2)
```
!! references
* [ext[How to Calculate Correlation Between Variables in Python|https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/]] from [[Machine Learning Mastery]]
,,[[18 July 2020]],,
Perceptual Bistability refers to the phenomenon of spontaneously switching between two or more interpretations of an image under continuous viewing.
<img src = 'https://ars.els-cdn.com/content/image/1-s2.0-S0960982200005534-gr1.jpg' >
!! References
* [[Kaggle]] - [[Permutation Importance on Kaggle|https://www.kaggle.com/dansbecker/permutation-importance]]
* [[sklearn]] - [[Permutation feature importance on sklearn|https://scikit-learn.org/stable/modules/permutation_importance.html]]
Pinecone is a cloud-based vector database and search service designed for [[Machine Learning]] applications. Here are three key points about Pinecone:
* Pinecone is a fast and scalable vector [[Database]] that can store and retrieve high-dimensional vectors, which are commonly used to represent data in machine learning applications.
* Pinecone's search service allows users to perform similarity searches on the vectors stored in the database, enabling them to quickly find similar items based on their vector representations.
* Pinecone is designed to be easy to use and integrates with popular machine learning frameworks and libraries, including TensorFlow, PyTorch, and [[scikit-learn]]
https://www.pinecone.io/
Coined by [[Daniel Kahneman]], Planning fallacy is underestimating the amount of time it would take to complete the task, ''even when they have done the task before''
People will admit to having a tendency to underestimate while simultaneously believing their current estimates are accurate.
Social pressure is the most interesting explanation as to why people underestimate. It implies that often we actually know we can't do things in a given time, but we don;t want to admit it to someone
Something that can be shaped and can hold that shape
Creating short books or PocketBooks on topics such as Psychology, Coursera notes, deep learning lectures, techniques, XGBoost with premium covers and illustrations and clean layout.
<hr>
[[Idea Book]]
!! Dear HBR: First-time bosses
Speaker - Emotions & Psychology of conversations
!!! Situation: Promoted to a new position & now need to manage peers - peer don't want to open up even after 1x1. Peer openly frustrated about re-org.
* [[HBR: Becoming the Boss]] - 1st thing is to do is to talk to your Direct reports. Even if that doesn't help, let them go and run with it.
* You getting the promotion over peer can result in envy which can be of two types
** malicious (tear them down)
** benign (lift yourself up)
* The new manager can open up and talk about their failures and how they dealt with them, can help DRs lift themselves up
* The intention is to be light - //I know you don't like this setup but can we work this out together//. This will help demonstrate, competence, knowledge to deal with the situation and influence to lift them up.
* Low status bosses because of their age or education level actually should be bossy, and it more effective (not my case)
[[Learnings 2022]] | [[Management Learnings 2022]]
It is a safety system designed to reduce mistakes. It reduces error by 85% and reduces accidents by 30%. It works because it raises the level of awareness from non conscious habit to conscious level
How to use:
When preparing to walk out on a trip, call out the things that are important in the packing list. That way you won’t miss them
[[07 April 2022]] | [[Atomic Habits]]
* The feeling of emptiness after you end a game
* Academic research in the field of arts and leisure calls it [[post-series depression]], or PSD.
* [[Book Hangover]] - can’t stop thinking about the fictional world that has run out of pages
all three of these phenomena stem from the same source, something called [[Parasocial Attachment]]. These attachments—to celebrities or fictional characters and worlds—form with anything that gives us comfort, safety, or solace. Our media doesn’t replace human connection, but it’s a close second, and it was the best we had during the shutdowns from the pandemic.
''To Avoid this''
* seeking out another connection to fill the entertainment gap. Watch a favorite TV show (like The Office, The Golden Girls, or Friends) or start something new on your To Watch list. Read a book. Start a new game, or replay an old favorite. Pursue whatever brings you comfort, and remember that these feelings will pass.
* Replay the same game at different difficulty - like [[God of War]] new game+
* Join communities on [[Reddit]], [[Discord]]
!! References
* https://www.wired.com/story/post-game-depression/
!! Pre Market Order
* 9:00 AM - 9:08 AM : Modify/cancel/place EQ limit & market orders
!! Post Market Order
* 3:40 PM - 4:00 PM : Buy sell orders only in EQ
* market order placed at closing price
!! After Market Orders (AMO)
* Option by Zerodha
* 3:45 PM to 8:57 AM for NSE & 3:45 to 8:59 AM for BSE for equity and up to 9:10 AM for F&O
* after-market order between 9:15 AM and 3:45 PM, they will be rejected
* After-market orders for commodity can be placed anytime during the day, orders will be sent to the exchange at 9:00 AM (MCX opening). So if you place an after market order at 8:59 it will get sent today and if you place it at 9:01 AM it’ll get sent tomorrow.
''Prefer placing a market order at opening price than AMO. Facility only for those who can't trade during market hours.''
!!! References
* [ext[Pre-market/Post-market/After-market Orders|https://zerodha.com/z-connect/queries/stock-and-fo-queries/pre-marketpost-marketafter-market-orders]]
<img src='https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Precisionrecall.svg/495px-Precisionrecall.svg.png'
>
More probable behaviours will reinforce less probable behaviours. Once such example is [[Temptation Bundling]]
* https://theinterviewguys.com/behavioral-interview-questions-and-answers-101/
* Linkedin Learning - https://www.linkedin.com/learning/expert-tips-for-answering-common-interview-questions/candidate-answer-and-feedback-9?u=82999986
!! Guidelines for past experience questions
Tell a compelling story through SAR framework - Situation Action and results
* Start the story by describing the situation - initial events, 3-4 sentences
* Actions - key milestones - active verb sentences, 2-3
* Describe the result
* steady flow of events
* speak in a compelling tone
!! References
* [[15 Signs Your Employee Is Ready to Become a Manager|https://www.inc.com/young-entrepreneur-council/15-signs-your-employee-is-ready-to-become-a-manager.html]]
* [[HBR: Becoming the Boss]]
!! Objective
To make presentations more powerful and informative by using powerful information design elements
!! Research
* ''Structure ''- As told in Presentation Dynamics
* ''[[Fonts]]''
**Typography manual -https://thefutur.com/resources/typography-manual
** Font personality - [[Thinking with Type]] and other [[Books on Typography]]
* ''Charts ''- Insights from the books like
** [[Storytelling with Data]] by Nussbaumer Knaflic
** [[The Visual Display of Quantitative Information]] by [[Edward Tufte]]
* ''General principles for graphic design''
** [[Edward Tufte]]
** [[Gestalt principles]]
* ''Elements of ''[[Psychology]] - Insights from
** [[Confessions from an Ad man]] by [[David Ogilvy]]
** [[Thinking Fast & Slow]] by [[Daniel Kahneman]]
** [[The Back of the Napkin]] by Dan Roam
* ''Presentation Delivery''
!! Resrouces
* ''Startup Pitch Decks''
** [[pitchdeckhunt.com|https://www.pitchdeckhunt.com/]] - Pitch decks from startups
** [[cirrusinsight.com|https://www.cirrusinsight.com/blog/startup-pitch-decks]] - Startup pitch decks
** [[opendeck|https://opendeck.app/]] - startup slides categorized by content (Vision, Roadmap, market etc..)
* ''Templates''
** [[pitch.com|https://pitch.com/]] - paid service
** [[visme|https://www.visme.co/templates/presentations/]] - Free and paid templates
** [[slidescarnival.com|https://www.slidescarnival.com/category/free-templates]] - Google slides templates
** [[24slides|https://24slides.com/templates/featured#]] - Powerpoint free templates
,,[[Idea Book]],,
<<<
Price action is a trading technique that allows a trader to read the market and make subjective trading decisions based on the recent and actual price movements, rather than relying solely on [[Technical Indicators]]
<<< Investopedia
!! [[MarketsWithMadan]]
* Price action analysis is a time tested strategy, used for decades - closed to pit trading
* There are no indicators, hence no 'Analysis Paralysis'
* Less confusion and simplifies trading
* Can be backtested using simple OHLC data and candlestick charts
* Can be applied across instrument classes - Stocks, F&O
* ''It has been proven that clutter free charts reduces cognitive stress for traders''
!!! References
* [ext[Price Action Trading|https://www.investopedia.com/articles/active-trading/110714/introduction-price-action-trading-strategies.asp]] on [[Investopedia]]
PCA is defined as an orthogonal linear transformation that transforms the data to a new coordinate system such that the greatest variance by some scalar projection of the data comes to lie on the first coordinate (called the first principal component), the second greatest variance on the second coordinate, and so on
<<<
The word priority can into English language in 1400s. It was singular. It meant ''very first or prior thing''. It stayed liked that for next 500 years. Only in the 1900s did we pluralize the term and start talking about ''priorities''. Illogically we reasoned that by changing the word we could bend reality. Somehow we would now be able to have multiple "first" things.
<<< [[Essentialism - The Disciplined Pursuit of Less]]
* the outcome is probability distribution over the predication instead of just point estimates
* helps gauge uncertainty of prediction
* required in [[Healthcare]] industry
* [[NGBoost]] one such algorithm
!! References
* [[https://dl.acm.org/doi/abs/10.1145/3447548.3467278]]
[[24 April 2022]]
is a long term memory that represents how to do things automatically, like riding a bicycles or tying shoelaces
```python
log_of_songs = [
"Despacito",
"Nice for what",
"No tears left to cry",
"Despacito",
"Havana",
"In my feelings",
"Nice for what",
"Despacito",
"All the stars"
]
play_count = 0
def count_plays(song_title):
global play_count
for song in log_of_songs:
if song == song_title:
play_count = play_count + 1
return play_count
count_plays("Despacito")
```
Running the function once will give an output of 3
```python
count_plays("Despacito")
```
But running it again gives output 6.
!! Problem
* How to know for sure or relatively sure that the job you are applying will be interesting and fulfilling. People switching jobs have less opportunity for internship than graduates, post-graduates.
!! Probable Solution
* Just like products are offered on trial, a small part of the job can be given externally to the individual who is a prospective employee.
* Company that partners with different companies to provide jobs externally for a month.
* A product that aggregates information from various companies, crafts a generic problem faced in such roles and gives them to individuals wanting to try something
!! Benefit
* Reducing the risk of switching current job with a worse job
* Company also benefits from this process where it is able to identify individuals who will be suitable for the roles
* Faster than [[Proof-of-work]]
* Network relies on ''stakers'', who already hold some other tokens to process new transactions
* stakers are chosen at random and they create blocks by staking some tokens using [[Smart Contract]]s
* other nodes will validate the block, known as ''attesting''
* Uses less computational power than [[Proof-of-work]] unlike ''miners'' they are competing with other miners
* Miners compete to solve the problem first and are rewarded with crypto
* Other nodes will validate the transaction
* Requires huge computational power
* It is the capacity to know the state of your muscles. Receptors in the muscles, tendons and joints provide information about the angles of joints, as well as tension and length of our muscles. It gives brain a picture of how the body is positioned to allow for fast adjustments.
* Sometimes your leg falls asleep, and you attempted to walk afterwards, that's how it feels.
<<<
People take unwarranted risks in the face of uncertain losses
<<< [[Never Split the Difference]]
* Prototypes consist of a selected set of instances that represent the data very well
* the set of instances that do not represent data well are called ''criticisms'' - have minimal distance between data points with different predictions
!!! Cons
* Determining the optimal number of prototypes and criticisms are challenging
!!! References
* [ext[Top Strategies for Mastering Pullback Trading|https://www.investopedia.com/articles/active-trading/020415/top-strategies-mastering-pullback-trading.asp]]
<<<
''Assumptions''
* Good portfolio of stocks outperforms the index most of the time
* Stocks generally move higher over a period of time
''Execution''
* Select Top 3 weighted stocks of [[BANKNIFTY]]
* Sell: 1 lot [[PUT]] each (3% away strike price)
* Buy: 3 lot [[PUT]] of [[BANKNIFTY]] (5% away strike price - same expiry as above)
* Net Credit Margin around 25k - 30k
''How it works''
* If stocks move higher, all PUTS become worthless - Keep Credit as Profit
* If stocks move sideways, all PUTS become worthless - Keep Credit as Profit
* If stocks move lower, lost money on sold PUTS, BANKNIFTY PUT moves higher to protect from big loss
* Probability of Profit : 75%
<<< https://optionsnext.com/money-in-the-bank-some-questions-answered-saturday-story/
[[Options Trading Strategies]]
''The Error''
<<<
I overwhelmed myself with data science education with the hope that my breadth of exposure would lead me to my purpose, and a better paycheck. What I didn’t realize at the time was that I had put the cart before the horse. I was so eager to learn that I spent all my time learning lots of “things” without ever stopping to ask myself; How do all of these “things” come together to solve real problems?
<<<
''The Resolution''
<<<
Being able to communicate how you leveraged some of the tools of data science to solve a problem, will take you much further in business than simply listing all the algorithms you have been exposed to in one class or another
<<<
''The Benefits''
!! Reference
* [[Stop Learning Data Science to Find Purpose and Find Purpose to Learn Data Science|https://www.kdnuggets.com/2021/12/stop-learning-data-science-find-purpose.html]] in [[KD Nuggets]]
Low code [[Machine Learning]]
[[05 February 2023]] | [[https://pycaret.org/]]
!! Installation
!!! 1. Offline
```python
!pip install findspark
import findspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local").getOrCreate()
```
!!! 2. Google Colab
* Installing Dependencies
```python
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
!wget -q https://downloads.apache.org/spark/spark-2.4.6/spark-2.4.6-bin-hadoop2.7.tgz
!tar xf spark-2.4.6-bin-hadoop2.7.tgz
!pip install -q findspark
```
* Set environment path in Colab
```python
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-2.4.6-bin-hadoop2.7"
```
* Test installation by running local spark session
```python
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
```
!! References
!!! Swapping two variables
```python
# a = 4 b = 5
a,b = b,a
```
!!! Multiple Variable Assignments
```python
a,b,*c = [1,2,3,4,5]
print(a,b,c)
> 1 2 [3,4,5]
```
!!! Creating Lists
```python
lst = list(range(0,10))
print(lst)
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
!!! Iterating multiple list in single comprehension
```python
groups = [(a, b) for a in ['a', 'b'] for b in [1, 2, 3]]
groups
> [('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3)]
```
!!! Mapping Lists or TypeCasting Whole List
```python
list(map(int,['1','2','3']))
> [1, 2, 3]
list(map(float,[1,2,3]))
> [1.0, 2.0, 3.0]
```
* [ext[25 Useful Python One-Liners That You Should know
|https://levelup.gitconnected.com/25-useful-python-one-liners-that-you-should-ec613df18260]]
PyTorch is a very powerful [[Machine Learning]] framework. Central to PyTorch are tensors, a generalization of matrices to higher ranks
!! Benefits
* Generally more pythonic than alternative frameworks
* Easier to debug
* Most-used language in machine learning research by a large and growing margin
!! Training Loop
A (basic) training step in PyTorch consists of four basic parts:
# Set all of the gradients to zero using `opt.zero_grad()`
# Calculate the loss, `loss`
# Calculate the gradients with respect to the loss using `loss.backward()`
# Update the parameters being optimized using `opt.step()`
!! Basic NN model
```python
import torch.nn as nn
import torch.optim as optim
mlp_layer = nn.Sequential(
nn.Linear(5, 2),
nn.BatchNorm1d(2),
nn.ReLU()
)
adam_opt = optim.Adam(mlp_layer.parameters(), lr=1e-1)
train_example = torch.randn(100,5) + 1
adam_opt.zero_grad()
cur_loss = torch.abs(1 - mlp_layer(train_example)).mean()
cur_loss.backward()
adam_opt.step()
```
* Graphical way to compare two [[Distribution]]s
* If the two distributions which we are comparing are exactly equal then the points on the Q-Q plot will perfectly lie on a straight line y = x.
* not ideal for smaller datasets
:<img src='https://miro.medium.com/max/640/1*_wuWDNGs3hB2K0_kgpoc1A.jpeg' width=400>
!! [[Python]] Implementation
!! Reference
* [[Q-Q Plots Explained|https://towardsdatascience.com/q-q-plots-explained-5aa8495426c0]] from [[Medium]]
* [[scipy]] implementation [[here|https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.probplot.html]]
# What initiatives are you working on future business perspective? - Top 1 or 2
# What kind of business problems that you try to solve for using AI/ML? - Top 1 or 2
# What is the next big thing that you are looking for in terms of disruption?
# India business is $46.2B in 2020 while it is $6B in UAE - You are capturing a smaller piece of global pie. Are you looking for expansions?
# Do you operate a single integrated system for your international markets as well?
!!! References
* [[Indian E-Commerce IBEF|https://www.ibef.org/industry/ecommerce.aspx]]
<<<
* “An e-commerce company is built on becoming a trusted shopping destination that delivers great experience. When you have customers coming to you again and again, that’s how you achieve consistent growth. So this is at the core of our business. We want to provide a reliable, predictable and efficient experience,” says
* A new geo-pin based address system in Saudi Arabia
<<< [[Kaushik Mukherjee|https://www.logisticsmiddleeast.com/business/31355-how-nooncom-is-doing-it-differently]]
Tags: [[OpenAI]] | [[GPT-3]] | [[19 August 2021]]
!! How to explain Machine learning to your mom?
<<<
1.
A computer is just a tool that can help us solve problems. You wouldn’t buy a pen because you wanted to write: you bought it to correct spelling mistakes, and draw on paper. Similarly, a computer is a tool that allows us to solve problems that were previously unsolvable, using the techniques of Artificial Intelligence.
2.
We start with a dataset (a pile of data) and a model (a mathematical representation of our idea of how the process works). Then, we teach the computer how to build a model from the data. From this model, it can learn on its own, and improve its performance over time.
3.
This is not magic, it’s just statistics. By putting data into a model and comparing the output to known outcomes, we can determine which inputs are good predictors of behavior. Think of it this way: if you’re looking at a group of people, and trying to figure out who likes sports, and then you see that the people who like sports also tend to have long hair, you can use that information to predict whether someone likes sports by looking at their hair length.
4.
“But what if the machine gets it wrong?” you might ask. This is something we all need to be concerned about, but it’s important to keep in mind that algorithms are designed with human beings in
<<<
!! How to explain Machine Learning to a child in 3 simple sentences
# You have a computer? Great! You have a brain? Even better!
# Your brain is like a computer, but it is not exactly like a computer. It is much more powerful.
# There are some things that your brain does naturally, without you even trying. It can recognize your whole house, and every person in it. It can remember how to get to the grocery store when there are a million different ways to get there. It can decide when something is dangerous and when something is not. All you have to do is learn what are these things that your brains does naturally. Then you can teach your computer to do them too!
!! How to explain RNN to CEOs in 3 bullet points
# The RNN is a fancy way to encode time. It's the only hidden layer neural network that is purely temporal. All other hidden layers encode space and time, but an RNN encodes time only.
# The hidden state of the RNN is a memory of what happened in the past. It's not just a pure function of the input and the previous hidden state. So it has memory of what happened before the current input. It can actually use this memory to process the current input. [This is true for all ANNs using backprop. But it's implementation details for other ANNs. Here it's a central property.]
# The hidden state of the RNN depends on the current input and the memory of what happened earlier. So you need to look at two inputs at once to understand how to update the hidden state. In other words, you need to look at inputs over time to understand how to update the hidden state.
# The network updates its internal states (hidden states, weights) using a backward pass starting from the output until it reaches the input. So you are going back in time, jumping from one time point to another, to get to the input. And you are updating the hidden states in order to compute the output at each step. This means that you can learn complex functions with multiple outputs which depend on the value of previous outputs (and possibly previous inputs).
# You can use it to do sequence processing, i
!! What are the top 5 articles I should refer to for RNN explainability and interpretability?
# A. Nguyen, T. Truong, D. Pham, T. Do, T. Ha, E. Dahl, D. Nguyen, A. Nguyen, N. Huynh, D. Tran, G. Tam, V. Cau, T. Vu, H. Chung, H. Le-Ngoc: Understanding the behavior of recurrent neural networks for cybersecurity applications . arXiv:1608.05929
# K. Cho, J. Ba, V. Gulshan, S.-H. Kim, A.-R. Sadeghi, S.-H. Choi: Understanding Recurrent Neural Networks via Variable Importance Estimation . arXiv:1509.05117
# Y. Lu, Z. Wang, X. Li: Using Visual Explanation to Guide RNN Training . arXiv:1606.07144
# H. Xu, S. Yu, S. Chen: Deep Networks with Stable Topology Can Explain More Behaviors than Neural Networks Without Stable Topology . arXiv:1607.06397
# J. Choi, M. Shin: Understanding Deep Networks via Regularization and Gradient Signals . arXiv:1511.02331
Random numbers are generated using a pseudo-random number generator. A random number generator is a mathematical function that will generate a long sequence of numbers that are random enough for general purpose use, such as in machine learning algorithms.
Random number generators require a seed to kick off the process, and it is common to use the current time in milliseconds as the default in most implementations. This is to ensure different sequences of random numbers are generated each time the code is run, by default.
!!! References
* [ext[How to Get Reproducible Results with Keras|https://machinelearningmastery.com/reproducible-results-neural-networks-keras/]]
Is a hyperparameter tuning method based on randomly selecting set of values of hyperparameters in a searchable space
* This is less computationally expensive than grid search and may converge faster than grid searchg
* Cannot control the selection process of hyperparameter values - [[Bayesian optimization]] solves this
This is a form of [[Epilepsy]] that leads to [[Paralysis]] and eventually to death.
[[01 April 2021]]
5 Learn How to Make Decisions Effectively
* One of the most important things I’ve come to understand is that most of the processes that go into everyday decision making are subconscious and more complex than is widely understood
5 Learn How to Make Decisions Effectively
* While there is no one best way to make decisions, there are some universal rules for good decision making
5 Learn How to Make Decisions Effectively
* Recognize that 1) the biggest threat to good decision making is harmful emotions, and 2) decision making is a two-step process (first learning and then deciding)
5 Learn How to Make Decisions Effectively
* Learning must come before deciding
5 Learn How to Make Decisions Effectively
* Deciding is the process of choosing which knowledge should be drawn upon—both the facts of this particular “what is” and your broader understanding of the cause-effect machinery that underlies it—and then weighing them to determine a course of action, the “what to do about it.
5 Learn How to Make Decisions Effectively
* need to weigh first-order consequences against second- and third-order consequences, and
5 Learn How to Make Decisions Effectively
* Never seize on the first available option, no matter how good it seems, before you’ve asked questions and explored
5 Learn How to Make Decisions Effectively
* For me, getting an accurate picture of reality ultimately comes down to two things: being able to synthesize accurately and knowing how to navigate levels.
5 Learn How to Make Decisions Effectively
* Synthesis is the process of converting a lot of data into an accurate picture. The quality of your synthesis will determine the quality of your decision making
5 Learn How to Make Decisions Effectively
* 1) synthesize the situation at hand, 2) synthesize the situation through time, and 3) navigate levels effectively.
5 Learn How to Make Decisions Effectively
* The key is having the higher-level perspective to make fast and accurate judgments on what the real risks are without getting bogged down in details.
5 Learn How to Make Decisions Effectively
* One of the most important decisions you can make is who you ask questions
5 Learn How to Make Decisions Effectively
* Don’t mistake opinions for facts.
5 Learn How to Make Decisions Effectively
* step back to gain perspective and sometimes defer a decision until some time passes.
5 Learn How to Make Decisions Effectively
* it is smarter to choose the great over the new.
5 Learn How to Make Decisions Effectively
* you’re running an ice cream shop and the W’s represent sales, the X’s represent customer experience ratings, the Y’s represent press and reviews, the Z’s represent staff engagement, etc
5 Learn How to Make Decisions Effectively
* Everything important in your life needs to be on a trajectory to be above the bar and headed toward excellent at an appropriate pace
5 Learn How to Make Decisions Effectively
* Understand the concept of “by-and-large” and use approximations
5 Learn How to Make Decisions Effectively
* e., into a discussion of the exceptions rather than the rule, and in the process we will lose sight of the rule
5 Learn How to Make Decisions Effectively
* Perfectionists spend too much time on little differences at the margins at the expense of the important things
5 Learn How to Make Decisions Effectively
* Slow down your thinking so you can note the criteria you are using to make your decision. 2. Write the criteria down as a principle. 3. Think about those criteria when you have an outcome to assess, and refine them before the next “one of those” comes along.
5 Learn How to Make Decisions Effectively
* the fundamentals of effective decision making are relatively simple and timeless
5 Learn How to Make Decisions Effectively
* two broad approaches to decision making: evidence/logic-based (which comes from the higher- level brain) and subconscious/emotion-based (which comes from the lower-level animal brain).
5 Learn How to Make Decisions Effectively
* Think of every decision as a bet with a probability and a reward for being right and a probability and a penalty for being wrong
5 Learn How to Make Decisions Effectively
* Raising the probability of being right is valuable no matter what your probability of being right already
5 Learn How to Make Decisions Effectively
* it pays to stress-test your thinking, even when you’re pretty sure you’re right
5 Learn How to Make Decisions Effectively
* The best choices are the ones that have more pros than cons, not those that don’t have any cons at all
5 Learn How to Make Decisions Effectively
* constantly evaluate the marginal benefit of gathering more information against the marginal cost of waiting to decide
5 Learn How to Make Decisions Effectively
* Don’t mistake possibilities for probabilities. Anything is possible. It’s the probabilities that matter
5 Learn How to Make Decisions Effectively
* Get rid of irrelevant details so that the essential things and the relationships between them stand out
5 Learn How to Make Decisions Effectively
* Any damn fool can make it complex. It takes a genius to make it simple
5 Learn How to Make Decisions Effectively
* identifying which “one of those” it is, and then applying well-thought-out principles for dealing with it
5 Learn How to Make Decisions Effectively
* Coach
5 Learn How to Make Decisions Effectively
* In case of a disagreement with others, start by seeing if you can agree on the principles that should be used to make that decision
5 Learn How to Make Decisions Effectively
* Convert your principles into algorithms and have the computer make decisions alongside you
5 Learn How to Make Decisions Effectively
* artificial intelligence” was first introduced in 1956 at a conference at Dartmouth College
5 Learn How to Make Decisions Effectively
* computer coding will become as essential as writing
5 Learn How to Make Decisions Effectively
* example, you will be able to ask what lifestyle or career you should choose given what you’re like,
5 Learn How to Make Decisions Effectively
* Be cautious about trusting AI without having deep understanding
5 Learn How to Make Decisions Effectively
* I categorize what is going on in the world of computer-aided decision making under three broad types: expert systems, mimicking, and data mining (these categories are mine and not the ones in common use in the technology world)
5 Learn How to Make Decisions Effectively
* We would do this by constantly simplifying these rules until their elegance is unmistakable.
Life Principles: Putting It All Together
* well-thought-out principles will allow you to deal with just about anything that reality throws at you
Life Principles: Putting It All Together
* Your evolutionary process can be described as a 5-Step Process for getting what you want. It
Life Principles: Putting It All Together
* consists of setting goals, identifying and not tolerating problems, diagnosing problems, coming up with designs to get around them, and then doing the tasks required
Life Principles: Putting It All Together
* Our biggest barriers for doing this well are our ego barrier and our blind spot barrier. The ego barrier is our innate desire to be capable
Life Principles: Putting It All Together
* and have others recognize us as such. The blind spot barrier is the result of our seeing things through our own subjective lenses;
Life Principles: Putting It All Together
* seeing one’s choices optimally
Life Principles: Putting It All Together
Life Principles: Putting It All Together
* My Work Principles are basically the Life Principles you just read, applied to groups
Summary and Table of Work Principles
* By great capabilities, I mean they have the abilities and skills to do their jobs excellently
Summary and Table of Work Principles
* nothing is more important or more difficult than to get the culture and the people right.
Summary and Table of Work Principles
* I started out, I would’ve said it was to have fun working with people I like. Work was a game I played with passion and I wanted to have a blast playing it with people I enjoyed and respected
Summary and Table of Work Principles
* great partnerships come from sharing common values and interests, having similar approaches to pursuing them
Summary and Table of Work Principles
* Having clear processes for resolving disagreements efficiently
Summary and Table of Work Principles
* tough love, think of Vince Lombardi, who for me personified it
Summary and Table of Work Principles
* I celebrated their marriages and the births of their children with them and mourned the losses of their loved ones. But
Summary and Table of Work Principles
* For most people, being part of a great community on a shared mission is even more rewarding than money
Summary and Table of Work Principles
* little to no correlation between one’s happiness and the amount of money one accumulates
Summary and Table of Work Principles
* Power should lie in the reasoning, not the position, of the individual
Summary and Table of Work Principles
* By radical truth, I mean not filtering one’s thoughts and one’s questions, especially the critical ones
Summary and Table of Work Principles
* By radical transparency, I mean giving most everyone the ability to see most everything
Summary and Table of Work Principles
* Radical transparency reduces harmful office politics and the risks of bad behavior
Summary and Table of Work Principles
* Idea Meritocracy = Radical Truth + Radical Transparency + Believability-Weighted Decision Making.
Summary and Table of Work Principles
* Harvard developmental psychologist Bob Kegan, who has studied Bridgewater, likes to say, in most companies people are doing two jobs: their actual job and the job of managing others’ impressions of how they’re doing their job
Summary and Table of Work Principles
* The essential difference between a culture of people with shared values (which is a great thing) and a cult (which is a terrible thing
Summary and Table of Work Principles
* the extent to which there is independent thinking. Cults demand unquestioning obedience. Thinking for yourself and challenging each other’s ideas is anti-cult behavior
Summary and Table of Work Principles
* principles are good general rules, it’s important to remember that every rule has exceptions and that no set of rules can ever substitute for common sense. Think of these principles as being like a GPS. A GPS helps you get where you’re going, but if you follow it blindly off a bridge
Summary and Table of Work Principles
* To make this easier, at Bridgewater we created a tool called the “Coach” that allows people to type in their particular issue and find the appropriate principles to help them with it.37
Summary and Table of Work Principles
* Make your passion and your work one and the same and do it with people you want to be with
To Get the Culture Right . . .
* You have to work in a culture that suits you. That’s fundamental to your happiness and your effectiveness
1 Trust in Radical Truth and Radical Transparency
* Radical truth and radical transparency are fundamental to having a real idea meritocracy
1 Trust in Radical Truth and Radical Transparency
* In an idea meritocracy, openness is a responsibility
1 Trust in Radical Truth and Radical Transparency
* Radical transparency isn’t the same as total transparency
1 Trust in Radical Truth and Radical Transparency
* So, when faced with the decision to share the hardest things, the question should not be whether to share but how
1 Trust in Radical Truth and Radical Transparency
* When weighing an exception, approach it as an expected value calculation, taking into consideration the second- and third-order consequences. Ask yourself whether the costs of making the case transparent and managing the risks of that transparency outweigh the benefits
2 Cultivate Meaningful Work and Meaningful Relationships
* To me, a meaningful relationship is one in which people care enough about each other to be there whenever someone needs support and they enjoy each other’s company so much that they can have great times together both inside and outside of work
2 Cultivate Meaningful Work and Meaningful Relationships
* because staying in a job they’re not suited to stands in the way of their personal evolution
2 Cultivate Meaningful Work and Meaningful Relationships
* I’ve made a lot of money through my work, but I see my job as much more than as a way to make money—it’s how I choose to live out my values around excellence, meaningful work, and meaningful relationships
2 Cultivate Meaningful Work and Meaningful Relationships
* Sometimes people mistake generosity for not being fair
2 Cultivate Meaningful Work and Meaningful Relationships
* Generosity is good and entitlement is bad
2 Cultivate Meaningful Work and Meaningful Relationships
* Treasure honorable people who are capable and will treat you well even when you’re not looking.
2 Cultivate Meaningful Work and Meaningful Relationships
* They are rare. Such relationships take time to build and can only be built if you treat such people well.
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Thomas Edison once said, “I have not failed. I’ve just found ten thousand ways that do not work
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Pain is a message that something is wrong and it’s an effective teacher that one shouldn’t do that wrong thing again
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* It seems to me that if you look back on yourself a year ago and aren’t shocked by how stupid you were, you haven’t learned much
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* capable people who made mistakes and are self-reflective and open to learning from them, and 2) incapable people, or capable people who aren’t able to embrace their mistakes and learn from them
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* they have been conditioned to associate mistakes with failure instead of opportunity
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* You must not let your need to be right be more important than your need to find out what’s true
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Get over “blame” and “credit” and get on with “accurate” and “inaccurate
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Observe the patterns of mistakes to see if they are products of weaknesses.
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Start by writing down your mistakes and connecting the dots between them
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Then write down your “one big challenge
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* it is why confession precedes forgiveness in many societies. Psychologists call this “hitting bottom
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* Pain + Reflection = Progress
3 Create a Culture in Which It Is Okay to Make Mistakes and Unacceptable Not to Learn from Them
* weigh the potential damage of a mistake against the benefit of incremental learning. In
4 Get and Stay in Sync
* Alignment is especially important in an idea meritocracy
4 Get and Stay in Sync
* All the senior people at Bridgewater, including me, are routinely criticized and judged by our subordinates.
4 Get and Stay in Sync
* Dispute Resolver, which lays out the paths and makes clear to everyone if they are holding on to a different point of view rather than moving it along to resolution
4 Get and Stay in Sync
* It also helps to remind people that those who change their minds are the biggest winners because they
4 Get and Stay in Sync
* learned something, whereas those who stubbornly refuse to see the truth are losers
4 Get and Stay in Sync
* Open-minded people seek to learn by asking questions
4 Get and Stay in Sync
* Being open-minded is much more important than being bright or smart. No matter how much they know, closed-minded
4 Get and Stay in Sync
* responsibility to express and a responsibility to listen.
4 Get and Stay in Sync
* parties involved should always consider the possibility that one or both of them misunderstood and do a back-and-forth so that they can get in sync. Very simple tricks—like repeating what you’re hearing someone say to make sure you’re actually getting it—can be invaluable
4 Get and Stay in Sync
* Their bad behavior doesn’t justify yours.
4 Get and Stay in Sync
* Making suggestions and questioning are not the same as criticizing, so don’t treat them as if they are. A
4 Get and Stay in Sync
* Yet I often see people react to constructive questions as if they were accusations. That is a mistake.
4 Get and Stay in Sync
* Meetings without someone clearly responsible run a high risk of being directionless and unproductive.
4 Get and Stay in Sync
* What happens when someone inexperienced offers an opinion? If you’re running the conversation, you should be weighing the potential cost in the time that it takes to explore their opinion versus the potential gain in being able to assess their thinking and gain a better understanding of what they’re like
4 Get and Stay in Sync
* Time permitting, you should work through their reasoning with them so they can understand how they might be wrong. It’s also your obligation to open-mindedly consider whether they’re right.
4 Get and Stay in Sync
* Topic slip is random drifting from topic to topic without achieving completion on any of them. One way to avoid it is by tracking the conversation on a whiteboard so that everyone can see where you are
4 Get and Stay in Sync
* The two-minute rule specifies that you have to give someone an uninterrupted two minutes to explain their thinking before jumping in with your own. This ensures that everyone has time to fully crystallize and communicate their thoughts without worrying they will be misunderstood or drowned out by a louder voice.
4 Get and Stay in Sync
* that it’s your responsibility to make sense of things and don’t move on until you do. If you’re feeling pressured, say something like “Sorry for being stupid, but I’m going to need to slow you down so I can make sense of what you’re saying.” Then ask your questions. All of them.
4 Get and Stay in Sync
* Two people who collaborate well will be about three times as effective as each of them operating independently, because each will see what the other might miss—plus they can leverage each other’s strengths while holding each other accountable to higher standards.
4 Get and Stay in Sync
* The symbiotic advantages of adding people to a group grow incrementally (2+1=4.25)
5 Believability Weight Your Decision Making
* Sometimes a person only has to sing a few bars for you to hear how well they can sing. Reasoning is the same—it often doesn’t take a lot of time to figure out if someone can do it. f
5 Believability Weight Your Decision Making
* When someone says, “I believe X,” ask them: What data are you looking at? What reasoning are you using to draw your conclusion? Dealing with raw opinions will get you and everyone else confused; understanding where they come from will help you get to the truth.
5 Believability Weight Your Decision Making
* It is far better to weight the opinions of more capable decision makers more heavily than those of less capable decision makers. This is what we mean by “believability weighting
5 Believability Weight Your Decision Making
* The most believable opinions are those of people who 1) have repeatedly and successfully accomplished the thing in question, and 2) have demonstrated that they can logically explain the cause-effect relationships behind their conclusions
5 Believability Weight Your Decision Making
* Treating all people equally is more likely to lead away from truth than toward it. But at the same time, all views should be considered in an open-minded way
5 Believability Weight Your Decision Making
* Remember that believable opinions are most likely to come from people 1) who have successfully accomplished the thing in question at least three times, and 2) who have great explanations of the cause-effect relationships that lead them to their conclusions
5 Believability Weight Your Decision Making
* A suggestion should be called a suggestion; a firmly held conviction should be presented as such
5 Believability Weight Your Decision Making
* Think about whether the person you’re disagreeing with is more or less believable than you. If you are less believable, you are more of a student and should be more open-minded, primarily asking questions in order to understand the logic of the person who probably knows more. If you’re more believable, your role is more of a teacher, primarily conveying your understanding and answering questions. And if you are approximate peers, you should have a thoughtful exchange as equals
5 Believability Weight Your Decision Making
* our protocol is for the student to be open-minded first
5 Believability Weight Your Decision Making
* If someone asks you a question, think first whether you’re the right person to answer it. If you’re not believable, you probably shouldn’t have an opinion about what they’re asking, let alone share it.
5 Believability Weight Your Decision Making
* Be especially skeptical of statements that begin with “I think that I . . .” since most people can’t accurately assess themselves.
5 Believability Weight Your Decision Making
* Generally speaking, it’s best to choose three believable people who care a lot about achieving the best outcome and who are willing to openly disagree with each other and have their reasoning probed
5 Believability Weight Your Decision Making
* Its ideal size depends on the amount of time available, how important the decision
5 Believability Weight Your Decision Making
* As a guide, the most relevant people to probe are your managers, direct reports, and/or agreed experts
5 Believability Weight Your Decision Making
* Don’t hold opinions about things you don’t know anything about.
6 Recognize How to Get Beyond Disagreements
* Whenever there is a dispute, both parties are required to have equal levels of integrity, to be open-minded and assertive, and to be equally considerate
6 Recognize How to Get Beyond Disagreements
* the Responsible Party being challenged has a vision, and the decision being disputed involves a small detail of that overall vision, the decision needs to be debated and evaluated within the context of that larger vision.
6 Recognize How to Get Beyond Disagreements
* This phenomenon is called the narcissism of small differences. Take the Protestants and Catholics. Though both are followers of Christ, some of them have been fighting for hundreds of years, even though many of them are unable to articulate the differences that divide them
6 Recognize How to Get Beyond Disagreements
* it is of course okay to continue to disagree on some things as long as you don’t keep fighting, thereby undermining the idea meritocracy
To Get the People Right . . .
* Remember That the WHO Is More Important than the WHAT. Anyone who runs a successful organization will tell you the same.
To Get the People Right . . .
* I believe that the ability to objectively self-assess, including one’s own weaknesses, is the most influential factor in whether a person succeeds
7 Remember That the WHO Is More Important than the WHAT
* When you know what you need in a person to do the job well and you know what the person you’re putting into it is like, you can pretty well visualize how things will go
7 Remember That the WHO Is More Important than the WHAT
* My ultimate goal is to create a machine that works so well that I can just sit back and watch beauty happen.
7 Remember That the WHO Is More Important than the WHAT
* The ability to see and value goals is largely innate, though it improves with experience
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Eventually we learned from our mistakes and failures that we could improve our hiring results in two ways: 1) by always being crisp and clear on exactly what kind of person we were looking for, and 2) by developing our vocabulary for and means of evaluating people’s abilities at a much more granular level
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* people we work with are considerate and have a high sense of personal accountability to do the difficult, right things. We look for people with generous natures and high standards of fairness
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* whenever you think you are ready to make someone an offer, think one last time about the important things that might go wrong and what else you can do to better assess those risks and raise your probability of being right.
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Values are the deep-seated beliefs that motivate behaviors and determine people’s compatibilities with each other. People will fight for their values, and they are likely to fight with people who don’t share them
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Skills are learned tools, such as being able to speak a foreign language or write computer code. While values and abilities are unlikely to change much, most skills can be acquired in a limited amount of time
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* people make the mistake of choosing skills and abilities first and overlooking values. We value people most who have what I call the three C’s: character, common sense, and creativity.
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Organizations typically hire people by having job candidates’ resumes reviewed by semi-random people based on semi-random criteria, which leads them to invite in candidates to have semi-random groups of people ask the candidates semi-random questions and then make their choices of whom to offer jobs based on the consensus of how they liked them
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* they have demonstrated themselves to be extraordinary in some way. The most obvious demonstration is outstanding performance within an outstanding peer group
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* One way you can tell how well a talented rookie will do relative to a proven star is to get them into a debate with each other and see how well they each hold up
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* impractical idealists are dangerous and destructive, whereas practical idealists make the world a better place. To be practical one needs to be a realist—to know where people’s interests lie and how to design machines that produce results
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* The person who is capable but doesn’t have good character is generally destructive, because he or she has the cleverness to do you harm and will certainly erode the culture
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Don’t hire people just to fit the first job they will do; hire people you want to share your life with
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Look at what people in comparable jobs with comparable experience and credentials make, add some small premium over that, and build in bonuses or other incentives so they will be motivated to knock the cover off the ball. Never pay based on the job title alone.
8 Hire Right, Because the Penalties for Hiring Wrong Are Huge
* Most importantly, you have to encourage people to speak up about how things are going for them. Ensuring
9 Constantly Train, Test, Evaluate, and Sort People
* part in an employee’s personal evolution begins with a frank assessment of their strengths and weaknesses, followed by a plan for how their weaknesses can be mitigated either through training or by switching to a different job that taps into their strengths and preferences
9 Constantly Train, Test, Evaluate, and Sort People
* Feedback should reflect what is succeeding and what is not in proportion to the actual situation, rather than in an attempt to balance compliments and criticisms
9 Constantly Train, Test, Evaluate, and Sort People
* What might seem kind but isn’t accurate is harmful to the person and often to others in the organization as well.
9 Constantly Train, Test, Evaluate, and Sort People
* Psychologists have shown that the most powerful personal transformations come from experiencing the pain from mistakes that a person never wants to have again—known as “hitting bottom.” So don’t be hesitant to give people those experiences or have them yourself
9 Constantly Train, Test, Evaluate, and Sort People
* any one event has many different possible explanations, whereas a pattern of behavior can tell you a lot about root causes.
9 Constantly Train, Test, Evaluate, and Sort People
* At Bridgewater, we call this “paying more attention to the swing than the shot
9 Constantly Train, Test, Evaluate, and Sort People
* love the people you shoot”—do it with consideration and in a way that helps them
9 Constantly Train, Test, Evaluate, and Sort People
* An informal conversation to see if someone is interested is fine, but there should be no active recruiting prior to getting in sync with the existing manager. The
9 Constantly Train, Test, Evaluate, and Sort People
* Have people “complete their swings” before moving on to new roles. There
9 Constantly Train, Test, Evaluate, and Sort People
* Tough love is both the hardest and the most important type of love to give
To Build and Evolve Your Machine . . .
* 1) identifying our goals, 2) encountering our problems; 3) diagnosing those problems to get at their root causes; 4) designing changes to get around the problems; and 5) doing what is needed. Think of any organization you know and you will see that they go through this evolutionary process with varying degrees of success
10 Manage as Someone Operating a Machine to Achieve a Goal
* Higher-level thinking isn’t something that’s done by higher-level beings. It’s simply seeing things from the top down. Think of it as looking at a photo of yourself and the world around you from outer space
10 Manage as Someone Operating a Machine to Achieve a Goal
* Great managers are not philosophers, entertainers, doers, or artists. They are engineers. They see their organizations as machines and work assiduously to maintain and improve them
10 Manage as Someone Operating a Machine to Achieve a Goal
* Don’t get distracted by shiny objects. No matter how complete any project or plan, there will always be things that come out of nowhere and look like the most important or urgent or attractive thing to focus on
10 Manage as Someone Operating a Machine to Achieve a Goal
* Everything is a case study. Think about what type of case it is and what principles apply to that type of case. By
10 Manage as Someone Operating a Machine to Achieve a Goal
* If you are in a rush to determine what to do and you have to tell the person who works for you what to do, make sure to explain what you are doing and why.
10 Manage as Someone Operating a Machine to Achieve a Goal
* Great managers orchestrate rather than do. Like the conductor of an orchestra, they do not play an instrument, but direct their people so that they play beautifully together. Micromanaging, in contrast, is telling the people who work for you exactly what tasks to do or doing their tasks for them
10 Manage as Someone Operating a Machine to Achieve a Goal
* The better your track record, the more value you can add as a coach.
10 Manage as Someone Operating a Machine to Achieve a Goal
* If you keep getting bogged down in details, you either have a problem with managing or training, or you have the wrong people doing the job. The real sign of a master manager is that he doesn’t have to do practically anything. Managers should view the need to get involved in the nitty-gritty as a bad sign
10 Manage as Someone Operating a Machine to Achieve a Goal
* Probe your key people and urge them to bring up anything that might be bothering them. These problems might be ones you are unaware of, or they may be misunderstood by the person raising them. Whatever the case, it is essential that they be brought out into the open.
10 Manage as Someone Operating a Machine to Achieve a Goal
* While that might sound obvious, people often fail to stick to their own responsibilities. Even senior people in organizations sometimes act like young kids just learning to play soccer, running after the ball in an effort to help but forgetting what position they are supposed to play. This can undermine rather than improve performance.
10 Manage as Someone Operating a Machine to Achieve a Goal
* Watch out for “job slip.” Job slip is when a job changes without being explicitly thought through and agreed to, generally because of changing circumstances or a temporary necessity
10 Manage as Someone Operating a Machine to Achieve a Goal
* Probing shouldn’t just come from the top down. The people who work for you should constantly challenge you, so that you can become as good as you can be. In doing so, they will understand that they are just as responsible for finding solutions as you are. It’s much easier for people to remain spectators than to become players
10 Manage as Someone Operating a Machine to Achieve a Goal
* you don’t want to get distracted by gossip, you have to be able to get a quick download from the appropriate people
10 Manage as Someone Operating a Machine to Achieve a Goal
* I ask each person who reports to me to take about ten to fifteen minutes to write a brief description of what they did that day, the issues pertaining to them, and their reflections
10 Manage as Someone Operating a Machine to Achieve a Goal
* Don’t assume that people’s answers are correct. People’s answers could be erroneous theories or spin, so you need to occasionally double-check them, especially when they sound questionable. Some managers are reluctant to do this, feeling it is the equivalent of saying they don’t trust their people. These managers need to understand that this process is how trust is earned or lost. Your people will learn to be much more accurate in what they tell you if they understand this—and you will learn who you can rely on.
10 Manage as Someone Operating a Machine to Achieve a Goal
* listen for the anonymous “we” as a cue that someone is likely depersonalizing a mistake.
10 Manage as Someone Operating a Machine to Achieve a Goal
* Welcome probing. It’s important to welcome probing of yourself because no one can see themselves objectively
10 Manage as Someone Operating a Machine to Achieve a Goal
* Pull all suspicious threads. It’s worth pulling all suspicious threads because: 1) Small negative situations can be symptomatic of serious underlying problems; 2) Resolving small differences of perception may prevent more serious divergence of views; and 3) In trying to create a culture that values excellence, constantly reinforcing the need to point out and stare at problems—no matter how small—is essential (otherwise you risk setting an example of tolerating mediocrity).
10 Manage as Someone Operating a Machine to Achieve a Goal
* You must stretch yourself if you want to get strong. You and your people must act with each other like trainers in gyms in order to keep each other fit.
10 Manage as Someone Operating a Machine to Achieve a Goal
* Every key person should have at least one person who can replace him or her.
10 Manage as Someone Operating a Machine to Achieve a Goal
* Giving in not only compromises your values, it telegraphs that the rules of the game have changed and opens you up to more of the same
10 Manage as Someone Operating a Machine to Achieve a Goal
* One thing that leaders should not do, in my opinion, is be manipulative
10 Manage as Someone Operating a Machine to Achieve a Goal
* Always seek the advice of wise others and let those who are better than you take the lead
10 Manage as Someone Operating a Machine to Achieve a Goal
* Just worry about making the best decisions possible, recognizing that no matter what you do, most everyone will think you’re doing something—or many things—wrong. It is human nature for people to want you to believe their own opinions and to get angry at you if you don’t,
10 Manage as Someone Operating a Machine to Achieve a Goal
* So, if you’re leading well, you shouldn’t be surprised if people disagree with you
10 Manage as Someone Operating a Machine to Achieve a Goal
* When you are the only one thinking, the results will suffer.
10 Manage as Someone Operating a Machine to Achieve a Goal
* Authoritarian managers don’t develop their subordinates, which means those who report to them stay dependent
10 Manage as Someone Operating a Machine to Achieve a Goal
* If you didn’t make an expectation clear, you can’t hold people accountable for it not being fulfilled. Don’t assume that something was implicitly understood. Common sense isn’t actually all that common—be explicit
10 Manage as Someone Operating a Machine to Achieve a Goal
* This occurs when a manager is pulled down to doing the tasks of a subordinate without acknowledging the problem
10 Manage as Someone Operating a Machine to Achieve a Goal
* Watch out for the unfocused and unproductive “theoretical should.” A “theoretical should” occurs when people assume that others or themselves should be able to do something when they don’t actually know whether they can (as in “Sally should be able to do X, Y, Z
10 Manage as Someone Operating a Machine to Achieve a Goal
* A similar problem occurs when people discuss how to solve a problem by saying something vague and depersonalized like “We should do X, Y, Z.”
10 Manage as Someone Operating a Machine to Achieve a Goal
* Goals, tasks, and assigned responsibilities should be reviewed at department meetings at least once a quarter, perhaps as often as once a month.
10 Manage as Someone Operating a Machine to Achieve a Goal
* By asking them to “tell the story” of how we got here, or by telling the story yourself, you highlight important items that were done well or poorly in relation to their consequences
10 Manage as Someone Operating a Machine to Achieve a Goal
* Escalating means saying you don’t believe you can successfully handle a situation and that you are passing the Responsible Party job to someone else
10 Manage as Someone Operating a Machine to Achieve a Goal
* It’s critical that escalation not be seen as a failure but as a responsibility
10 Manage as Someone Operating a Machine to Achieve a Goal
* There is no greater failure than to fail to escalate a responsibility you cannot handle. Make sure your people are proactive; demand that they speak up when they can’t meet agreed-upon deliverables or deadlines
11 Perceive and Don’t Tolerate Problems
* Problems are like coal thrown into a locomotive engine because burning them up—inventing and implementing solutions for them—propels us forward. Every problem you find is an opportunity to improve your machine
11 Perceive and Don’t Tolerate Problems
* If you’re not worried, you need to worry—and if you’re worried, you don’t need to worry
11 Perceive and Don’t Tolerate Problems
* That’s because worrying about what can go wrong will protect you and not worrying about what will go wrong will leave you exposed.
11 Perceive and Don’t Tolerate Problems
* Frog in the Boiling Water Syndrome.” Apparently, if you throw a frog into a pot of boiling water it will jump out immediately, but if you put it in room-temperature water and gradually bring it to a boil, it will stay in the pot until it dies
11 Perceive and Don’t Tolerate Problems
* People have a strong tendency to slowly get used to unacceptable things that would shock them if they saw them with fresh eyes.
11 Perceive and Don’t Tolerate Problems
* Beware of group-think: The fact that no one seems concerned doesn’t mean nothing is wrong
11 Perceive and Don’t Tolerate Problems
* Have as many eyes looking for problems as possible
11 Perceive and Don’t Tolerate Problems
* Things don’t just happen by themselves—they happen because specific people did or didn’t do specific things. Don’t undermine personal accountability with vagueness
11 Perceive and Don’t Tolerate Problems
* There is no easier alternative than bringing problems to the surface and putting them in the hands of good problem solvers
12 Diagnose Problems to Get at Their Root Causes
* To diagnose well, ask the following questions: 1. Is the outcome good or bad? 2. Who is responsible for the outcome? 3. If the outcome is bad, is the Responsible Party incapable and/or is the design bad?
12 Diagnose Problems to Get at Their Root Causes
* Once you’ve established the mental map the key question is: Did the machine work as it should have? Yes or no. If not, what didn’t go as it should have? What broke? This is called the proximate cause and this step should be easy to get to if you laid out the mental
12 Diagnose Problems to Get at Their Root Causes
* i. Keep in mind that managers usually fail or fall short of their goals for one (or more) of five reasons. 1
12 Diagnose Problems to Get at Their Root Causes
* They are too distant. 2. They have problems perceiving bad quality. 3. They have lost sight of how bad things have become because they have gotten used to it. 4. They have such high pride in their work (or such large egos) that they can’t bear to admit they are unable to solve their own problems. 5. They fear adverse consequences from admitting failure.
12 Diagnose Problems to Get at Their Root Causes
* The most common mistake I see people make is dealing with their problems as one-offs rather than using them to diagnose how their machine is working so that they can improve
12 Diagnose Problems to Get at Their Root Causes
* The second most common mistake people make is to depersonalize the diagnosis
12 Diagnose Problems to Get at Their Root Causes
* The third biggest reason for failure is to not connect what one is learning in one diagnosis to what was learned in prior ones
12 Diagnose Problems to Get at Their Root Causes
* You should be able to crystallize your mental map in just a few statements, each connected to a specific person.
12 Diagnose Problems to Get at Their Root Causes
* map clearly. You can do this via yes/no questions as well because it should just require referring back to the key components of your mental map and pinpointing which the RP or RPs didn’t do well.
12 Diagnose Problems to Get at Their Root Causes
* Try to tie the failure to the 5-Step Process
12 Diagnose Problems to Get at Their Root Causes
* Importantly, ask yourself this question: If X attribute is done well next time
12 Diagnose Problems to Get at Their Root Causes
* Evaluate the merits of a past decision based not on what you know now but only on what you could have reasonably known at the time the decision was made
12 Diagnose Problems to Get at Their Root Causes
* the litmus test for a good problem solver is 1) they are able to logically describe how to handle the problem and 2) they have successfully solved similar problems in the past.
12 Diagnose Problems to Get at Their Root Causes
* Remember that a root cause is not an action but a reason. Root causes are described in adjectives, not verbs, so keep asking “why” to get at them
12 Diagnose Problems to Get at Their Root Causes
* Drill-downs are not diagnoses, but a form of broad and deep probing. They’re not intended to uncover the causes of every problem: only the 20 or so percent of causes that produce 80 percent of the suboptimal effects
12 Diagnose Problems to Get at Their Root Causes
* You must distinguish proximate causes from root causes. Proximate causes are the reasons or actions that led to the problem
13 Design Improvements to Your Machine to Get Around Your Problems
* not tolerating problems, the logical detective who doesn’t mind probing people should be the diagnoser, the imaginative designer should craft the plan to make the improvements, and the reliable taskmaster should make sure the plan gets executed. Of course, some people can do more than one of these things—generally people do two or three well. Virtually nobody can do them all well. A team should consist of people with all of these abilities and they should know who is responsible for which steps. e
13 Design Improvements to Your Machine to Get Around Your Problems
* pain they cause me to stimulate my creative thinking.
13 Design Improvements to Your Machine to Get Around Your Problems
* co-CEO David McCormick
13 Design Improvements to Your Machine to Get Around Your Problems
* “Quality Day,” biannual meetings in which members of the Client Service Department would review each other’s mock presentations and memos and give direct feedback on what was good and what wasn’t. More importantly, the meetings were a chance to step back and assess whether the ways of ensuring quality were working as expected—by bringing in a bunch of tough, independent thinkers to offer criticism and get the process realigned on what good looks like.
13 Design Improvements to Your Machine to Get Around Your Problems
* you often have to design based on anticipated problems as opposed to actual ones. That’s why having systematic ways of tracking issues (the Issue Log) and what people are like (the Dot Collector) is so useful
13 Design Improvements to Your Machine to Get Around Your Problems
* It typically takes about twice as long to build a machine as it does to resolve the task at hand, but it pays off many times over because the learning and efficiency compound into the future.
13 Design Improvements to Your Machine to Get Around Your Problems
* if you asked me if I’d like to not have rainy days, I probably would say yes if I didn’t consider the second- and third-order consequences
13 Design Improvements to Your Machine to Get Around Your Problems
* Design in such a way that you produce good results even when people make mistakes.
13 Design Improvements to Your Machine to Get Around Your Problems
* it tends to be true that people are happier with nothing at all than with something imperfect, even though it would be more logical to have the imperfect thing
13 Design Improvements to Your Machine to Get Around Your Problems
* cleansing storm.” In nature, cleansing storms are big infrequent events that clear out all the overgrowth that’s accumulated during good times
13 Design Improvements to Your Machine to Get Around Your Problems
* An organization is the opposite of a building: Its foundation is at the top, so make sure you hire managers before you hire their reports. Managers can help design the machine and choose the people who complement it
13 Design Improvements to Your Machine to Get Around Your Problems
* the big-picture visionary should be responsible for goal setting, the taste tester should be assigned the job of identifying and
13 Design Improvements to Your Machine to Get Around Your Problems
* succession pipeline” in which the next generation of leaders is exposed to the thinking and decision making of the current leaders so they can both learn and be tested.
13 Design Improvements to Your Machine to Get Around Your Problems
* visualizing your replacement is an enlightening and productive experience
13 Design Improvements to Your Machine to Get Around Your Problems
* Use “double-do” rather than “double-check” to make sure mission-critical tasks are done correctly. Double-checking has a much higher rate of errors than double-doing, which is having two different people do the same task so that they produce two independent answers. This not only ensures better answers but will allow you to see the differences in people’s performance and abilities. I use double-do’s in critical areas such as finance, where large amounts of money are at risk.
13 Design Improvements to Your Machine to Get Around Your Problems
* Use consultants wisely and watch out for consultant addiction
13 Design Improvements to Your Machine to Get Around Your Problems
* If a position is part-time and requires highly specialized knowledge, I would prefer to have it done by consultants or outsiders
13 Design Improvements to Your Machine to Get Around Your Problems
* you are careful not to ask consultants to do things that they don’t normally do
13 Design Improvements to Your Machine to Get Around Your Problems
* A good guardrail typically takes the form of a team member whose strengths compensate for the weaknesses of the team member who needs to be guardrailed. A good guardrailing relationship should be firm without being overly rigid. Ideally, it should work like two people dancing
13 Design Improvements to Your Machine to Get Around Your Problems
* People often tell me they can’t deal with the longer-term strategic issues because they have too many pressing issues they need to solve right away. But rushing into ad hoc solutions while kicking the proverbial can down the road is a “path to slaughter
13 Design Improvements to Your Machine to Get Around Your Problems
* When offered the choice of being fair with you or taking more for themselves, most people will take more for themselves.
13 Design Improvements to Your Machine to Get Around Your Problems
* auditing procedures should not be made known to those being audited. (This is one of our few exceptions to radical transparency.)
13 Design Improvements to Your Machine to Get Around Your Problems
* Use “public hangings” to deter bad behavior. No
13 Design Improvements to Your Machine to Get Around Your Problems
* Dual reporting causes confusion, complicates prioritization, diminishes focus on clear goals, and muddies the lines of supervision and accountability—especially when the supervisors are in two different departments
13 Design Improvements to Your Machine to Get Around Your Problems
* about 50:1 leverage, meaning that for every hour I spend with each person who works for me, they spend about fifty hours working to move the project along
13 Design Improvements to Your Machine to Get Around Your Problems
* I am always eager to find people who can do things nearly as well as (and ideally better than) I can so that I can maximize my output per hour.
13 Design Improvements to Your Machine to Get Around Your Problems
* Remember that almost everything will take more time and cost more money than you expect
13 Design Improvements to Your Machine to Get Around Your Problems
* Virtually nothing goes according to plan because one doesn’t plan for the things that go wrong. I personally assume things will take about one and a half times as long and cost about one and a half times as much because that’s what I’ve typically experienced
14 Do What You Set Out to Do
* ten thousand Bridgewater Daily Observations that we’d published
14 Do What You Set Out to Do
* Why do others work so hard to achieve their goals?
14 Do What You Set Out to Do
* For me, the main reason is that I can visualize the results of pushing through so intensely that I experience the thrill of success even while I’m still struggling to achieve it. Similarly, I can visualize the tragic results of not pushing through. I am also motivated by a sense of responsibility; I have a hard time letting people I care about down. But that’s just what’s true for me. Others describe their motivation as attachment to the community and its mission. Some do it for approval and some do it for financial rewards. All these are perfectly acceptable motivations and should be used and harmonized in a way consistent with the culture
14 Do What You Set Out to Do
* While there might be more glamour in coming up with the brilliant new ideas, most of success comes from doing the mundane and often distasteful stuff, like identifying and dealing with problems and pushing hard over a long time
14 Do What You Set Out to Do
* If you’re not excited about the goal that you’re working for, stop working for it
14 Do What You Set Out to Do
* The excitement of visualizing these ideas and my desire to build them out is what pulls me through the thorny realities of life to make my dreams happen.
14 Do What You Set Out to Do
* The time you spend on thinking through your plan will be virtually nothing in relation to the amount of time that will be spent doing, and it will make the doing radically more effective
14 Do What You Set Out to Do
* 1) having fewer things to do by prioritizing and saying no, 2) finding the right people to delegate to, and 3) improving your productivity.
14 Do What You Set Out to Do
* Winston Churchill hit the nail on the head when he said, “Success consists of going from failure to failure without loss of enthusiasm
14 Do What You Set Out to Do
* There’s nothing you can’t accomplish if you think creatively and have the character to do the difficult things
14 Do What You Set Out to Do
* Don’t confuse checklists with personal responsibility
15 Use Tools and Protocols to Shape How Work Is Done
* Just as you can’t learn many things by reading a book (how to ride a bike, speak a language, etc.), it’s nearly impossible to change a behavior without practicing
15 Use Tools and Protocols to Shape How Work Is Done
* experiential learning is so much more powerful
15 Use Tools and Protocols to Shape How Work Is Done
* tape virtually all our meetings, we have been able to create virtual learning case studies that allow everyone to participate without actually being in the room.
16 And for Heaven’s Sake, Don’t Overlook Governance!
* Governance is the oversight system that removes the people and the processes if they aren’t working well. It is the process that checks and balances power to assure that the principles and interests of the community as a whole are always placed above the interests and power of any individual or faction. Because power will
16 And for Heaven’s Sake, Don’t Overlook Governance!
* I mean people who check on other people to make sure they’re performing well, and by balances, I mean balances of power
16 And for Heaven’s Sake, Don’t Overlook Governance!
* fiefdoms
16 And for Heaven’s Sake, Don’t Overlook Governance!
* loyalty to a boss or department head cannot be allowed to conflict with loyalty to the organization as a whole. Fiefdoms are counterproductive and contrary to the values of an idea meritocracy
16 And for Heaven’s Sake, Don’t Overlook Governance!
* That’s why we have a co-CEO model at Bridgewater that is essentially a partnership of two or three people who lead the firm.
16 And for Heaven’s Sake, Don’t Overlook Governance!
* At Bridgewater the CEOs are overseen by a board largely via the executive chairman or chairmen
Work Principles: Putting It All Together
* No matter your position, you can always practice being open-minded and assertive at the same time, and thinking about your and others’ believabilities when deciding what to do. Above all else, my wishes for you are that: 1) You can make your work and your passion one and the same; 2) You can struggle well with others on your common mission to produce the previously mentioned rewards; 3) You can savor both your struggles and your rewards; and 4) You will evolve quickly and contribute to evolution in significant ways.
Work Principles: Putting It All Together
* It is that of all approaches to decision making, an idea meritocracy is the best
Work Principles: Putting It All Together
* Knowing what you can and cannot expect from each person and knowing what to do to make sure the best ideas win out are the best way to make decisions. Idea-meritocratic decision making is better than traditional autocratic or democratic decision making in almost all cases
Work Principles: Putting It All Together
* An idea meritocracy requires people to do three things: 1) Put their honest thoughts on the table for everyone to see, 2) Have thoughtful disagreements where there are quality back-and-forths in which people evolve their thinking to come up with the best collective answers possible, and 3) Abide by idea-meritocratic ways of getting past the remaining disagreements
Appendix: Tools and Protocols for Bridgewater’s Idea Meritocracy
* Seeing things through everyone’s eyes naturally causes most people to adopt the higher-level view in which they recognize that their own perspective is just one of many, so they ask themselves which criteria are best for deciding how to resolve the issue at hand
Appendix: Tools and Protocols for Bridgewater’s Idea Meritocracy
* The Dot Collector highlights what we call “nubby questions”—cases where the pattern of answers and attributes of people on different sides of an issue suggest that there’s an important disagreement to be resolved
Appendix: Tools and Protocols for Bridgewater’s Idea Meritocracy
* The Issue Log is our primary tool for recording our mistakes and learning from them
Appendix: Tools and Protocols for Bridgewater’s Idea Meritocracy
* A common challenge people had at first was openly pointing out mistakes, because some people instinctively viewed pointing out mistakes as hurtful to the people who made them
Appendix: Tools and Protocols for Bridgewater’s Idea Meritocracy
* Pain Button as like having a psychologist in your pocket, although better as it’s always available and a hell of a lot cheaper
[[Ray Dalio: Principles]]
! PySpark Basics - Tutorial 1
This tutorial covers
* Launching Spark Session
* Reading data using a `json` file
* Viewing rows and selecting columns
* Compute basic stats like describe in [[Pandas]]
* Save data as `csv`
* Load data as `csv`
!!! 1. Initiate Spark Session
```python
import pyspark
from pyspark import SparkConf
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Our first Python Spark SQL example") \
.getOrCreate()
spark.sparkContext.getConf().getAll()
```
<pre style = 'background-color:#fff'>[('spark.driver.port', '41529'),
('spark.app.name', 'Our first Python Spark SQL example'),
('spark.rdd.compress', 'True'),
('spark.serializer.objectStreamReset', '100'),
('spark.master', 'local[*]'),
('spark.executor.id', 'driver'),
('spark.submit.deployMode', 'client'),
('spark.driver.host', 'bd0cee5e3116'),
('spark.ui.showConsoleProgress', 'true'),
('spark.app.id', 'local-1594138779804')]
</pre>
!!! 2. Read data file ([[JSON]])
* Reading the files through `spark.read`
* `printSchema()` method returns the variables and their datatypes
```python
path = "data/sparkify_log_small.json"
user_log = spark.read.json(path)
user_log.printSchema()
```
<pre style = 'background-color:#fff'>root
|-- artist: string (nullable = true)
|-- auth: string (nullable = true)
|-- firstName: string (nullable = true)
|-- gender: string (nullable = true)
|-- itemInSession: long (nullable = true)
|-- lastName: string (nullable = true)
|-- length: double (nullable = true)
|-- level: string (nullable = true)
|-- location: string (nullable = true)
|-- method: string (nullable = true)
|-- page: string (nullable = true)
|-- registration: long (nullable = true)
|-- sessionId: long (nullable = true)
|-- song: string (nullable = true)
|-- status: long (nullable = true)
|-- ts: long (nullable = true)
|-- userAgent: string (nullable = true)
|-- userId: string (nullable = true)
</pre>
!!! 3. Viewing Data
```python
user_log.show(n=1)
user_log.take(1)
```
!!! 4. Saving as CSV
```python
out_path = "data/sparkify_log_small.csv"
user_log.write.save(out_path, format="csv", header=True)
```
!!! 5. Reading CSV
```python
user_log_2 = spark.read.csv(out_path, header=True)
user_log_2.printSchema()
```
<pre style = "background-color:#fff">root
|-- artist: string (nullable = true)
|-- auth: string (nullable = true)
|-- firstName: string (nullable = true)
|-- gender: string (nullable = true)
|-- itemInSession: string (nullable = true)
|-- lastName: string (nullable = true)
|-- length: string (nullable = true)
|-- level: string (nullable = true)
|-- location: string (nullable = true)
|-- method: string (nullable = true)
|-- page: string (nullable = true)
|-- registration: string (nullable = true)
|-- sessionId: string (nullable = true)
|-- song: string (nullable = true)
|-- status: string (nullable = true)
|-- ts: string (nullable = true)
|-- userAgent: string (nullable = true)
|-- userId: string (nullable = true)
</pre>
!!! 6. Subsetting
```python
user_log_2.select("userID").show()
```
<pre style = "background-color:#fff">+------+
|userID|
+------+
| 1046|
| 1000|
| 2219|
| 2373|
| 1747|
+------+
only showing top 5 rows
</pre>
,,[[Lesson 3 : Spark by Udacity]] | [[07 July 2020]],,
* Also Known as [[Sensitivity]]
* $$Recall = \frac{TP}{TP +FP}$$
<<<
The ability of the classifier to find all positive samples
<<< [[Book: Explainable AI with Python]]
is a [[Neural Network]] that contains recurrent layers. These are designed to sequentially process sequence of inputs.
!! [[TensorFlow]]
* Implementation
```python
tf.keras.layers.SimpleRNN(20, input_shape = [None,1], return_sequences = True)
```
* Default activation function is `tanh`, returns values between `-1` and `1`.
!! References
* Detailed workings of RNN - https://explained.ai/rnn/
* [[Recurrent Neural Networks cheatsheet|https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks]] from [[Stanford]]
<<<
Reinforcement Learning is a subfield of [[Machine Learning]] that teaches an agent how to choose an action from its action space, within a particular environment, in order to maximize rewards over time.
Reinforcement Learning has four essential elements:
# ''Agent''. The program you train, with the aim of doing a job you specify.
# ''Environment''. The world, real or virtual, in which the agent performs actions.
# ''Action''. A move made by the agent, which causes a status change in the environment.
# ''Rewards''. The evaluation of an action, which can be positive or negative.
<<< [ext[Reinforcement Learning, Part 1: A Brief Introduction|https://medium.com/ai%C2%B3-theory-practice-business/reinforcement-learning-part-1-a-brief-introduction-a53a849771cf]]
<<<
RL model like at the intersection of supervised and unsupervised systems for the model generates its own examples, so it learns in an unsupervised manner how to generate examples exploring the example’s space and learning from them in a supervised way
<<< [[Book: Explainable AI with Python]]
[ext[Kaggle Resources on Reinforcement Learning|https://www.kaggle.com/c/connectx/discussion/124421]]
* A note taking app that offers [[Roam Research]] like functionality for viewing how your notes are connected.
* Also offers a feature for hierarchical viewing (like a normal note taking app)
* Their website : https://app.relanote.com/platform/note-credit?p=aWQ9MjUxNA==
* Currently offering free plan
* Was easy to setup
<img src = 'https://www.investopedia.com/thmb/a9_SvHzVSaPcS36-e6XFD5EM6gY=/640x360/smart/filters:no_upscale()/rsi4-5bfd69c446e0fb0051b523b8' width = '500'>
* developed by J. Welles Wilder
* leading momentum indicator
* Helps identifying trend reversal
* 0 < RSI < 100
* Shows internal strength of secturity
* Gives out strongest signals in periods of sideways market and non-trending changes
* `RSI = 100 - (100/(1+RS))`
* RS = Average gain/Average loss
* Gain and loss are w.r.t. previous day close
* Losses are also computed positive (absolute)
* Look back period = 14 days (default) - was best for markets in 1978, could change
* Try looking at 5, 10, 20, 50 or 100 RSI
* Also 0-30 and 70-100 over sold and overbought regions are not set in stone
''The objective of RSI is to identify oversold and overbought securities''
* Overbought → positive momentum → stock price so high may not be sustainable → so there could be a correction.
* Oversold → negative momentum is high → could lead to possible reversal
* 0<RSI<30 → oversold → upward correction
* 70<RSI<100 → overbought → downward correction
!! RSI interpretations
* RSI fixed in overbought region for long duration → excess positive momentum → look for buying opportunities
* RSI fixed in oversold region for long → excess negative momentum → look for selling opportunities
* RSI moving away from prolonged oversold region → bottomed out → look for buying opportunities
* RSI moving away from prolonged overbought region → topped out → look for selling opportunities
The Religious Orders Study is a collaborative study with Rush and other U.S. medical centers. It involves more than 1,100 older religious clergy (nuns, priests and brothers) who have agreed to medical and psychological evaluation each year and brain donation after death
!! references
* [ext[https://www.rushu.rush.edu/research/departmental-research/religious-orders-study]]
!!! References
* [ext[A Gentle Introduction to the Rectified Linear Unit (ReLU)|https://machinelearningmastery.com/rectified-linear-activation-function-for-deep-learning-neural-networks/]]
* PCA
* Like word embedding for words - can we find similarity between variables
[[Idea Book]]
Also know is feature learning. Representation learning aims to learn representation of the data that is suitable for machine learning task. [[Deep Learning]] algorithms are becoming so powerful because of representation learning meaning they learn to represent the data while learning to solve the problem.
An article on [[Machine Learning Mastery]] blog explains representation learning and how it is helpful: [ext[Link|https://machinelearningmastery.com/deep-learning-with-python/]]
!! Why NN model results are different?
* NN use random initialization which allows them to learn a good approximation for the function being learned, but this leads to different results for same parameters for the same network trained on the exact same data
* Randomness can be coming from
** Randomness in Initialization, such as weights.
** Randomness in Regularization, such as dropout.
** Randomness in Layers, such as word embedding.
** Randomness in Optimization, such as stochastic optimization.
!! Solutions
''Repeat Your Experiment''
:The traditional and practical way to address this problem is to run your network many times (30+) and use statistics to summarize the performance of your model, and compare your model to other models.
''Seed the Random Number Generator''
:use a fixed seed for the [[Random Number Generator]]
!!! References
* [ext[How to Get Reproducible Results with Keras|https://machinelearningmastery.com/reproducible-results-neural-networks-keras/]]
* Create one post but publish it across all [[Social Media]] websites
* https://repurpose.io/
[[AI Businesses]]
Requests allows you to send HTTP/1.1 requests extremely easily
!!! References
* [ext[https://pypi.org/project/requests/]]
!! Uses [[Pandas]].resample()
* `df` - contains [[OHLC]] data at 1 min time frame
* `origin` - to be defined on the basis of data. keep 9:15 as the starting point of the first data in dataframe
```python
agg_ohlc = {'open':'first', 'high':'max', 'low':'min', 'close': 'last', 'volume':'sum'}
df5 = df.resample(
rule = '5Min', # timeframe
on = 'DateTime', # resmapling column
origin = '2010-01-04 9:15:00', # starting point of resampling
closed = 'right', # considers data at 9:45 1min candle
label = 'left', # chooses datetime label of at the end of time period eg. 9:15 to 9:45 would use 9:15 for left and 9:45 for right
).agg(agg_ohlc).dropna()
df5 = df5.reset_index()
df5.head()
```
Images can be resized using [[PIL]] in [[Python]]
This function takes 3 arguments
* Source Location
* Save location
* Max size of the image
The `image..thumbnail` method preserves the aspect ratio and scales the image.
```python
def RescaleAndSave(SOURCE_PATH, SAVE_PATH, size = (150,150)):
from PIL import Image
for f in tqdm(os.listdir(SOURCE_PATH)):
img = Image.open(os.path.join(SOURCE_PATH, f))
img.thumbnail(size, Image.ANTIALIAS)
img.save(os.path.join(SAVE_PATH, f))
```
* Residual Networks
* very very deep [[Neural Network]]s are harder to train because of [[Vanishing Gradients]] and [[Exploding gradient]]s problem
* [[Skip Connection]]s allows the [[Activation]] of one layer to be fed into a deeper layer in the network
* Resnets are built of [[Residual Block]]s
!! [[Residual Block]]
<img src='http://media5.datahacker.rs/2018/11/b_relu.png' width=300>
$$a^{[l]} \rightarrow z^{[l+1]} \rightarrow ReLU(z^{[l+1]}) = a^{[l+1]} \rightarrow z^{[l+2]} \rightarrow ReLU(z^{[l+2]}) = a^{[l+2]}$$
where
<<<
$$z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}$$
$$a^{[l]} = ReLU(z^{[l]})$$
<<<
For [[Residual Block]], a [[Skip Connection]] is applied to $$z^{[l+2]}$$ before computing the ReLU.
$$a^{[l+2]} = g(z^{[l+2]} + a^{[l]})$$
* the addition of $$a^{[l]}$$ makes this a residual block. Using this residual block allows us to train much deeper NNs usually by stacking these residual blocks to make a deep network.
* To turn a plain network into a residual network - add [[Skip Connection]]s
:<img src='https://dummyimage.com/600x400/000/fff' width=250>
!! Performance Comparison
Training a deeper network in theory would have reduced training error but in reality, it is not true for plain networks. As the # of layers increase the error starts to go up.
<img src='https://miro.medium.com/max/1376/1*JLaUdpPWY7bqGbs9oCtomw.png'>
but with Resnets you can train much deeper networks without the problems of [[Vanishing Gradients]] or [[Exploding gradient]]s.
A [[Machine Learning]] model built to predict the likelihood of a customer responding to an offer solicited through a particular channel
Digitizes the signal from camera and sends it through the electrode grid plugged into the [[Optic Nerve]] at the back of the eye.
''[[01 April 2021]]''
Testing whether removing any activity or initiative will have an adverse impact.
<iframe width="700" height="394" src="https://www.youtube.com/embed/azq0S0DKS50" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Author of Rich Dad Poor Dad
* Money is not taught in schools - Most people lack business knowledge
* Poor Dad: We can't afford this/I don't have time because this is escape; Rich Dad: How can we afford this?
* ''A question opens the mind; A Statement closes it''
* Rich/Poor/Middle Class starts with a fundamental attitude - Words become flesh
[[Zerodha Educate]] Podcast
!! Speaker
* ''Rahul Singh'' CIO Tata Equities - IIML Alumnus; Mechanical Engineer - IITB
* Worked in Crisil for 5 years - Debt Ratings
!! Tata Equities
* Growth at Reasonable Price - Value stocks with catalyst (positive surprise)
* Rights are issued for raising fresh capital.
* This is like a second IPO for selected people.
* 1:4 rights issue means, new shares will issued at a discounted rate..
* CAUTION: Since in this option you have to pay additional money to buy the discounted shares, don’t get swayed away with the discount. Thoroughly check company’s plans before buying shares
* [[Marcellus Investment Managers]] new portfolio of stocks for midcaps
* Min Investment - 1Cr
* Portfolio Companies
** [[GMM Pfaudler]]
** [[Dr Lal Path Labs]]
** [[Page Industries]]
** [[Aavas Financiers]]
** Stock 5 - Suprajit, Ease my Trip
** Stock 6 - Astral Ltd,
** Stock 7 - AlkylAmines
** Stock 8 - Relaxo
** Stock 9 - Added in Oct'21
** Stock 10 - Syngene International
** Stock 11 - Info Edge (not sure), Berger Paints (not sure), Mindtree
** [[LTTS]]
** Stock 13 - Cholamandaram
** Stock 14 - [[ICICI Lombard]]
** Stock 15
** Stock 16 - Already exited in Oct'21
[[06 January 2022]] |
[[Recurrent Neural Network]]s are class of [[Deep Learning]] algorithms are capable of modelling on time series inputs
!! How to interpret & explain [[RNN]]s
!!! [[SHAP Values]]
<<<
!!!! References
* [[Notebook for explaining LSTM model with SHAP|https://slundberg.github.io/shap/notebooks/deep_explainer/Keras%20LSTM%20for%20IMDB%20Sentiment%20Classification.html]]
<<<
!!! [[Interpreting recurrent neural networks on multivariate time series|https://towardsdatascience.com/interpreting-recurrent-neural-networks-on-multivariate-time-series-ebec0edb8f5a]]
<<<
[[Perturbation-based Methods]] - a family of interpretability techniques that apply changes in the input data (perturbations) to calculate the importance scores which is model agnostic
''Occlusion Score'' - Remove the instance and compute the output and see how the outcome changes from the original output
!!!! Refrences
* [[RetainVis: Visual Analytics with Interpretable and Interactive Recurrent Neural Networks on Electronic Medical Records|https://arxiv.org/pdf/1805.10724.pdf]]
* [[Modified SHAP for RNN|https://github.com/AndreCNF/shap]] - usable
<<<
!!! [[Layerwise Relevance Propagation (LRP)]]
<<<
!!!! References
* [[Explaining and Interpreting LSTMs|http://iphome.hhi.de/samek/pdf/ArrXAI19.pdf]]
<<<
!!! [[Exploring Interpretable LSTM Neural Networks over Multi-Variable Data]]
<<<
* captures variable wise hidden state dynamics
* variable importance and temporal importance measures
<<< https://arxiv.org/pdf/1905.12034.pdf
,,Tags: [[18 August 2021]],,
!! Courses
# TensorFlow developer certificate
# Deeplearning.ai's Deep learning specialization
!! Blogs
* [[Machine Learning Mastery]]
* Roam Research is a note taking app for associative learning.
* Their website : https://roamresearch.com/
* These notes are nothing but a giant bulleted list
* An overview to use this note taking website is in this [[Youtube]] video by Thomas Frank
* <html><iframe width="560" height="315" src="https://www.youtube.com/embed/vxOffM_tVHI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
!! Summary
!!! Network
* Nodes
* Edges
* Attributes
* Weight
!!! Measures of Centrality
* [[Degree Centrality]]
** number of nodes connected for a particular node is its degree
* [[Closeness Centrality]]
** Shortest path between two nodes
* [[Betweeness Centrality]]
** Broker between two sub-networks
* [[Eigenvector Centrality]]
** nodes with high eigen vector centrality are connected to nodes that are also well connected
!! Link Prediction
* [[Jaccard Similarity]]
** If high jaccard similarity between two nodes, it means that high chances of links between two nodes
* [[Preferential Attachment]]
** Analogy - Rich getting richer
** Multiplies the degree between the two nodes to predict which is the next most likely link
!! Referencess
* [[Github Repo|https://github.com/rtidatascience/connected-nx-tutorial]]
* YouTube Video
:<iframe width="450" height="250" src="https://www.youtube.com/embed/7fsreJMy_pI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,Tags: [[Social Network Analysis]],,
IN 1966, to increase the population and the work force, Romanian president Nicolae Ceaușescu banned contraception and abortion. [[Menstrual Police]] examined women of childbearing age to ensure they were producing enough offspring. A [[Celibacy Tax]] was levied on families who had fewer than 5 children. As a result the birthrate skyrocketed, and the poor who could not afford to care for their children, gave them over to state-run institutions. By 1989 when Ceaușescu was ousted, 170,000 children resided in institutions.
<img src='https://i.guim.co.uk/img/media/23f3a90e0291f1f29fbe1b3350e20a520dfbe5ea/96_45_2818_1897/master/2818.jpg?width=445&quality=45&auto=format&fit=max&dpr=2&s=a833d00a11d64dd099f4c40d87320d24' width = 400>
!! References
* [ext[https://www.theguardian.com/world/2019/dec/15/romania-orphanage-child-abusers-may-face-justice-30-years-on]]
,,Tags : [[Case Study]],,
!! Interview Setting
* 1 Member panel
* 1 hour interview on webex
!! Interview Questions
# Tell me about yourself?
# What is your next 100 day plan
# You have a three membered team, all of them are busy with their workloads, there is an urgent workstream that is coming up for 2 weeks of time. How would you handle this situation?
# Everyone in your team is demotivated. How would you handle this situation?
# Your Manager receives a nasty email from their partners about the project. They mention that they are not happy with how the project has been handled. It is the worst handling of project he has seen in last 2 years. What would you do in this situation?
# How would you ensure that a star performer in your team, also is visible as a star performer in your executive's eyes
# how would you prioritize your workload?
# In a [[Binary Classification]] problem in [[XGBoost]] which [[Loss Function]] is used and why?
!!1 Member - 45 Minutes
* What is [[Change point detection (CPD)]]?
* What are the limitations of [[KNN]]?
* What is the business context for FRP and how it was used?
* What is your opinion on how should you collaborate with Research teams
* If you have sufficient time to do a project with research teams, what will be your rules of engagement
* What are the biggest challenges of working with interns? How would you overcome it?
* What metrics would you use to decide which algorithm would you try out first?
!! What is R2
<<<
Proportion of variation in the dependent variable explained by the independent variable
<<< [[R-squared intuition|https://www.khanacademy.org/math/ap-statistics/bivariate-data-ap/assessing-fit-least-squares-regression/a/r-squared-intuition]] from [[Khan Academy]]
$$
R^2 = 1 - \frac{unexplained \ variance}{total \ variance} \\
= 1 - \frac{SS (Predicted - Actual)}{SS (Actual - Mean Actual)}
$$
!!! [[R-Squared|https://www.investopedia.com/terms/r/r-squared.asp#:~:text=R%2Dsquared%20(R2),variables%20in%20a%20regression%20model.]] on [[Investopedia]]
* statistical measure that explains the proportion of variance in the dependent variable is explained by the independent
* Not to be confused with [[Correlation]] with measures the strength of relationship, where rsquared measures the variance in second variable due to the first variable
* R2 of a model is 0.5 - means half of the variance can be explained by model's inputs
!!! [[sklearn.metrics.r2_score|https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html]] on [[scikit-learn]]
* a constant model with same value would have rsquare = 0
* returns NaN if sample size < 2
!! can R2 be negative
<<<
R2 compares the fit of the chosen model with that of a horizontal straight line (the null hypothesis). If the chosen model fits worse than a horizontal line, then R2 is negative. Note that R2 is not always the square of anything, so it can have a negative value without violating any rules of math. R2 is negative only when the chosen model does not follow the trend of the data, so fits worse than a horizontal line.
<img src='https://i.stack.imgur.com/CHpzE.png' width=300>
''Bottom line'': a negative R2 is not a mathematical impossibility or the sign of a computer bug. It simply means that the chosen model (with its constraints) fits the data really poorly.
<<< [[When is R squared negative|https://stats.stackexchange.com/questions/12900/when-is-r-squared-negative]]
!! Reference
* People in the company makes lot of decisions - can they be documented based on
** Circumstances of decision
** Problem
** Decision Made
** Outcome
** Metric to measure how good or bad the outcome was
* A network of such decisions by different people will help guide new people leaders make these decisions easily and simultaneously building up proprietary information and knowledge base for best practices for decision making
* Just like [[Ray Dalio: Principles]]
,,[[Idea Book]] | [[19 September 2021]],,
Keywords: [[Binary Classification]], [[Boosting]], [[Imbalanced Classification]], [[Sampling]]
!! Reference
<embed src='https://sci2s.ugr.es/keel/pdf/algorithm/articulo/2010-IEEE%20TSMCpartA-RUSBoost%20A%20Hybrid%20Approach%20to%20Alleviating%20Class%20Imbalance.pdf' width=700 height = 400>
The Rwandan genocide occurred between 7 April and 15 July 1994 during the Rwandan Civil War. During this period of 100 days, members of the Tutsi minority ethnic group, as well as some moderate Hutu, were slaughtered by armed militias.
!! References
* https://www.bbc.com/news/world-africa-26875506
* Rytr is an AI writing assistant that helps you create high-quality content, in just a few seconds, at a fraction of the cost!
* https://rytr.me/
[[AI Businesses]] | [[AI copywriting]]
A list of 30 companies forms this [[INDEX]]
<table>
<tr>
<th>Size</th>
<th>Market Cap (Cr)</th>
<th>Stock</th>
<th>Description</th>
</tr>
<tr>
<td>large Cap</td>
<td>392741.04</td>
<td>''[[Kotak Mahindra Bank]]''</td>
<td>
<li>Created in 2004</li>
<li>3% loan book share (as of Aug'20)</li>
<li>Comfortable 20% compounder over the next decade. Part of ''[[Kings of Capital]]'' and ''CCP'' portfolios</li>
</td>
</tr>
<tr>
<td>large Cap</td>
<td>87894.68</td>
<td>''[[Pidilite]]''</td>
<td>
<li>Dominant in Adhesives/Water-proofing</li>
<li>Marcellus Research - Building Monopoly number 3</li>
<li>Part of ''CCP'' portfolios</li>
</td>
</tr>
<tr>
<td>Small Cap</td>
<td>5377.78</td>
<td>''[[GMM Pfaudler]]''</td>
<td>
<li>Dominant in Adhesives/Water-proofing</li>
<li>Marcellus Research - Building Monopoly number 3</li>
<li>Part of ''Little Champs'' portfolios</li>
</td>
</tr>
<tr>
<td>Small Cap</td>
<td>10114.91</td>
<td>''[[Alkyl Amines]]''</td>
<td>
<li>Dominant Player in Aliphatic Amines</li>
<li>Essential chemical. highly combustible. Lots of regulatory clearance required.</li>
<li>Part of ''Little Champs'' portfolios</li>
</td>
</tr>
</table>
!! References
<iframe width="700" height="400" src="https://www.youtube.com/embed/mTy0OHzezwI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Methods for loading [[XGBoost]] models
!! Saving methods
!!! Saving .model file
```python
model.save_model('model.model')
```
!!! Saving model file with feature maps
```python
# dump model
model.dump_model('dump.raw.txt')
# dump model with feature map
model.dump_model('dump.raw.txt', 'featmap.txt')
```
!!! Pickle dump
```python
import pickle
pickle.dump(xgb_model, open("model.pkl", "wb"))
```
!! loading methods
!!! using model booster object
```python
bst = xgb.Booster({'nthread': 4}) # init model
bst.load_model('model.model') # load data
```
!!! using [[Pickle]] load
```python
import pickle
model = pickle.load(open("model.pkl", "rb"))
```
!! Saving a Model
```python
model.save('path/to/location')
```
!! Loading a Model
```python
from tensorflow import keras
model = keras.models.load_model('path/to/location')
```
* [ext[Tensorflow Link|]]
!! Small Business Credit Share Program
The Small Business Credit Share program is a ''consortium of companies that share expanded payment performance data on products like lines of credit; credit cards; loans; leases; and first creditors for emerging businesses such as utilities and telecommunications''. As a member, you get ''access to reports, scores and special offers'' that are exclusive to the program. Experian® also can provide access to consumer data for a complete picture of a small-business owner or guarantor.
!! Competitive advantage
* with information and the latest scores that ''improve risk decisions on small businesses by 40 percent''.
Members include some of the largest small-business creditors in the United States.
* ''Access member-only comprehensive credit reports'' with expanded payment performance data and benchmarking.
* ''Powerful score performance'', with the new Small Business Credit Share acquisition model 2.0 providing 40 percent greater performance than standard credit scores.
* ''Gain powerful portfolio scoring'' by three portfolio model types (all financial model, commercial credit card model or commercial retail credit card model).
!! Product Sheet
<embed src="https://www.experian.com/content/dam/marketing/na/assets/bis/business-information/brochures/7580-small-business-credit-share-ps.pdf" width="500" height="375" type="application/pdf">
!! Sample Report
<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=http://www.bci2experian.com/library/BCI-Experian-SBCS-Sample.pdf" width="500" height="375" type="application/pdf">
!! References
* [ext[https://www.experian.com/business-information/business-data-exchange]]
* [ext[Experian enables better credit access for small businesses; provides complete view of fundamental data required for credit risk assessment|https://www.prnewswire.com/news-releases/experian-enables-better-credit-access-for-small-businesses-provides-complete-view-of-fundamental-data-required-for-credit-risk-assessment-300210407.html]]
Schedule is in-process scheduler for periodic jobs that use the builder pattern for configuration. Schedule lets you run [[Python]] functions (or any other callable) periodically at pre-determined intervals using a simple, human-friendly syntax
```python
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
schedule.every().minute.at(":17").do(job)
while True:
schedule.run_pending()
time.sleep(1)
```
!! References
* [ext[https://www.geeksforgeeks.org/python-schedule-library/]]
* [ext[https://schedule.readthedocs.io/en/stable/]]
* Schizophrenia is a disorder of her brain function where people hear voices and see things that other don't see, or believe that other people are reading her thoughts.
The word school derives from Greek σχολή (scholē), originally meaning "leisure" and also "that in which leisure is employed",
cognitive bias that occurs when the valuation of a problem is not valued with a multiplicative relationship to its size
!! Example
When tasked to identify whether a candidate would stick around for more than 2 years vs more than 3 years. Ideally, the answers should be different but they are generally the same
```python
# E:
# cd "E:\My Works\Python\Dash Apps\TradingApps\EconomicTimesData"
# conda create --no-default-packages python=3.8 -n etfetch
# conda activate etfetch
# pip install pandas
# pip install requests
# works with Python 3.8 and pandas 2.0.3
import pandas as pd
import numpy as np
import os
import requests
from datetime import datetime, timedelta
import multiprocessing
from time import sleep
from glob import glob
from multiprocessing import Pool
def get_data_from_url(ticker):
start, end, year, qtr = '2023-07-01 00:00:00', '2023-09-30 23:59:59', 2023, 'Q3'
start = int(pd.to_datetime(start).timestamp())
end = int(pd.to_datetime(end).timestamp())
url = f"https://etelection.indiatimes.com/ET_Charts/india-market/stock/history?symbol={ticker}&resolution=1&from={start}&to={end}&countback=25000"
available = 0 # check if file is available or not
for f in glob(f'STOCK_1MIN/{year}{qtr}/*.pkl'):
if f"{year}_{qtr}_{ticker}.pkl" in f:
available = 1
print(f"{datetime.now().strftime('%H:%M:%S')} > AVAILABLE : {ticker}")
break
if available == 0:
try:
sleep(0.1)
r = requests.get(url)
df = pd.DataFrame(r.json())
df.drop(['s','noData','dates'], axis=1, inplace=True)
df['datetime'] = pd.to_datetime(df['t'], unit='s') + timedelta(hours=5.5)
df = df[df.t > start].reset_index(drop=True)
df = df.drop('t', axis=1).astype({'o':'float32','h':'float32','l':'float32','c':'float32','v':'uint32'})
df.to_pickle(f'STOCK_1MIN/{year}{qtr}/{year}_{qtr}_{ticker}.pkl')
print(f"{datetime.now().strftime('%H:%M:%S')} > DOWNLOADED {ticker} ")
except Exception as e:
print(f"{datetime.now().strftime('%H:%M:%S')} > FAILED {ticker} : {e} : {url}")
sleep(0.3)
pass
if __name__ == "__main__":
print(f'CPU: {multiprocessing.cpu_count()}')
# LOAD tickers
df = pd.read_pickle('ET_MERGED.pkl')
print(f'SHAPE : {df.shape}')
tickers = [x for x in df.symbol if x != '']
print(f'TICKERS TO FETCH : {len(tickers)}')
print(df[df.symbol.isin(tickers)])
# SAVE LOCATION
save_path = f'STOCK_1MIN/2023Q3'
if not os.path.exists(save_path):
os.mkdir(save_path)
with Pool(8) as p:
l = p.map(get_data_from_url, tickers)
saved_file_path = glob(f'{save_path}/*AXISBANKEQ.pkl')[0].replace('\\','/')
print(saved_file_path)
temp = pd.read_pickle(saved_file_path)
temp.to_csv('AXISBANKEQ.csv',index=False)
print(temp['datetime'].min(), temp['datetime'].max())
```
* Head to [[tradingview advanced chart view|https://in.tradingview.com/chart/dcipLijy/]]
* Search for a ticker open the model window for ticker search - remove your search query
* Use F12 to open developer tools for [[Google Chrome]]
* Find out the `<div>` with class `scrollContainer-vWG52QBW` - that contains - ticker, description, exchange info - this is all what is needed to scrape [[OHLC]] data from tradingview
* Get innerHTML for the div and save as html
* Then use [[BeautifulSoup]] to extract the contents of html - like so
```python
import pandas as pd
from bs4 import BeautifulSoup
def get_symbol_details(html_file):
# open existing html file containing ticker information
f = open(f'assets/tvsymbolinfo/htmls/{html_file}.html')
soup = BeautifulSoup(f, features="lxml")
# get symbols, descriptions and exchanges
symbols = soup.find_all('div', {'data-name': 'list-item-title'})
descriptions = soup.find_all('div', {'class': [
'symbolDescription-DPHbT8fH',
'apply-overflow-tooltip',
'apply-overflow-tooltip--allow-text'
]})
exchanges = soup.find_all('div', {'class': [
'exchangeName-DPHbT8fH',
'apply-common-tooltip'
]})
print(len(symbols), len(descriptions), len(exchanges))
# store extracted content into a dataframe
df = pd.DataFrame()
for sym, desc, ex in zip(symbols, descriptions, exchanges[1:]):
df = df.append(pd.DataFrame({
'symbol': [sym.contents[0].contents[0]],
'description': [desc.contents[0]],
'exchange': [ex.contents[0]]
}))
# save csv
df.to_csv(f'assets/tvsymbolinfo/csvextracts/{html_file}.csv', index=False)
return df
```
* Using For Loop across all types of tickers
```python
master_df = pd.DataFrame()
html_files = [
'bonds',
'futures',
'indices',
'crypto_binance', 'crypto_kraken', 'crypto_tradestation', 'crypto_coinbase', 'crypto_binanceus',
'economy'
]
for file in html_files:
temp_df = get_symbol_details(file)
temp_df['category'] = file
if file == 'economy':
temp_df['ticker'] = 'ECONOMICS:' + temp_df.symbol.str.strip()
elif file == 'futures':
temp_copy = temp_df.copy()
temp_df['ticker'] = temp_df.exchange.str.strip() + ':' + temp_df.symbol.str.strip() + '1!'
temp_copy['ticker'] = temp_copy.exchange.str.strip() + ':' + temp_copy.symbol.str.strip() + '2!'
temp_df = temp_df.append(temp_copy, ignore_index=True)
else:
temp_df['ticker'] = temp_df.exchange.str.strip() + ':' + temp_df.symbol.str.strip()
master_df = master_df.append(temp_df)
master_df.to_csv('assets/tvsymbolinfo/master_ticker.csv', index=False)
```
,,[[Web Scraping]] | [[TradingView]] | [[15 September 2022]],,
```python
import time
import json
import requests
import pandas as pd
from datetime import datetime, timedelta
from time import sleep
from random import randint
from multiprocessing import Pool
start_time = int((datetime.now() - timedelta(days=600)).timestamp())
end_time = int(datetime.now().timestamp())
resolution = 1
def now():
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def money_control_fetch(symbol):
try:
sleep(randint(100, 500)/100)
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
URL = 'https://priceapi.moneycontrol.com/techCharts/techChartController/history?symbol={}&resolution={}&from={}&to={}'.format(symbol, resolution, start_time, end_time)
response = requests.get(URL, headers=headers)
if response.status_code == requests.codes.ok:
df = pd.DataFrame(response.json())
df.drop('s', axis=1, inplace=True)
df.columns = ['time', 'open', 'high', 'low', 'close', 'volume']
df['datetime'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=5.5)
df['ticker'] = symbol
df = df[['ticker', 'datetime', 'open', 'high', 'low', 'close', 'volume']]
df = df.astype({'open':'float32', 'high':'float32', 'low':'float32', 'close':'float32', 'volume':'uint32'})
df.to_pickle(f'{symbol}.pkl')
#df.to_csv(f'{symbol}.csv', index=False, header=None)
print(f'{now()} > TRIED {symbol}; {df.shape[0]} ROWS')
else:
print('Request Failed')
except Exception as e:
print(f'{now()} > SKIPPED {symbol} due to ERROR: {e}')
pass
ticks = [x.split(':')[1].replace('_','-') for x in ticker_list]
with Pool(12) as p:
l = p.map(money_control_fetch, ticks)
```
```js
searchCompany: '/api/company/search/',
addCompany: '/api/company/{companyId}/add/{listId}/',
removeCompany: '/api/company/{companyId}/remove/{listId}/',
quickRatios: '/api/company/{warehouseId}/quick_ratios/',
peers: '/api/company/{warehouseId}/peers/',
schedules: '/api/company/{companyId}/schedules/',
searchRatio: '/api/ratio/search/',
getChartMetric: '/api/company/{companyId}/chart/',
searchHsCode: '/api/hs/search/',
tradeData: '/api/hs/{hsCode}/data/',
feed: '/dash/',
updateFeedPos: '/api/user/read_feed/',
ratioGallery: '/ratios/gallery/',
getSegments: '/api/segments/{companyId}/{section}/{segtype}/',
addPushSubscription: '/api/notifications/add_push_subscription/',
companyInSublists: '/api/company/sublists/{companyId}/',
getShareholders: '/api/2/{companyId}/investors/{classification}/',
filterAnnualReports: '/annual-reports/filter/',
notes: '/notebook/{companyId}/',
notesUpload: '/notebook/upload/'
```
Attempt 2: Understanding lay of land
* For each customer, identify basic variables like, spend bucket, revenue bucket, employee count, products owned, FICO score and attach model scores for response, spend, ADB models and study segments
Business Intelligence tool should tell you - In your Inventory of Models
* What was the objective
* What happened
* What did not happen
* Where is the opportunity - Intelligence
For example - Response model
* To predict the likelihood that the customer will respond to these card offers or not
* How many were solicited? - Track On
* How many responded? - Track On
* How many did not respond? - Track On
* Why they did not respond?
** Does the customer belongs to a general category of customers who are solicited but they never respond - historical data to suggest customers showing such kind of tendency - can size such customers
**
According to [[Psychologist]] Alber Bandura, self-efficacy is the individual is more likely to accomplish the things that they set out to do who believe that they can effect change. It is Bandura calls ''a personal judgment of how well one can execute courses of action required to deal with prospective situations''
!! [[Sending Stock updates with Python|https://medium.com/python-in-plain-english/sending-stock-updates-with-python-c63a54a63f10]] on Medium
* Reads web page text using [[requests]]
* Converts html page to [[Pandas]] data frames with `pd.read_html`
* Downloads stock data from [[yfinance]]
* Uses [[Schedule]] to send emails
Refers to feeding sensory information through unusual sensory channels such as vision through touch. The brain figures out what to do with the information because it doesn't care how the data finds its way in.
,,[[01 April 2021]],,
Sequence bias is when the ''order of things can impact the selection of things''. For example, if I were to ask you your favorite TV show, and listed "Game of Thrones", "Killing Eve", "Travellers" and "Doctor Who" in that order, you're probably more likely to select 'Game of Thrones' as you are familiar with it, and it's the first thing you see. Even if it is equal to the other TV shows. So, when training data in a dataset, we don't want the sequence to impact the training in a similar way, so it's good to shuffle them up.
* 4th course in [[TensorFlow in Practice Specialization]]
* Apply everything you’ve learned throughout the Specialization to build a sunspot prediction model using real-world data!
<<tabs "
[[Week 1 - Sequences and Prediction]]
[[Week 2 - Deep Neural Networks for Time Series]]
[[Week 3 - Recurrent Neural Networks for Time Series]]
[[Week 4 - Real-world time series data]]
"
"$:/state/strollhometabs" "tc-vertical">>
Serial block-face scanning electron microscopy generates high resolution 3D models of complete neural pathways from tiny slices of brain tissue. It's the first technique to yield 3D images of the brain at nanoscale resolution.
The challenge of mapping a full human [[Connectome]] is expected to take several decades
,,[[01 April 2021]],,
Shapley values -- a method from coalitional [[Game Theory]] -- tells us how to fairly distribute the "payout" among the features. i.e. Each feature value of instance is a player in the game, and prediction is the overall payout that is distributed among players (features). This ''explains the contribution of variables for a prediction and the direction in which it affects the outcome''.
* is the average contribution in prediction over all possible coalition of features
* SHAP is developed by [[Scott Lundberg|https://scottlundberg.com/]]
* [[Github]] repo - https://github.com/slundberg/shap
* Summary of Research Paper - [[A Unified Approach to Interpreting Model Predictions]]
!! References
* [[Kaggle]] introduction to Shapley Values using [[RandomForestClassifier]]- [ext[https://www.kaggle.com/dansbecker/shap-values]]
* Computing Shapley and visualizing plots for a [[Classification]] problem using [[XGBoost]] model - [ext[https://slundberg.github.io/shap/notebooks/Census%20income%20classification%20with%20XGBoost.html]] - Jupyter Notebook
* Interpretable [[Machine Learning]] Book - Chapter 5.9 on Shapley values - [ext[https://christophm.github.io/interpretable-ml-book/shapley.html]]
* [[Python]] shap package documentation - [ext[https://shap.readthedocs.io/en/latest/generated/shap.plots.force.html]]
* Original Research Paper - https://arxiv.org/abs/1705.07874
A shaper is someone who comes up with unique and valuable visions and builds them out beautifully, typically over the doubts and opposition of others.
* ''Shaved Bar'' - Close of the bar within 5% of the low
* The percent break down - down shaved bar 90% chance of breaking down below the saved bar's low. 90% is emperical and has to be identified for different instruments. 90% is not a hard cutoff
** Example in forex - Pound/Dollar - considered only down shaved bars
** 91.5% chance of breaking down
** Average break down on the the down side is 100 pips
<iframe width="560" height="315" src="https://www.youtube.com/embed/HAqJ58UtsLo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
The ''sigmoid activation function'', also called the ''logistic function'', is traditionally a very popular activation function for neural networks. The input to the function is transformed into a value between 0.0 and 1.0.
!!! References
* [ext[A Gentle Introduction to the Rectified Linear Unit (ReLU)|https://machinelearningmastery.com/rectified-linear-activation-function-for-deep-learning-neural-networks/]]
!! CV - Technical
* Dep Var
* How did you define dep var
* algorithm - related - regularization
* highly overfitting
!! Situational
* how would you deal with partners - they would be unreasonable?
* Conflict within the team?
* How would you allocate work between your DRs?
* Any questions for me?
[[13 January 2022]]
A [[Natural Language Processing (NLP)]] based model that takes in complicated statements and simplifies concepts to most common 1000/2000 words. Similar to [[Thing Explainer]] by [[Randall Munroe]] author of [[XKCD]] comics.
* The input would be a complicated looking statement
* The NLP model would understand context
* find synonyms or dictionary meaning of words from google or wikipedia
* Output simplified sentence for layman audience to understand
Parameters may include choosing a set of words for children, adults, and experts (the vocabulary size may increase)
!!! Applications
Can help simplify a lot of research in different domains in layman terms
* 4 leadership styles from contingency-based [[Leadership]] model
* Leadership style = $$f$$ (situation)
* Situation = $$f$$ (willingness, ability) to perform a task
* The most inconsistent thing a leader can do is to treat everyone the same
<img src='https://situational.com/wordpress/wp-content/uploads/2020/06/Four-Leadership-Styles-612x999.jpg' width=400>
!! Dimensions
* ''Task Directed'' - the extent to which the leader tells the follower what, how, when and where one needs to do things
* ''Relationship directed'' - extent to which the leader engages in open dialog with the follower, actively listens and provides recognition for task-related progress
!! Four Styles
* ''Style 1 - telling''
** high task directive, low to moderate relationship directed
** create movement
** Low skill, low will
* ''Style 2 - Selling''
** High task and relationship directed
** create buy-in and understanding
** Low skill, high will
* ''Style 3 - Participation''
** High relationship directed but low task directed
** create alignment
** high skill, low will
* ''Style 4 - Delegating''
** both low task and relationship directed
** create/enhance task mastery and autonomy
** high skill, high will
!! References
* https://situational.com/blog/the-four-leadership-styles-of-situational-leadership/
,,Tags: [[Management Learnings 2022]] | [[02 January 2022]],,
!! References
* https://github.com/maks-sh/scikit-uplift
* Performance management and employee engagement tool for managers
* Compares the willingness (motivation) to perform a task to a degree of skill employees have to perform the task well
* It is derived from [[Situational Leadership Model]] model which involves flexing leadership and managerial style to match specific situation and employees
<<<
<table id="main-table" class="table text-left table-striped table-bordered">
<tbody>
<tr>
<th></th>
<th>Low Skill</th>
<th>High Skill</th>
</tr>
<tr>
<th>high Will</th>
<td>Guide (train in specific skill sets, coach & provide feedback and find ways to bridge skill gap)</td>
<td>Delegate (Challenge, Nurture & Empower)</td>
</tr>
<tr>
<th>Low Will</th>
<td>Direct (SMART Goals, work plan and regular check-in meetings)</td>
<td>Excite (Find reasons for low motivation and communicate measures to support the change)</td>
</tr>
</tbody>
</table>
<<<
!! Skill vs Will
* ‘Skill’ is the competence employees possess to function in their role effectively. People acquire and develop skills through learning and practice. Skills can also be measured in terms of proficiency levels – beginner, intermediate, advance, and expert. This is objective
* ‘Will’ signifies the degree of motivation employees have to perform a task or function in a role. Several things can impact employees’ level of will – ''degree of skill, professional aspirations, team and organizational culture, and personal life.'' This is subjective
!! Applications
In the time of organizational changes
* retaining and promoting employees during org re-strucutring
* managing transformation of attitudes, workloads, perspectives, aspirations, health in post-pandemic work environment
* managing & motivating employees merged in M&A
* New Manager
* selecting members for Agile Projects
!! [[Situational Leadership Model]] Model
<img src='https://lh3.googleusercontent.com/proxy/2PIM_Ps9lfzc3n4VK51iEC9Jdk4SoSMCnG-7OSmlAPvOjJEWpKoiAoFy4lJuv1d9MQVDX-_1ACdERlTx2JoFFx7GwIRV22erDlGMq7tJTItWdtIsQTEugA' width=400>
!! References
* [[https://www.aihr.com/blog/skill-will-matrix/]]
,,Tags: [[Management Learnings 2022]] | [[02 January 2022]],,
```python
import pandas as pd
import numpy as np
from datetime import timedelta
import plotly.graph_objs as go
from itertools import combinations
import plotly.io as pio
import warnings
warnings.filterwarnings('ignore')
# read dataset
master_df = pd.read_csv('../../../Datasets/NSE_NIFTY_DEC312020_30M_TVDownload.csv')
master_df['datetime'] = pd.to_datetime(master_df['time'], unit='s') + timedelta(hours=5.5)
master_df['date'] = master_df['datetime'].dt.date
# master_df = master_df.tail(2000).head(500).reset_index(drop=True)
master_df['bar'] = master_df.reset_index(drop=True).index
print(master_df.head())
# -------------------- MARKING LOGIC START -------------------- #
def getSPL(df, main_df, lastSPHbar):
# higher closes
if (df.iloc[2].close > df.iloc[0].close) & (df.iloc[1].close > df.iloc[0].close):
# higher highs
if (df.iloc[2].high > df.iloc[0].high) & (df.iloc[1].high > df.iloc[0].high):
B2 = df.iloc[2].bar
B1 = df.iloc[1].bar
A = df.iloc[0].bar
temp_df = main_df.loc[lastSPHbar + 1: B2]
minLow = temp_df.low.min()
P = temp_df.loc[temp_df.low == minLow, 'bar'].index[0]
print('SPL Found @', P, 'New Anchor @', B2, 'Lowest :', minLow)
return A, B1, B2, P
def getSPH(df, main_df, lastSPLbar):
# lower closes
if (df.iloc[2].close < df.iloc[0].close) & (df.iloc[1].close < df.iloc[0].close):
# lower lows
if (df.iloc[2].low < df.iloc[0].low) & (df.iloc[1].low < df.iloc[0].low):
B2 = df.iloc[2].bar
B1 = df.iloc[1].bar
A = df.iloc[0].bar
temp_df = main_df.loc[lastSPLbar + 1: B2]
maxHigh = temp_df.high.max()
P = temp_df.loc[temp_df.high == maxHigh, 'bar'].index[0]
print('SPH Found @', P, 'New Anchor @', B2, 'Highest :', maxHigh)
return A, B1, B2, P
start_bar = 0 # Next Anchor
SPL = False # if this is False, it will look for SPH
k = 35 # finds SPH/SPL in the next 25 bar combinations
lastpivot_bar = 0 # location of immidiately previous SPH/SPL
master_df['SMALL_PIVOTS'] = 0 # -1 for SPL, 1 for SPH and 0 for no pivot
master_df['SPH_bars'] = np.nan
master_df['SPL_bars'] = np.nan
# iterating over dataset
for i in range(master_df.shape[0] - 2):
try:
# if pivot_found then it breaks the loop - set for False for looking for SPH/SPL
pivot_found = False
# combinations of 3 bars sorted by the sum of locations. 1st bar in combination of 3 will always be Anchor
combis = sorted(combinations(np.arange(start_bar, start_bar + 3 + k), 3), key=sum)
combis = sorted(combis, key=max)
# iterate over all combinations
for c in combis:
lookup_df = master_df.loc[list(c)]
print('Trying combination :', c)
try:
# if SPL is set to True, that means look for SPL else look for SPH
if SPL:
a, b1, new_anchor, pivot_pt = getSPL(lookup_df, master_df, lastpivot_bar)
start_bar = new_anchor # new anchor B2 of previous SPH
lastpivot_bar = pivot_pt # Location updated since SPL found
SPL = False # set to false to stop looking for SPL
master_df.loc[pivot_pt, 'SMALL_PIVOTS'] = -1 # updated dataset
master_df.loc[a, 'SPL_bars'] = 'A' # updated dataset
master_df.loc[b1, 'SPL_bars'] = '1' # updated dataset
master_df.loc[new_anchor, 'SPL_bars'] = '2' # updated dataset
pivot_found = True
else:
a, b1, new_anchor, pivot_pt = getSPH(lookup_df, master_df, lastpivot_bar)
start_bar = new_anchor # new anchor B2 of previous SPL
lastpivot_bar = pivot_pt # Location updated since SPH found
SPL = True
master_df.loc[pivot_pt, 'SMALL_PIVOTS'] = 1
master_df.loc[a, 'SPH_bars'] = 'A' # updated dataset
master_df.loc[b1, 'SPH_bars'] = '1' # updated dataset
master_df.loc[new_anchor, 'SPH_bars'] = '2' # updated dataset
pivot_found = True
except Exception as e:
pass
# break loop if pivot found
if pivot_found:
break
if start_bar >= master_df.shape[0] - 10:
break
except KeyError:
break
# -------------------- MARKING LOGIC END -------------------- #
# plotting bars
master_df['datetime_formatted'] = pd.to_datetime(master_df['datetime']).dt.strftime('%H:%M %m-%d-%Y')
master_df['pivot_text'] = np.nan
master_df.loc[master_df.SMALL_PIVOTS == -1, 'pivot_text'] = 'SPL'
master_df.loc[master_df.SMALL_PIVOTS == 1, 'pivot_text'] = 'SPH'
master_df['pivot_y'] = (master_df.low + master_df.high)/2
master_df['pivot_y'][master_df.SMALL_PIVOTS == -1] = master_df.low - 30
master_df['pivot_y'][master_df.SMALL_PIVOTS == 1] = master_df.high + 25
print(master_df.head())
# -------------------- LARGE PIVOT MARKING LOGIC START -------------------- #
# read small pivot markings
master = master_df.copy()
master = master.tail(2000).reset_index(drop=True)
print(master.head(10)[['pivot_text']])
print(master.columns)
# Find whether current SPH was broken
sph = master.loc[master.pivot_text == 'SPH'][['datetime', 'pivot_text','high']]
sph['next_sph'] = sph.high.shift(-1)
sph['broken_sph'] = (sph.next_sph > sph.high).astype(int)
# Find whether current SPL was broken
spl = master.loc[master.pivot_text == 'SPL'][['datetime', 'pivot_text','low']]
spl['next_spl'] = spl.low.shift(-1)
spl['broken_spl'] = (spl.next_spl < spl.low).astype(int)
master = (master
.merge(sph[['datetime','broken_sph']], on='datetime', how='left')
.merge(spl[['datetime','broken_spl']], on='datetime', how='left'))
# Broken Small Pivot - combines SPH, SPL breaks
master.broken_sph.fillna(0, inplace=True)
master.broken_spl.fillna(0, inplace=True)
master['broken'] = master[['broken_sph', 'broken_spl']].max(axis=1)
# Identifies when the SPH or SPL was broken
pivots = master[~master.pivot_text.isnull()][['datetime']].reset_index()
pivots['next_pivot'] = pivots['index'].shift(-1)
pivots['next_same_pivot'] = pivots['index'].shift(-2)
master = master.merge(pivots, on='datetime', how='left')
for i in range(master.shape[0]):
if master.loc[i, 'broken'] == 1:
if master.loc[i, 'pivot_text'] == 'SPH':
high = master.loc[i, 'high']
df = master.loc[master.loc[i, 'next_pivot']: master.loc[i, 'next_same_pivot']][['datetime','high']]
for j in df.index:
if df.loc[j, 'high'] > high:
master.loc[i, 'broken_at'] = df.loc[j, 'datetime']
break
else:
low = master.loc[i, 'low']
df = master.loc[master.loc[i, 'next_pivot']: master.loc[i, 'next_same_pivot']][['datetime', 'low']]
for j in df.index:
if df.loc[j, 'low'] < low:
master.loc[i, 'broken_at'] = df.loc[j, 'datetime']
break
# Identifies the broken pivot was first of its kind to be broken
broken_cnt = master[master.pivot_text.isin(['SPH','SPL']) & (master.broken == 1)][['datetime','pivot_text','broken']]
broken_cnt['prev_pivot'] = broken_cnt.pivot_text.shift(1)
broken_cnt['break_order'] = (broken_cnt.prev_pivot != broken_cnt.pivot_text).astype(int)
master = master.merge(broken_cnt[['break_order']], left_index=True, right_index=True, how='left')
master.break_order.fillna(0, inplace=True)
print(master[['datetime','high','low','pivot_text','broken','break_order']].head(10))
# Setting Looking for LPH, LPL to True depending on which small pivot was broken
start_loc = 0
lookup_start = master[(master.pivot_text.isin(['SPH','SPL'])) & (master.broken == 1)]
if lookup_start.iloc[0]['pivot_text'] == 'SPH':
LPL, LPH = True, False
else:
LPL, LPH = False, True
# Marking Large Pivots - Looks at series of SPH after an SPL
# break to mark the highest point as LPH and vice versa for LPL
for i in range(master.shape[0]):
if i >= start_loc:
if LPL:
print('Looking for LPL')
if (master.loc[i, 'pivot_text'] == 'SPH') & (master.loc[i, 'broken'] == 1) & (master.loc[i, 'break_order'] == 1):
break_loc = master[master.datetime == master.loc[i, 'broken_at']].index[0]
df = master.loc[start_loc:break_loc]
min_lpl = df[df.pivot_text == 'SPL'].low.min()
lpl_loc = df[(df.pivot_text == 'SPL') & (df.low == min_lpl)].index[0]
print(start_loc, break_loc, lpl_loc)
master.loc[lpl_loc, 'LARGE_PIVOT'] = 'LPL'
start_loc = lpl_loc
LPL, LPH = False, True
else:
print('Looking for LPH')
if (master.loc[i, 'pivot_text'] == 'SPL') & (master.loc[i, 'broken'] == 1) & (master.loc[i, 'break_order'] == 1):
break_loc = master[master.datetime == master.loc[i, 'broken_at']].index[0]
df = master.loc[start_loc:break_loc]
max_lph = df[df.pivot_text == 'SPH'].high.max()
lph_loc = df[(df.pivot_text == 'SPH') & (df.high == max_lph)].index[0]
print(start_loc, break_loc, lph_loc)
master.loc[lph_loc, 'LARGE_PIVOT'] = 'LPH'
start_loc = lph_loc
LPL, LPH = True, False
# -------------------- LARGE PIVOT MARKING LOGIC END -------------------- #
# saving markings to csv
master.to_csv('LARGE_PIVOT_MARKINGS_30MIN.csv', index=False)
# Plotting
plot_df = master.head(400)
plot_df.pivot_text.fillna('', inplace=True)
y_plot_range = (plot_df.high.max() - plot_df.low.min())/600
plot_df['y_plot_range'] = y_plot_range
plot_df['large_pivot_y'] = (plot_df.high + plot_df.low)/2
plot_df.loc[plot_df.LARGE_PIVOT == 'LPH', 'large_pivot_y'] = plot_df.high + y_plot_range*30
plot_df.loc[plot_df.LARGE_PIVOT == 'LPL', 'large_pivot_y'] = plot_df.low - y_plot_range*30
plot_df['broken_at_formatted'] = pd.to_datetime(plot_df['broken_at']).dt.strftime('%H:%M %m-%d-%Y')
# dataframe for horizontal lines to mark first breaks of SPL and SPH
LPH_indicator = plot_df[(plot_df.pivot_text.isin(['SPL','SPH'])) & (plot_df.break_order == 1) & (plot_df.broken == 1)]
LPH_indicator = LPH_indicator[['datetime_formatted','broken_at_formatted','pivot_text','high','low']]
LPH_indicator['y0'] = LPH_indicator.high
LPH_indicator.loc[LPH_indicator.pivot_text == 'SPL', 'y0'] = LPH_indicator.low
# Shapes to mark small pivot breaks
large_pivot_breaks = []
for i in LPH_indicator.index:
large_pivot_breaks.append(
dict(type="line", xref="x", yref="y",
x0=LPH_indicator.loc[i, 'datetime_formatted'],
y0=LPH_indicator.loc[i, 'y0'],
x1=LPH_indicator.loc[i, 'broken_at_formatted'],
y1=LPH_indicator.loc[i, 'y0'],
line_width=1,
line_color='white')
)
# pivot hover text
hover_text = []
for i in range(plot_df.shape[0]):
hover_text.append('<b style="font-size:16px">' + plot_df.pivot_text[i] + "</b><br>" +
'<b>' + str(plot_df['datetime_formatted'][i]) + '</b>' + "<br>" +
'O: ' + "%0.2f" % plot_df['open'][i] + "<br>" +
'H: ' + "%0.2f" % plot_df['high'][i] + "<br>" +
'L: ' + "%0.2f" % plot_df['low'][i] + "<br>" +
'C: ' + "%0.2f" % plot_df['close'][i] + "<br>")
# plot candlestick chart
plot_data = [
go.Ohlc(
x=plot_df['datetime_formatted'],
open=plot_df['open'],
high=plot_df['high'],
low=plot_df['low'],
close=plot_df['close'],
text=hover_text,
hoverinfo='text',
increasing_line_color='rgb(46, 204, 113)',
decreasing_line_color='rgb(231, 76, 60)',
name='OHLC'),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.pivot_y,
mode="text",
name="Small Pivots",
text=plot_df.pivot_text.values,
textposition="middle center",
textfont=dict(size=12),
hoverinfo='skip'
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.low - y_plot_range*10,
mode="text",
name="SPL Bars",
text=plot_df.SPL_bars.values,
textposition="middle center",
textfont=dict(size=10, color='rgb(254, 202, 87)'),
hoverinfo='skip',
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.high + y_plot_range*10,
mode="text",
name="SPH Bars",
text=plot_df.SPH_bars.values,
textposition="middle center",
textfont=dict(size=10, color='rgb(10, 189, 227)'),
hoverinfo='skip'
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.large_pivot_y,
mode="text",
name="LARGE PIVOTS",
text=plot_df.LARGE_PIVOT.fillna('').values,
textposition="middle center",
textfont=dict(size=14, color='yellow'),
hoverinfo='skip'
),
]
fig = go.Figure(data=plot_data)
fig.update_layout(xaxis_rangeslider_visible=False,
margin=dict(l=50, r=0, b=150, t=100, pad=0),
height=900,
template='plotly_dark',
title='NIFTY 50 Futures',
paper_bgcolor='black',
plot_bgcolor='black',
hovermode="x",
hoverlabel_align='right',
shapes=large_pivot_breaks[:-1]
)
fig.update_xaxes(type='category', gridcolor='rgba(255, 255, 255, 0.1)', color='rgb(127, 140, 141)')
fig.update_yaxes(gridcolor='rgba(255, 255, 255, 0.1)', color='rgb(127, 140, 141)')
fig.show()
```
```python
import pandas as pd
import numpy as np
from datetime import timedelta
import plotly.graph_objs as go
from itertools import combinations
import plotly.io as pio
# read dataset
master_df = pd.read_csv('../../../Datasets/NSE_NIFTY_DEC312020_30M_TVDownload.csv')
master_df['datetime'] = pd.to_datetime(master_df['time'], unit='s') + timedelta(hours=5.5)
master_df['date'] = master_df['datetime'].dt.date
master_df = master_df.tail(2000).head(500).reset_index(drop=True)
master_df['bar'] = master_df.reset_index(drop=True).index
print(master_df.head())
# -------------------- MARKING LOGIC START -------------------- #
def getSPL(df, main_df, lastSPHbar):
# higher closes
if (df.iloc[2].close > df.iloc[0].close) & (df.iloc[1].close > df.iloc[0].close):
# higher highs
if (df.iloc[2].high > df.iloc[0].high) & (df.iloc[1].high > df.iloc[0].high):
B2 = df.iloc[2].bar
B1 = df.iloc[1].bar
A = df.iloc[0].bar
temp_df = main_df.loc[lastSPHbar + 1: B2]
minLow = temp_df.low.min()
P = temp_df.loc[temp_df.low == minLow, 'bar'].index[0]
print('SPL Found @', P, 'New Anchor @', B2, 'Lowest :', minLow)
return A, B1, B2, P
def getSPH(df, main_df, lastSPLbar):
# lower closes
if (df.iloc[2].close < df.iloc[0].close) & (df.iloc[1].close < df.iloc[0].close):
# lower lows
if (df.iloc[2].low < df.iloc[0].low) & (df.iloc[1].low < df.iloc[0].low):
B2 = df.iloc[2].bar
B1 = df.iloc[1].bar
A = df.iloc[0].bar
temp_df = main_df.loc[lastSPLbar + 1: B2]
maxHigh = temp_df.high.max()
P = temp_df.loc[temp_df.high == maxHigh, 'bar'].index[0]
print('SPH Found @', P, 'New Anchor @', B2, 'Highest :', maxHigh)
return A, B1, B2, P
start_bar = 0 # Next Anchor
SPL = False # if this is False, it will look for SPH
k = 35 # finds SPH/SPL in the next 25 bar combinations
lastpivot_bar = 0 # location of immidiately previous SPH/SPL
master_df['SMALL_PIVOTS'] = 0 # -1 for SPL, 1 for SPH and 0 for no pivot
master_df['SPH_bars'] = np.nan
master_df['SPL_bars'] = np.nan
# iterating over dataset
for i in range(master_df.shape[0] - 2):
try:
# if pivot_found then it breaks the loop - set for False for looking for SPH/SPL
pivot_found = False
# combinations of 3 bars sorted by the sum of locations. 1st bar in combination of 3 will always be Anchor
combis = sorted(combinations(np.arange(start_bar, start_bar + 3 + k), 3), key=sum)
combis = sorted(combis, key=max)
# iterate over all combinations
for c in combis:
lookup_df = master_df.loc[list(c)]
print('Trying combination :', c)
try:
# if SPL is set to True, that means look for SPL else look for SPH
if SPL:
a, b1, new_anchor, pivot_pt = getSPL(lookup_df, master_df, lastpivot_bar)
start_bar = new_anchor # new anchor B2 of previous SPH
lastpivot_bar = pivot_pt # Location updated since SPL found
SPL = False # set to false to stop looking for SPL
master_df.loc[pivot_pt, 'SMALL_PIVOTS'] = -1 # updated dataset
master_df.loc[a, 'SPL_bars'] = 'A' # updated dataset
master_df.loc[b1, 'SPL_bars'] = '1' # updated dataset
master_df.loc[new_anchor, 'SPL_bars'] = '2' # updated dataset
pivot_found = True
else:
a, b1, new_anchor, pivot_pt = getSPH(lookup_df, master_df, lastpivot_bar)
start_bar = new_anchor # new anchor B2 of previous SPL
lastpivot_bar = pivot_pt # Location updated since SPH found
SPL = True
master_df.loc[pivot_pt, 'SMALL_PIVOTS'] = 1
master_df.loc[a, 'SPH_bars'] = 'A' # updated dataset
master_df.loc[b1, 'SPH_bars'] = '1' # updated dataset
master_df.loc[new_anchor, 'SPH_bars'] = '2' # updated dataset
pivot_found = True
except Exception as e:
pass
# break loop if pivot found
if pivot_found:
break
if start_bar >= master_df.shape[0] - 10:
break
except KeyError:
break
# -------------------- MARKING LOGIC END -------------------- #
# plotting bars
master_df['datetime_formatted'] = pd.to_datetime(master_df['datetime']).dt.strftime('%H:%M %m-%d-%Y')
master_df['pivot_text'] = np.nan
master_df['pivot_text'][master_df.SMALL_PIVOTS == -1] = 'SPL'
master_df['pivot_text'][master_df.SMALL_PIVOTS == 1] = 'SPH'
master_df['pivot_y'] = (master_df.low + master_df.high)/2
master_df['pivot_y'][master_df.SMALL_PIVOTS == -1] = master_df.low - 30
master_df['pivot_y'][master_df.SMALL_PIVOTS == 1] = master_df.high + 25
print(master_df.head())
plot_df = master_df.copy()
# plot candlestick chart
fig = go.Figure(data=[
go.Ohlc(
x=plot_df['datetime_formatted'],
open=plot_df['open'],
high=plot_df['high'],
low=plot_df['low'],
close=plot_df['close'],
increasing_line_color='rgb(46, 204, 113)',
decreasing_line_color='rgb(231, 76, 60)', name='OHLC'),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.pivot_y,
mode="text",
name="Small Pivots",
text=plot_df.pivot_text,
textposition="middle center",
textfont=dict(size=12)
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.low - 12,
mode="text",
name="SPL Bars",
text=plot_df.SPL_bars,
textposition="middle center",
textfont=dict(size=10, color='rgb(254, 202, 87)'),
),
go.Scatter(
x=plot_df['datetime_formatted'],
y=plot_df.high + 10,
mode="text",
name="SPH Bars",
text=plot_df.SPH_bars,
textposition="middle center",
textfont=dict(size=10, color='rgb(10, 189, 227)'),
)
])
fig.update_layout(xaxis_rangeslider_visible=False,
margin=dict(l=50, r=0, b=100, t=100, pad=0),
height=900,
template='plotly_dark',
title='Markings NIFTY 50 DEC FUTURES',
paper_bgcolor='black',
plot_bgcolor='black'
# paper_bgcolor='rgb(48, 57, 82)',
# plot_bgcolor='rgb(48, 57, 82)'
)
fig.update_xaxes(type='category', gridcolor='rgba(255, 255, 255, 0.1)', color='rgb(127, 140, 141)')
fig.update_yaxes(gridcolor='rgba(255, 255, 255, 0.1)', color='rgb(127, 140, 141)')
pio.write_image(fig, 'markings_2000.svg', width=1920*5, height=1080*2, format='svg')
fig.show()
master_df.to_csv('markings_2000.csv', index=False)
```
!! Output
<img src='https://lh3.googleusercontent.com/aWCHiERwaEghcwf4sRVtFbALMcCtukQ_pY9hYLcWM0L8rCs0LBR8VATvQjmeCHPlu0AGep77rADk6gy4_eRM_Zd9k3w9Mr5fSIXkgfRxW4i-UZXBLTb8xo8F-XkW1AWofjCstv83bNShNEADmgLG3GBP8p6_ybcnqQlC7pWnD5ziN_S-EUTijI3lG4S-ewbZ0yDkRobnl60G4HaCSK3mITChkwaN6IRKXhfndlGwGjurmRQfmx77mRjdambJoBhXTb5acri0Cwj1BGuREji4nWJs9D9WTAk_AxcOLw5uqiAIuA9o7f3ekN0xOuMmmdJJaDtgYB0G1rZPVdCGObL_P7tOORRus-eTySVN6oktMZ_jcNKcnjcWQRVikpKUOdW6M9mqOjiUAaInrKxDt0q8USD5wFVYnkpJr4vVEHwSnKBopcs5PnY_5Qrga6HZ9HepnXLlenmEdsC1Fwq3AZ2Hd7_-6hnHFQu9H61ID2rm0fw56oukCLtN_wo5yQCtLLJJKUFyR1u1Fg7jNEpZiREqZkgmUtAgXXQcIaOaNc2EB4QU3A5ag7j_rcvIYCl5M1XbzRnyOrZBVQj8iHqU217Cj9ttRZ2LAWFs6b12QUvPa2A8HpqfeYUYIoRXl-nc9tFXxEmtS3Skm5jttrO-rCVQHf2IAmv9GJc6xJDG68JQVbVWTt922426zGDLLRQTW7o=w1750-h497-no?authuser=0' />
* Funds run on a preset strategy or algorithm
* Invests more when markets are cheap and less when markets are expensive
''Synthetic Minority Oversampling Technique'' or ''SMOTE'' is a type of [[Data Augmentation]] for the minority class
randomly select data point from minority class $$\rightarrow$$ find [[K Nearest Neighbors]] $$\rightarrow$$ randomly select neighbor from minority class $$\rightarrow$$ genereate synthetic example at a randomly selected point between the two examples in feature space
!! How it works?
SMOTE first selects a minority class instance $$a$$ at random and finds its [[K Nearest Neighbors]] of minority class. The synthetic instance is then created by choosing one of the [[K Nearest Neighbors]] $$b$$ at random and connecting $$a$$ and $$b$$ to form a line segment in the feature space. The synthetic instances are generated as a convex combination of the two chosen instances $$a$$ and $$b$$.
```python
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=2)
X_train_res, y_train_res = sm.fit_sample(X_train, y_train.ravel())
```
!! Oversampling Strategy
By default, SMOTE will oversample all classes to have the same number of examples as the class with the most examples. Can use a different oversampling strategy by providing a dictionary
```python
# transform the dataset
strategy = {0:100, 1:100, 2:200, 3:200, 4:200, 5:200}
oversample = SMOTE(sampling_strategy=strategy)
X, y = oversample.fit_resample(X, y)
```
!! Extensions
''1. Borderline SMOTE''
<<<
Over sampling only those instances where the model has difficulty in separating different classes across the decision boundary created by KNN model. The authors also describe a version of the method that also oversampled the majority class for those examples that cause a misclassification of borderline instances in the minority class. This is referred to as ''Borderline-SMOTE1'', whereas the oversampling of just the borderline cases in minority class is referred to as ''Borderline-SMOTE2''.
```python
from imblearn.over_sampling import BorderlineSMOTE
oversample = BorderlineSMOTE()
X, y = oversample.fit_resample(X, y)
```
<<<
''2. Borderline-SMOTE SVM''
<<<
alternative of Borderline-SMOTE where an SVM algorithm is used instead of a KNN to identify misclassified examples on the decision boundary.
```python
from imblearn.over_sampling import SVMSMOTE
oversample = SVMSMOTE()
X, y = oversample.fit_resample(X, y)
```
<<<
''3. Adaptive Synthetic Sampling (ADASYN)''
<<<
generating synthetic samples inversely proportional to the density of the examples in the minority class. i.e. generate more synthetic examples in regions of the feature space where the density of minority examples is low, and fewer or none where the density is high
```python
from imblearn.over_sampling import ADASYN
oversample = ADASYN()
X, y = oversample.fit_resample(X, y)
```
Focusing in low density could mean focusing on outliers - may result in worse model performance
<<<
!! References
* [ext[SMOTE for Imbalanced Classification with Python|https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/]] on [[Machine Learning Mastery]]
* [ext[Multi-Class Imbalanced Classification|https://machinelearningmastery.com/multi-class-imbalanced-classification/]] on [[Machine Learning Mastery]]
# [[Time Management]]
# [[Change Management]]
# [[Communication Skill]]
# [[Story Telling Course]]
# [[Charisma]]
# [[The Complete Resume,LinkedIn Course]]
# [[Personal Branding Mastery]]
# [[Ninja Writing]]
# [[The Power Is Deep Listening]]
# [[Influencing And Persuading]]
# [[Emotional Intelligence At Work]]
# [[Virtual Teams]]
# [[Critical Thinking]]
# [[Creativity]]
# [[Presenting With Confidence]]
# [[Ask Better Questions]]
# [[Negotiation Secrets]]
# [[Assertiveness 101]]
# [[Write Better E-mails]]
# [[Giving & Receiving Feedbacks]]
# [[Be A Great Mentor]]
# [[Interview Training]]
# [[Inspirational Leadership Skills]]
# [[Team Facilitation]]
# [[Become a Master at Conflict Management]]
# [[Effective Delegation]]
# [[New Manager]]
# [[Management Skills]]
# [[Team Leadership]]
!!! 1. SparkContext
* First component and main entry point for spark functionality. Connects the cluster with the application. If we like to use lower level abstractions we will use `SparkContext`
!!! 2. SparkConf
* To create a `SparkContext` we first need a `SparkConf` object to specify some information about the application such as name or master IP Address. Use `setmaster("local")` for running local server.
```python
from pyspark import SparkContext, SparkConf
configure = SparkConf.setAppName("name").setMaster("IP Address")
sc = SparkContext(conf = configure)
```
!!! 3. SparkSession
* To read data frames we need Spark SQL equivalent `SparkSession`
* `getOrCreate()` returns the existing session if the session is already loaded otherwise creates a new session.
```python
from pyspark.sql import SparkSession
spark = SparkSession \
.builder\
.appName('app-name') \
.config("config option", "config value")
.getOrCreate()
```
,,[[07 July 2020]],,
!! Introduction
<<<
Gifted speakers are born and effective speakers are made
<<<
!! Give your audience what they need to know
* Don't - They tell them too much. ''Less is more ''- If they want more info they will ask for it. Tell them what they need to know and not everything you know
* ''When you are crisp, they retain more''
* Systematic way - Listener centered communication
** Start with what's important to you - that is speaker centered communication. They don't care about what you are going to present. ''Lead with what is their interest''
** Start with the hook - get them interest - now tell them your approach and the ''solution''.
!! Identify a need or a challenge
* Get attention - start with something positive (what's the dream or the goal). Identify what's in the way of that goal. Now you bring in your recommendation.
* Start with overview and the agenda. sandwich - save the filling for the body not the beginning
!! Change your focus to calm your nerves
* ''Get over yourself, It is not about you, it's about the audience'' - If you are nervous, you are self-centered. It is all about me, myself and I. Oh, I hope I don't lose my train of thought.
* If you are nervous, you are living in the future. You are envisioning everything that could go wrong. Bring your self to the present by focusing on your breath.
* If you have butterflies, it is normal. it is just [[Adrenaline]]. It is only good, as it is preparing your for a performance.
!! Your audience wants you to succeed
* We overthink that the audience is our enemy, but they are not.
* if you look at something that is looking hostile, don't look at them. go look at the friendly faces
* If it goes bad, the learn from it. Find something that worked. May as well be, //I stepped up and I tried//
!! Align your body, tone and words.
* Executive presence
* People with executive presence are fully aligned with their body, their tone and their words - giving off one consistent message. Because if one of these goes out of sync, given up a double message, the audience gets confused and so body language becomes the default.
* Body, tone and words aligned - means integrity. Gives confidence.
!! Project power with body language
* Eye connection not eye contact - looking at one person at a time for about a sentence or two or 3-5 sec
* Builds trust - makes connection
* hands above the waist and keep them in the gesture box - you look more confident. ''Hands below the table make you look tentative and not confident''
* Gesture - should not be in perpetual motion.
* If the hands are above the waist the whole time that's better, but if they fall down bring them up.
!! Speak in sync with your audience
Which provides the greatest amount of leverage - improved knockout power without a whole lot of effort?
* need to project your voice
* Meta message is in the voice - Match your tone to the audience
* lacked confidence leads to whimpy words or weak speak - when your goal is to persuade, you want to use powerful langugage. ''Don't use words like hopefully''. Not I feel, but I am confident.
* Conflict resolution - here you want to use a softer language, like //you may want to consider//
* Knockout presenters - they size their audience, they pace them and they speak their language.
** Don't use slangs with formal
** Don't use lot of vocabulary with people who are folksy
!! Plan for your biggest fears
How do you know you are prepared?
* If you are going to be in a room, that you are not in often, get their early and practice in the room
* What could go wrong?
** ''What if you trip over? - plan for that - recover with grace - have some one liners. Like, //I was practicing that entrance for weeks//''. This will break the tension and allow you to move on.
** plan for your biggest fears - [[Murphy's Law]]
** plan recovery strategies
!! Handling Difficult Questions
* ''If you don't know the answer, don't fake it. If somebody in the room knows the answer, you will lose all credibility'' - //I am not a 100% sure of that, but let me get back to you?// -most accepted answer
* SME - deflect it to subject matter expert. //I am not a 100% sure of that, but I think Pete here knows it...//
** Have to be sure that he/she is the expert
** you lose the control - so use it sparingly
* Do what politicians do, answer the part where you do know //I am not a 100% sure of that, but what I do know is...//
* it's okay not to know the answer as long as you have a response - ''Don't shrug shoulders and say //'I don't know'//''
,,Tags: [[LinkedIn Learning]] | [[04 July 2021]],,
!! Summary
* a linear relationship between two variables is NOT assumed
* If you are unsure of the distribution and possible relationships between two variables use Spearman correlation coefficient
* covariance computed on rank of samples instead of samples themselves (like in [[Pearson’s Correlation]])
!! Details
Two variables may be related by a nonlinear relationship. Further, the two variables being considered may have a non-Gaussian distribution. In this case, the Spearman’s [[Correlation]] coefficient (named for Charles Spearman) can be used to summarize the strength between the two data samples
Instead of calculating the coefficient using covariance and standard deviations on the samples themselves, these ''statistics are calculated from the relative rank of values on each sample''. This is a common approach used in non-parametric statistics, e.g. statistical methods where we do not assume a distribution of the data such as Gaussian.
Spearman's correlation coefficient = `covariance(rank(X), rank(Y)) / (stdv(rank(X)) * stdv(rank(Y)))`
!!! Python
```python
from scipy.stats import spearmanr
corr, _ = spearmanr(data1, data2)
```
!!! References
* [ext[How to Calculate Correlation Between Variables in Python|https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/]] from [[Machine Learning Mastery]]
,,[[18 July 2020]],,
!! Summary of trends
<<<
* Specialty chemicals 20% of chemical industry remaining 80% is commodity chemicals
* High margin business with barriers to entry with intellectual property rights, specific use cases and R&D requirements
* Opportunities for India (at least till 2025) lie in increasing expansion and eat market share from china, currently exporting 20-25% of the demand globally.
** China's plant's don't adhere to pollution standards will have to be closed - Bluesky policy
** US-China tradewar
* CAGR projection - 10-12% till FY25
<<< [[16 May 2021]]
!! Why speciality chemicals is booming
<<<
China's chemical industry production and export is decreasing because of Chain's war with controlling pollution which was triggered as a result of release of the documentary ''Under the dome''. This is because chemical industry is the most polluting industry.
Meanwhile, Indian specialty chemical industry had invested in eco friendly tech, which keeps pollution check. India can now answer the call on speciality chemicals, because of demand outside and inside the country. Hence the ''stocks are going up''
<<< [[An illustrative guide explaining the rise of the Speciality Chemical Segment|https://finshots.in/markets/specialty-chemical-segment]] | [[15 May 2021]]
A brain surgery in which two hemispheres are disconnected from each other. Normally the two hemispheres are connected by a super-highway called the [[Corpus Callosum]] which allows the left and right halves to coordinate and work in concert.
Severing [[Corpus Callosum]] can lead to [[Alien Hand Syndrome]]
* Kind of [[Cryptocurrency]] backed by a reserve asset / [[FIAT]] currencies
* Not as volatile as other coins like [[Bitcoin (BTC)]] which can witness swings of 10% in any direction making it unsuitable for public use
* Offers best of both words - instant processing, security and privacy of payments
!! How is price stability achieved
* [[FIAT]] currencies are pegged to underlying asset like gold which makes them less ameanable to swings
* If swings happen central banks control the demand and supply to manage swings
!! Types of Stablecoins
!!! 1. [[Fiat-Collateralized Stablecoins]]
* maintain fiat currency reserve as collateral to issue suitable crypto coins
* [[Tether (USDT)]] and [[TrueUSD]] are backed by dollar deposits
!!! 2. [[Crypto-Collateralized Stablecoins]]
* backed by other cryptos
* since cryptos are volatile, large numbers of cryptos are required to issue small number of stablecoins - ''over-collateralized''
* frequent audits and monitoring adds to price stability
* MakerDA's DAI ([[DAIUSD]]) is pegged against the U.S. dollar and allows for using a basket of crypto-assets as a reserve, backed by [[Ethereum]]
!!! 3. [[Algorithmic Stablecoins]]
* [[Basecoin]] uses consensus mechanism to increase or decrease supply of tokens on need basis.
* Similar to printing money by central banks to maintain supply and demand.
* can be achieved by running autonomous [[Smart Contract]] on a decentralized platform
!! References
* [[Stablecoin|https://www.investopedia.com/terms/s/stablecoin.asp]] on [[Investopedia]]
! Blending models in Machine Learning
!!! 1. Simple Averaging
* `(p) = (pred1 + pred2 + ... + predn) / n`
!!! 2. Rank Averaging
* Bring the predictions to the same scale, e.g. with `scipy.stats.rankdata` function. This will turn scores into ranks, i.e. [0.7, 0.15, 0.1, 0.2, 0.05] will be turned into [5, 3, 2, 4, 1].
* Used in metrics where actual rank ordering matters instead of actual values
* Public notebook on [[Kaggle]] - [ext[Improve blending using Rankdata|https://www.kaggle.com/niteshx2/improve-blending-using-rankdata]]
* Another Notebook on [[Kaggle]] - [ext[Public Blender with Rank Data 0.946+ | https://www.kaggle.com/muhakabartay/public-blender-with-rank-data-0-946]]
!!! 3. Weighted Averaging
* `(p) = (wt1 x Pred1 + wt2 x Pred2 + … + wtn x Predn)` where, `n` is the number of models
* sum of weights `wt1 + wt2 + … + wtn = 1`
!!! 4. Stretch Averaging
* Stretch predictions using min and max values first, before averaging `Pred = (Pred - min(Pred)) / (max(Pred) - min(Pred))`
!!! 5. Power Averaging
* Choose a power p = 2, 4, 8, 16 `(p) = (Pred1^p + Pred2^p + … + Predn^p) / n `
* Note: Power Averaging to be used only when all the models are highly correlated, otherwise your score may become worse.
!!! 6. Power Averaging with weights:
* `(p) = (wt1 x Pred1^p + wt2 x Pred2^p + … + wtn x Predn^p)`
!! References
* [[Machine Learning Mastery]] - [ext[How to Develop a Stacking Ensemble for Deep Learning Neural Networks in Python With Keras|https://machinelearningmastery.com/stacking-ensemble-for-deep-learning-neural-networks/]]
* [[Medium]] - [ext[Reaching the depths of (power/geometric) ensembling when targeting the AUC metric|https://medium.com/data-design/reaching-the-depths-of-power-geometric-ensembling-when-targeting-the-auc-metric-2f356ea3250e]]
,,[[10 July 2020]],,
* high [[Inflation]]
* High [[Unemployment]]
* Low [[GDP]] Growth
Combine these three and we have stagflation.
* Last stagflation was in 1970s and the world did not grow for almost a decade
,,[[01 May 2022]],,
People tend not to question already established things
[[07 April 2021]]
<embed src="https://d2z0k43lzfi12d.cloudfront.net/blog/vcdn302/wp-content/uploads/2019/02/stick-with-it-challenge_en-3.pdf" width="100%" height="400">
Gradient descent is computationally expensive. Usually a random point is picked and gradient is computed for that iteration. Another random point is selected in the next itrataion and the gradient is computed. Computing gradients single point at a time is very noisy. Neither we can compute gradients for full dataset at once. Taking the middle ground - [[Batch Gradient Descent]]
$$
\frac{\delta J (w)}{\delta w} = \frac{1}{B} \sum_{k=1}^{B} \frac{\delta J_k(w)}{\delta w}
$$
where, $$ B$$ stands for ''batch size''. Batch computation helps in
* setting a larger learning rate
* smoother convergence
* can parallelize computation
* Just like [[Depository]], [[Stock Exchange]]s are too not client facing
* Stock Brokers or Trading Members renders services to end client
* Stock splits splits the existing number of shares. Unlike [[Bonus Issue]], the face value of the stock is also split.
* Market capitalisation and investment value remains the same
!! Buy
* [[Asian Paints]] - strong support at 2880 - already tested - buy
** fallen below expected levels due to slightly bad results on account of falling margins but revenue went up 30% meaning that it is crushing competetion and trying to suffocate them. Will take price hikes from next quarter to improve margins - so remain bullish on this one - [[CNBC|https://www.cnbctv18.com/market/stocks/saurabh-mukherjea-stock-ideas-marcellus-investment-adds-stock-how-asian-paints-is-crushing-competition-11194482.htm]]
* [[Alkyl Amines]] - consolidating at May'21 levels - near 3600 - test support at 3532 - can buy
* [[Pidilite]] - strong support at 2300 - currently testing it - also a weekly 20 EMA
* [[Garware Technical Fibres]] - broken strong support at 3550 - standing near support and weekly 20 ema
!! Wait for confimation
* [[LTTS]] support near 4450 - stock near 4520 - already tested this support - wait for upward confirmation
* [[DMART]] - support at 4450 - price at 4400 below this support - wait for it to hit bottom at 4200 and then buy
* [[NAUKRI]] - standing support at 5890 also a 20EMA weekly - can buy if goes up - wait for confirmation
!! Keep an eye
* [[TCS]] wait for it to converge at 3400
* [[Moldtek Packaging]] - wait for it to break small pivot 650 can converged at 600 - buy at this level
* [[ICICI Securities]] - Broken support at 790 and another at 765 - wait for it to reach 716 also a 20EMA weekly
!! Can consider buying
* [[Ultramarine & Pigments]] - test 410 support level - immediate resistance at 440
*
* For [[HDFC]] the core business is to give loan. And their loan book growths is very high at 16%.
* Compounded profit growth is 15%.
* The growth shrunk last year because of the one time restructuring of loans governed by RBI. Almost the entire NBFC and banking space was hit - not HDFC's fault
!! [[HDFC Bank]]
* [[Saurabh Mukherjea]] mentions that HDFC bank has gained market share in 3 years than all private sectors and SBI combined
* Value migration from PSU to private banks
* [[Net Interest Margin (NIM)]] is high is because of CASA franchise
* ''Does not have much moat left around products'' compared to [[Kotak Mahindra Bank]], [[Axis Bank]], [[ICICI Bank]] etc
!! [[HDFC AMC]]
* Stock has fallen 40% from All time highs and 30% from recent highs of 3300 to 2200
* Revenues have stagnated but net profit increasing - the problem is industry wide and not an issue for this company alone. * 5 year profit growth has been at 22% CAGR
!!! SHould we be worried about decreasing market share?
* Industry is expanding
* This is a high margin business as operating margins are as high as 80%
* Great number of new products are being launched in this space
!! [[HDFC Life]]
* Industry wide problem of quarterly sales growth declining post COVID. ''Profits started stagnating - claims went up exponentially''. ''Increased premiums to improve profitability''
!! Reference
<iframe width="560" height="315" src="https://www.youtube.com/embed/h10GygeLL8I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,[[13 February 2022]],,
* Maximum Adverse Excursion
* Maximum Favorable Excursion
* There are two ways to persuade people
** Using conventional rhetoric = slides/[[Statistics]]/Facts/quotes
** Uniting idea with [[Emotion]] = tell a story
* Any intelligent person can make a list, but, it demands vivid insight and storytelling skill to present an idea that packs enough emotional power to be memorable
* There is nothing wrong in painting a positive picture - but it doesn't ring true. Acknowledging the dark side makes stories more convincing. All great stories illuminate the dark side
* What makes life worth living is the struggles. Present the struggles in the foreground that sweeping it under the carpet
* From the [[Book: A million miles in a thousand years]] - The essence of a story is = A [[story]] is ''a character who wants something and overcomes conflict to get it''.
* Key questions to ask to uncover a story
** What does the protagonist want to restore his/her life balance
** What is keeping him/her achieving their desire - conflict, antagonist forces
** Create design of events and ask, //Do I believe this?//
!! References
* [[Storytelling That Moves People|https://hbr.org/2003/06/storytelling-that-moves-people]] from [[HBR]]
[ext[Streamlit|https://www.streamlit.io/]] is an open source app framework for ML and Data Science Teams
<iframe width="560" height="315" src="https://www.youtube.com/embed/0ESc1bh3eIg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* A [[Roam Research]] like functionality by the author of [[TiddlyWiki]]
* Offers bi-directional linking of texts
!! References
* Structural Breaks - [[https://www.aptech.com/structural-breaks/]]
Our experience is shaped as much by what we agree to take in as it is by what we refuse – what we choose to leave out - and both are partially conscious choices. This is in the preface of the book [[Dear Data]]. This is an extension to the idea
<<<
''MY EXPERIENCE IS WHAT I AGREE TO ATTEND TO''
<<< William James
!! 1st Place
* [[1st solution|https://www.kaggle.com/competitions/amex-default-prediction/discussion/348111]]
!! 2nd Place
* [[2nd place solution - team JuneHomes (writeup)|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347637]]
!! 5th Place
* [[5th Place Solution - Team ������VISA������(Summary&zakopuro's part)|https://www.kaggle.com/competitions/amex-default-prediction/discussion/348097]]
* [[5th Place Solution - Team ������VISA������(Patrick's part)|https://www.kaggle.com/competitions/amex-default-prediction/discussion/348118]]
!! 10th Place
* [[10th Place Solution: XGB with Autoregressive RNN features|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347668]]
!! 11th Place
* [[11th Place Solution (LightGBM with meta features)|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347786]]
!! 12th Place
* [[13th Place Gold (1/2) - lgbm+xgboost+FCN+Transformer|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347740]]
* [[13th Place Gold (2/2) - LGBM + XGBoost + Catboost|https://www.kaggle.com/competitions/amex-default-prediction/discussion/348058]]
!! 13th Place
*[[14th Place Gold Solution|https://www.kaggle.com/competitions/amex-default-prediction/discussion/348014]]
*
!! 14th Place
* [[15th Place Gold – NN Transformer using LGBM Knowledge Distillation|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347641]]
!! 15th Place
* [[15th Place Solution Meta features ,FE, DART, CAT, XG , Tabnet , MLP , ensemble ������|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347908]]
!! 16th Place
* [[[17th place solution] Features Diversity and Ensemble|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347858]]
!! 17th Place
* [[[Place 17th Solution]: Pseodo-label + FE.|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347850]]
!! 19th Place
* [[https://www.kaggle.com/competitions/amex-default-prediction/discussion/347651]]
!! 21st Place
* [[21st Solution and Code Sharing|https://www.kaggle.com/competitions/amex-default-prediction/discussion/348530]]
!! 25th Place
* [[25th place solution|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347880]]
!! 45th Place
* [[45th place with XGBoost in first Kaggle competition|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347966]]
!! 82nd Place
* [[82-nd place (Silver) solution|https://www.kaggle.com/competitions/amex-default-prediction/discussion/347757]]
!! Traps to transition
* Sticking to what you know
* Action imperative
* Setting unrealistic expectations
* Coming in with the answer without thorough understanding
* Focusing on technical parts
* Neglecting horizontal relationships
!! Game theory analogy
Analogy from game theory. If someone good at chopping a log because log is not fighting back, the same strategy cannot be applied to managing people to chopping a log. The strategy needs to be changed to match the problem.
!!
* More delegation
* Influence
!! Joining a new company
joining a new company is like an organ transplant. If ypu are not adaptive enough to join the company, every one else will fight back, org immune system.
*Outside hired have higher failure rate
* Low initial credibility
!! Accelerating your learning
* Create a learning plan - doing with b49
* Balance between doing and being
* Unexploited opportunities
* Business problems facing
!! Negotiating success
* Discuss and shape
* Don't stay away - connect regularly
* Adapt to boss style
* Don't surprise your boss
* Go to boss problems and approaches
!! Securing early wins
* Build personal credibility
* Low hanging fruit trap - not much credit, do intially but not regularly
!! Closing
*Discipline and routine
* Stabilize the homefront- don't fight two wars during the first 90 days
!! Stress is harmful only when you believe it is
* Attitude is central
!! A range of stress responses encourage us to engage, connect and grow
* Several stress responses
** [[Challenge Response]] - It’s similar to the fight-or-flight response, but suited to situations that, while pressing, do not threaten your survival. The challenge response releases [[Cortisol]] and [[Adrenaline]] to generate a feeling of self-confidence and the motivation to learn from a tough experience.
** [[tend-and-befriend]] - where we talk to a closed one when feeling stressed. The action causes the release of [[Oxytocin]] - love molecule
!! A stressful life is often a meaningful one
* Nations that exhibited higher levels of stress were also likely to have a higher GDP, longer life expectancy and improved quality of living
* [[Stress paradox]]: ''happy lives contain stress, and stress-free lives don’t guarantee happiness''
Sunk Cost BIas is the tendency to continue investing time and energy into something we know is a losing proposition simply because we have already incurred a cost that cannot be recouped
A team of individuals who are 30% better at predicting the different future events than a collection of intelligence community analysts with access to classified information. They were assembled out of the ''[[Good Judgement]] Project'' IARPA—the research arm of the US intelligence community—launched a massive competition to identify cutting-edge methods to forecast geopolitical events.
!! References
* Blog: https://goodjudgment.com/about/the-science-of-superforecasting/
* https://goodjudgment.com/books-on-making-better-decisions/
* Discussed in [[David Epstein: Range]]
It is a heightened version of reality which elicits a stronger responder than usual.
SVM is a [[Supervised Learning]] algorithm that is used for both classification and regression problems. The objective is to find the best hyperplane that distinctly classifies the data points in N dimensions
* Hyperplane is a [[Decision Boundary]] that help classify the data points
* Find a plane that has the maximum distance between data points of both classes
* the n dimensions refers to the number of input features
* If output > 1 then class 1. if output < -1 then class 2
* Can work when the number of dimensions are larger than the number of samples
<img src='https://miro.medium.com/max/600/0*9jEWNXTAao7phK-5.png' width=200>
<img src='https://miro.medium.com/max/600/0*0o8xIA4k3gXUDCFU.png' width=200>
!! References
* [[https://towardsdatascience.com/support-vector-machine-introduction-to-machine-learning-algorithms-934a444fca47]]
''Swing trading is a trading style that attempts to capture short to medium term gains in a stock over a period of few days to serval weeks''
* primarily use [[Technical Analysis]], may additionally use [[Fundamental Analysis]]
* The goal of swing trading is to capture a chunk of potential price move. It is a process of identifying where the price is likely to move next.
* Will often look for opportunities on daily and watch 1-hour to 15 minute charts to identify precise entry points, stop loss and profit levels
!! Pros
* Less time required than day trading
* Maximise short term profit potential
* Traders can rely exclusively on technical indicators to simplify trading process
!! Cons
* Trade position are subject to weekend ad overnight market risk
* Abrupt market reversal can result in substantial losses
* Often miss longer term trends in favour of short term market moves
!! Margin Trading
The capital put on a trade is a percentage of actual current value
[[Neurosurgeon]] [[Itzhak Fried]] points out that violent events all across the world are characterized by similar behavior - shifting of normal brain function to specific way called Syndrome E.
It is characterized by ''diminished emotional reactivity , which allows repetitive acts of violence''. It also includes hyperarousal, or as the Germans call it - //Rausch// - a feeling of elation in doing these acts.
* There's group contagion - everybody does it and it catches
* There's compartmentalization - somebody cares about his own family but not of others
Rationality is in play but [[Emotion]] and [[Empathy]] are not.
,,[[31 March 2021]],,
* Synesthesia is a ''condition in which senses are blended''.
* People can taste birds, Some see sounds as colors. Some hear visual motion.
* About 3% of the population has some form of synesthesia
* Grapheme-color synesthesia - individual’s perception of numbers and letters is associated with colors
* IT is a reult of ross-talk between sensory areas of the brain.
!! References
* https://www.britannica.com/science/synesthesia
* Convert text to video using [[AI]]
*https://www.synthesia.io/
[[AI Businesses]]
[[System Noise]] is undesirable variability between judgements of the same case by multiple individuals. Two major components
* [[Level Noise]] - variability in average level of judgement by different judges.
** some judges are more lenient than others
* [[Pattern Noise]] - variability in judge's response to particular cases. Pattern Noise also contains, [[Occasion Noise]] which is similar to random error.
** Pattern noise is more stable than occasion noise
** Pattern noise is the interaction effect b/w judges x cases
$$System \ Noise = Level \ Noise ^ 2 + Pattern \ Noise ^ 2$$
[[05 December 2021]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/9Y18-07g39g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
The tall poppy syndrome is the cultural phenomenon of jealous people holding back or directly attacking those who are perceived to be better than the norm, "cutting down the tall poppy". It describes a draw towards humility.
<img src='https://images.huffingtonpost.com/2016-07-29-1469819168-6756685-Tallpoppycopy-thumb.jpg' width=300>
[[Target Encoding]] in [[XGBoost]]
```python
def target_encoding(df, cat_vars, depvar):
pm = {}
df['depvar'] = depvar
for v in cat_vars:
if v in df.columns:
pm[v] = (df.groupby(v)['depvar'].mean(), df['depvar'].mean())
df = df.drop('depvar', axis=1)
return pm
def target_encoding_apply(df, pm):
for v in df.columns:
if v in pm.keys():
df[v] = df[v].map(pm[v][0]).fillna(pm[v][1])
return df
```
Week 3 - Recurrent Neural Networks for Time Series
* Identifying and quantifying price patterns.
* A system built on TA alone does not work and can lead to years of underperformance, it is best to use it with the fundamentals
** Volume
** Momentum
** Support
** Resistance
** Candlesticks
* A technical indicator ''helps identify price movement of a security''
* Two types - Leading & Lagging
* Not all indicators are accurate → false signals → efficiency of using these comes with experience
* Majority of leading indicators are called [[Oscillators]]
* Lagging indicators: lags the price → signal after event occurrence → MAs fall in this category
<<tabs "[[K Nearest Neighbors]] [[kMeans]] [[SMOTE]] [[Covariance]] [[Spearman’s Correlation]] [[Pearson’s Correlation]] [[Partial Dependence Plot]] [[Principal Component Analysis]] [[SHAP Values]] [[Hyperparameter Tuning]] [[Bayesian optimization]] [[Grid Search]] [[Random Search]] [[Multi class models]] [[Naive Bayes Classifier]] [[Support Vector Machines (SVM)]] [[Linear Regression]] [[Logistic Regression]] [[GBDT]] [[Bagging]] [[Boosting]] [[XGBoost]] [[LightGBM]] CatBoost [[Outlier Treatment]] [[Bias-Variance Trade-off]] [[Confusion Matrix]] [[Accuracy]] [[Precision & Recall]] [[Loss Function]] " "[[kNN]]" "$:/state/strollhometabs" "tc-vertical">>
,,[[12 December 2021]],,
!! Guidelines
* Own your mistake
* Reflect on what you did wrong - how that negatively impacted your work.
* What you learned, and what to do better next time
!! What are they looking for?
Whether you own your mistakes or not
!! Pointers
* SME Footprint -
* Forgot to swap the model file that where SBFE variables had to be removed
* Slightly different scores were generated - they were being used in campaigns
* I immediately brought this to my manager's notice
* We devised a plan to communicate that this error was made resulting in slightly different scores
* We did a identified how the score distribution would be with new and old model file
* We did a swap set analysis on how much population was being captured different between the two model files - luckily for us majority of the population was being captured
* we communicated the same to our partner
* Luckily he mentioned for now he is using our scores by applying some business rules
* We corrected our mistake going forward
* ''General guidelines to follow that mistakes don't happen''
** Document everything on confluence
** Keep the notebooks separate
** Make a list of all corrections that were planned and self-audit
** Identify heuristics that could tell something is wrong
[[Preparing for the next role]]|[[09 July 2021]]
Conflicts are of two types
* [[Relationship Conflict]] these are the ones that are counterproductive
* [[Task Conflict]] helps rethinking a problem or a solution to a problem. Reframing the disagreement as a debate makes people more likely to approach it and less likely to take it personally
* Take
* First, Identify the type of conflict.
[[Preparing for the next role]]
Past experience question
!! Approach
* Situations that brought alignment
* Situations where you guided someone on the next steps
!! Pointers
!!! Mentoring Raghav to Deliver Lend SOW Models
* Intern presentation in a few weeks
!!! SME Tracking
* guided Garima and Shreya through the tracking process
* Gave directions on the next steps after each milestone in tracking was achieved
!! Answer
[[Preparing for the next role]]|[[09 July 2021]]
!! Guidelines
* Describe the situation quickly and clearly
* Address the challenge for the entire team
* Describe the steps you took
* Describe the result
!! Pointers
''FRP Response Model''
''Situation''
* COVID Hit - Requirement from strategy partners to build a model to onboard customers in need of financial assistance through web and app
* V1 - Deployed some business rules - pilot
* V2 - wanted a model
* Built a response model - daily calls
''Steps I Took''
* Set up pipeline and starting early - took datasets - built a quick and dirty model
* Communicate frequently
* IS/OOS validations
*
''Result''
* Iterated 9 versions of the models - within 3 weeks
* Learnt feature engineering - force feeding interactions
* Developed and deployed within a month
[[Preparing for the next role]]
[[Preparing for the next role]]
[[Cyclfix|https://github.com/RonanB96/Cycflix]] is a project that lets you set cycling routines to watch [[Netflix]]. It will pause if you get below certain speed. It follows temptation bundling approach to make the habit attractive and rewarding
!! Reference
[[Cycflix lets you watch Netflix, but only if you keep up the pace|https://techcrunch.com/2017/07/27/cycflix-lets-you-watch-netflix-but-only-if-you-keep-up-the-pace/]] n [[Techcrunch]]
* TensorFlow is an open source library for fast numerical computing. It was created and is maintained by Google and released under the Apache 2.0 open source license.
* The API is nominally for the Python programming language, although there is access to the underlying C++ API.
* Unlike other numerical libraries intended for use in Deep Learning like Theano, TensorFlow was designed for use both in research and development and in production systems, not least RankBrain in Google search1 and the fun DeepDream project2.
* It can run on single CPU systems, GPUs as well as mobile devices and large scale distributed systems of hundreds of machines.
* Check TensorFlow version in [[Python]] - `tf.__version__`
!! Exam
* ''Exam cost'': $100 USD (per attempt, if you fail, you have to wait 2 weeks to try again and longer for each fail thereafter).
* ''Time-limit'': 5-hours. Without the error at the start of the exam, I’d say I would’ve comfortably completed it within 3-hours. However, the extended time limit is to give you enough time to train deep learning models on your computer (so make sure this works before starting).
!! Learning Resources
# Tensorflow developer certification handbook - [ext[link|https://www.tensorflow.org/site-assets/downloads/marketing/cert/TF_Certificate_Candidate_Handbook.pdf]]
# [[Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning]] on [[Coursera]]
# Chapter 10 to 16 - [ext[Hands-on Machine Learning with Scikit-Learn, Keras and TensorFlow 2nd Edition|http://93.174.95.29/main/40CA3F6E08498377145117D8B48BFD1B]]
# [[MIT 6.S191: Introduction to Deep Learning]]
# Exam is in PyCharm - [ext[Getting started with PyCharm|https://www.jetbrains.com/pycharm/learning-center/]]
!!! References
* [ext[How I passed the TensorFlow Developer Certification Exam|https://towardsdatascience.com/how-i-passed-the-tensorflow-developer-certification-exam-f5672a1eb641]] on [[Medium]]
!! Course Certificates
* [ext[Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning|https://coursera.org/share/dc3844f3202e3999fb921928225a884d]]
* [ext[Convolutional Neural Networks in TensorFlow|https://coursera.org/share/413b9baeb0e4b37362e2062a9d2e8750]]
* [ext[ Natural Language Processing in TensorFlow|https://coursera.org/share/938bc1946e5f2e11f9804324c44f57a1]]
* [ext[Sequences, Time Series and Prediction|https://coursera.org/share/eec97dad37244d86b2bf9eb176006431]]
* [ext[Specialization Certificate|https://coursera.org/share/56a7e28159ad8d2df5d48d65179b9576]]
A Javascript library for Machine learning.
!! Learn from
* [[Coursera]] - [[Browser-based Models with TensorFlow.js]] offered by Deeplearning.ai
!! Applications
* [ext[Move Mirror|https://experiments.withgoogle.com/move-mirror]] - you move and the algorithm finds and matches your move to an existing image, creating a gif.
* https://texttohandwriting.com/
* [[Text to Text]]
* Converts text to AI generated handwritten text
[[AI Businesses]]
* Create a source dataset from your input data.
* Apply dataset transformations to preprocess the data.
* Iterate over the dataset and process the elements.
Iteration happens in a streaming fashion, so the full dataset does not need to fit into memory.
!!! Example of generating and processing data
```python
import tensorflow as tf
import numpy as np
dataset = tf.data.Dataset.range(10) # create dataset from series
dataset = dataset.window(5, shift=1, drop_remainder=True) # select the window and shift interval & drop when insufficient data per window
dataset = dataset.flat_map(lambda window: window.batch(5)) # flatten the data into chunks of size of window size
dataset = dataset.map(lambda window: (window[:-1], window[-1:])) #
dataset = dataset.shuffle(buffer_size=10) # shuffling data to remove sequence bias
dataset = dataset.batch(2).prefetch(1) # batch the data for training
for x,y in dataset:
print("x = ", x.numpy())
print("y = ", y.numpy())
```
!!! As helper function
* ''shuffle buffer'' - So for example, if you have 100,000 items in your dataset, but you set the buffer to a thousand. It will just fill the buffer with the first thousand elements, pick one of them at random. And then it will replace that with the 1,000 and first element before randomly picking again, and so on. This way with super large datasets, the random element choosing can choose from a smaller number which effectively speeds things up
```python
def windowed_dataset(series, window_size, batch_size, shuffle_buffer):
dataset = tf.data.Dataset.from_tensor_slices(series)
dataset = dataset.window(window_size + 1, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(window_size + 1))
dataset = dataset.shuffle(shuffle_buffer).map(lambda window: (window[:-1], window[-1]))
dataset = dataset.batch(batch_size).prefetch(1)
return dataset
```
For details - refer to [ext[Tensorflow Documentation|https://www.tensorflow.org/api_docs/python/tf/data/Dataset]]
* Data is in [.tfrec] format which is tensorflow record Format.
* ''TensorFlow Record'':- A TFRecord file stores your data as a sequence of binary strings.
* Importances...
** Binary data takes up less space on disk, takes less time to copy and can be read much more efficiently from disk. This is especially true if your data is stored on spinning disks, due to the much lower read/write performance in comparison with SSDs.
** Especially for datasets that are too large to be stored fully in memory this is an advantage as only the data that is required at the time (e.g. a batch) is loaded from disk and then processed.
** Another major advantage of TFRecords is that it is possible to store sequence data — for instance, a time series or word encodings — in a way that allows for very efficient and (from a coding perspective) convenient import of this type of data.
* You need to specify the structure of your data before you write it to the file. Tensorflow provides two components for this purpose:
** `tf.train.Example` and
** `tf.train.SequenceExample`.
* You have to store each sample of your data in one of these structures, then serialize it and use a `tf.python_io.TFRecordWriter` to write it to disk.
,,[[09 July 2020]],,
* This is a book by [[Tim Ferris]] about [[Lifestyle Design]]
* It is joining the ''New Rich (NR)'' using the three ingredients - Time, Mobility & Income
<<<
Whenever you find yourself on the side of the majority, it is time to pause and reflect
<<< [[Mark Twain]]
<<<
Anyone who lives within their means suffers from a lack of imagination
<<< [[Oscar Wilde]]
* What I do with my time and what I do for money are completely different things? - Can work less than four hours and make more in a month than in a year
* Join the [[New Rich (NR)]] - those who abandon deferred life-plan and create luxury lifestyles in the present using the currency of the new rich: Time and Mobility. This is the art and science of [[Lifestyle Design]]
* It starts with simple distinction, //people don't want to be millionaires - they want to experience what they believe only millions can buy
//
* The commonsense rules of the real world are fragile collection of socially reinforced illusions. Test the most basic assumptions of work -life equation
** How do your decisions change if [[Retirement]] isn't an option?
** What if you could use a mini-retirement to sample your deferred life plan reward before working 40 years for it?
** Is it really necessary to work life a slave to live like a millionaire
!! Singular importance of Dealmaker
DEAL is an acronym form
* D - Definition - introduces rules and objectives of a new game
* E - Elimination - Increase your per hour results (using selective ignorance and low information diet)
* A - Automation - of cash flow using geographic arbitrage, outsourcing and rules of non-decision
* L - Liberation - introduce mini-retirements
If you decide to remain in your current job, implement freedom of location first before cutting your work hours by 80%. The DEAL process turns you into an [[Entrepreneur]] in true sense
,,[[The 4-Hour Workweek]] | [[06 May 2022]],,
<<<
Do your own thinking independently. Be a chess player, not a chess piece
<<< [[Ralph Charell]]
<<<
Meetings are an addictive, highly self-indulgent activity that corporations and other organizations habitually engage in only because they cannot actually masturbate
<<< [[Dave Barry]]
* Learn to be difficult when it counts. Reputation for being assertive will help you receive preferential treatment without having to beg or fight everytime
!!! Three types of interruptions
* ''Time wasters - Avoid checking emails repeatedly and avoid meetings''
** Never check email first thing in the morning. Batch it and reply it twice a day
** Cite pending projects and frustration with constant interruptions as the reasons. Feel free to blame it on spam or someone outside the office
** Move to once per day as quickly as possible. Emergencies are seldom that. People are poor judges of importance and inflate minutiae to fill the time and feel important
** Don't encourage people to chitchat and don't let them chitchat, ask them to come to the point in the meeting
** ''Avoid Meetings'':
*** Steer people to use email in case of non-urgent issues
*** Meetings should only be held to make decisions about a pre-defined situation, not to define the problem - Ask the person to set the agenda. Don't give them a chance to bail out
* Time Consumers
* Empowerment Failures
,,[[The 4-Hour Workweek]] | [[01 August 2022]],,
''The Accounting Game - Basic [[Accounting]] Fresh from the Lemonade stand by Judith and Mullis'' is a gamified version of learning the boring topic - accounting.
It starts with the premise that children learn the most in the their first year of birth, than all other years combined afterwards, by asking questions.
It has been written in a way that school children learn, asking questions, sing along and repeating after teacher. This method is called [[Accelerative Learning]]. This uses all senses as well as [[Emotion]]s as well as [[Critical Thinking]] skills. This way the infromation directly feeds into the [[Long-term Memory]]
This book is structured to show the big picture of accounting using the lemonade stand as the business without getting into the details and covers three primary [[Financial Statement]]s - [[Balance Sheet]], [[Income Statement]] and [[Cash Flow Statement]]
,,Tags: [[09 October 2022]],,
14 Leadership principles of Amazon by [[John Rossman]]
James Clear. Sticking to habits
* Noticing - that you want to change something in your life
* Wanting - to change this thing. Environment enables us to this. We do this simply because they are available as an option or in front of us.
* Doing - taking some action
* Liking - the action and enjoying the results to ensure you continue this habit up
! Who am I?
* Adult brain weights 3 pounds
* Process of building a brain takes 25 years
!! Born Unfinished
* Brain is born unfinished in humans while most mammals have preprogrammed brains. This enables humans to adapt to most kinds of environments. A human brain allows itself to be reshaped with life experience.
* Pre arranged or ''hardwired'' brain works well for animals belonging to niche ecosystem.
!! Childhood Pruning
* The number of brain cells are same in adults and children.
* At age two, a child has over 100 trillion synapses, double the number an adult has. So, as you mature, 50% of your synapses will be pared back.
* ''You become who you are not because what grows in your brain, but because of what is removed''
<img src ='https://cognoa.com/wp-content/uploads/2019/11/syn-formprun-whitebkgd-2-1024x599.png' width = 600>
!! Emotional Stimulus at early age
* Required at an early age, otherwise, the infants brain remains underdeveloped and language is delayed. Average IQ is around 60-70 compare with average 100
* usually witnessed where infants are raised in institutions like [[Romania's Orphanages]]
!! Teen Years
* Who we are as teenagers is not simply a result of choice or an attitude; it is the product of a period of intense and inevitable neural change.
* ''Difference between adults and teens?'' - [[Medial Prefrontal Cortex]] (mPFC) becomes active when you think about your self and especially the emotional significance of a situation to your self. This peaks around 15 years old. results in self-consciousness self response of high intensity.
* Teen brain is set up to take risks than adults. It's because how we respond to rewards and incentives. ''Teens have increasing response towards areas related to pleasure seeking'' called the [[Nucleus Accumbens]] but the activity in [[Orbitofrontal Cortex]] - part of the brain involved in executive decision making is the same as in the children. So, teens are less able to control their emotions, and hence ''teens are more likely to take risks when friends are around.''
!! Plasticity in Adulthood
* Brain is [[Plastic]], meaning it can still develop in adulthood
* [[Case Study: London City Cab Drivers]] - the [[Hippocampus]] physically grows significantly larger than the normal people causing ''increased spatial memory''.
* [[Albert Einstein]] played violin, showed brain area devoted to left fingers has expanded forming a giant fold in his cortex called an ''Omega sign''.
* Your family of origin, your culture, your fiends your work, every movie you've watched every conversation you've ever had - these all have left their footprints in your nervous system. ''These indelible microscopic impressions accumulate to make you who you are and to constrain who you can become.''
!! Disease in brain can alter brain chemistry
* Particular kinds of epilepsy make people more religious
* Parkinson's disease often makes people lose faith
!! Am I the sum of my memories?
* every 4 months [[Red Blood Cells]] are entirely replaced
* About every 7 years every atom in the body gets replaced
* Memory links all these versions of your self together. But, your memory of who you were at 15 is different to who you actually were at 15. Memory, instead of being an accurate video recording of a moment, ''is a fragile brain state that must be resurrected for you to remember''.
* ''The enemy of memory isn't time; it's other memories''. Each new event establish new relationships among a finite number of neurons. You can't help but have your present color your past.
!! Fallibility of Memory
* Leading questions contaminate memory. Confirmed in the [[Car Crash Experiment]] by Loftus.
* Not only it is possible to implant memories in the brain, but people unknowingly weaved fantasy into their fabric of identity
<<<
Our path is not a faithful record. Instead it's a reconstruction and sometimes it can border mythology
<<<
!! The Aging Brain
* [[Religious Orders Study]] to explore the effects of ageing of brain.
* Effort to find clear cut linkage between cognitive decline and three most common causes of [[Dementia]]: [[Alzheimer's]], [[Stroke ]]and [[Parkinson's Disease]]. This ''correlation was NOT found''.
* Psychological and experiential factors determined whether there was a loss of cognition. Activities that keep brain active like reading, driving, crosswords, learning new skills, and having responsibilities was protective. So were social networks and interaction, and physical activities.
* Lonliness, anxiety and depression were related to more rapid cognitive decline
* We can't stop the process of ageing, but by practicing all the skills we may be able to slow it down.
!! I am sentient
* I am a [[Sentient]] being. I experience my existence. Also called [[Consciousness]] or awareness.
* We lose consciousness while we are asleep. The brain activity is similar to what it is during the day.
* Analogy: stadium with thousand conversations (day) ; [[Mexican Wave]] while asleep
!! Brains are snowflakes
* ''You don't perceive objects as they are. You perceive them as you are.''
* As your trillions of new connections continually for and reform, the distinctive pattern means that no one like you has ever existed, or will ever exist.
,,[[Book: The Brain - The Story of you]],,
! What is Reality?
<img src ='https://media.npr.org/assets/img/2014/03/24/color-rotsnake_custom-d48b779a38b868da75a48c9b1e7e5515a0a644cd-s800-c85.gif' width=300>
How much reality is a construction of your brain, taking inside the head. Illusions give us the first hints that our picture of external world is not necessarily an accurate representation. It has less to do with what's happening outside than inside the brain.
!! Your experience of reality
* Brain has no access to world outside; Relies on sensory inputs; inputs converted to common currency of brain - electrochemical signals
* Brain cross check various signals to the brain and makes ''best guess'' as to what's out there
* About of third of brain is devoted to vision
* The signals to the brain can only be made sense of by training, which requires cross-referencing the signals with information from our actions and sensory consequences.
!! Vision is not effortless
* [[Prism Goggle Experiment]] - switching left vs right vision increase the cognitive load, the brain has to process and reverse the information before it can makes sense of what is going on
* Firing pistol vs using flashlight for sprinters for starting race. Even when light travels faster than sound, it takes more time to process visual information (190ms) than auditory information (160ms). Because visual information goes through much complex path
* Perception of reality is a result of brain hiding difference in arrival times. What is served up is a delayed version. Brain collects all information before it decides upon a story of what happens. ''The strange consequence of all this is that you live in the past. By the time the moment occurs it is already long gone.''
!! Seeing doesn't stop in dark solitary confinement
* Prisoners go beyond daydreaming. They speak of instances that are completely real and they didn't just imagine they saw..
* ''Traditional model of vision:'' perception results from procession of data beginning with eyes ending at a point in brain. It's incorrect.
* ''Internal model'': Brain Generates own reality even before sensory input received from eyes
* direction of [[Thalamus]] to eye connections > 10X Eye to [[Thalamus]] connections
* What the brain guesses will be out there are being transmitted by the visual cortex to the [[Thalamus]].
* ''Internal model allows the world to remain stable even when you are moving. Eyes are not video cameras, eyes jump around 4 times a second in jerky movements called ''[[Saccades]]'' (white streaks in image below) they simply venture out to find more details to feed the internal model.''
<img src='https://www.researchgate.net/profile/Farahnaz-Ahmed-Wick/publication/260379693/figure/fig6/AS:271675895840782@1441783989332/Left-The-oil-painting-An-Unexpected-Visitor-painted-by-Ilya-Repin-Right-an-example.png' >
!! Thin Slice of Reality
* ''Color doesn't exist'' in outside world - it becomes color inside our heads. It is ''interpretation of wavelengths, one that only exists internally''. We don't have receptors to notice [[Radio Waves]] , [[Microwave]]s, [[X-rays]] and [[Gamma rays]]
* There is ''no sound'' - compression and expansion of air
* Reality is ''also odorless'' - molecules bind to our receptors in the nose and are interpreted as different smells
!! Your Reality, My Reality
Reality is a narrative played out inside the sealed auditorium of the cranium.
* [[Synesthesia]] shows that even microscopic changes can lead to different realities
* [[Schizophrenia]] is a result of chemical imbalances in the brain
!! Timewarp
* Experience of time slowing has been reported in life-threatening experiences. In life threatening situations, [[Amygdala]] kicks in to direct attention to the situation at hand. During this, memories are laid down with more detail than normal circumstances. A secondary memory system has been activated. Our time distortion happens in retrospect when we ask ourselves //What just happened?//.
,,[[Book: The Brain - The Story of you]],,
! Who is in Control?
How much control does our conscious awareness has over daily operations? - Consciousness comes into play only when we observe something unexpected. Our actions our beliefs and our biases are all driven by networks in the brain which we don't have conscious access to.
!! The Unconscious Brain in Action
* Brain runs smoothly such that all the computations involved having a conversation while drinking a cup of coffee are performed unconsciously. We can appreciate it when we lose [[Proprioception]] where conscious gets involved
* These computations happen with an efficiency of energy equivalent to lighting a 60 watt bulb
!! Burning skills into the wiring of brain
* Players playing [[Cup Stacking]], with years of practice, can carve this skill into structure of [[Neurons]] which sinks below level of consciousness to become [[Procedural Memory]]
* [[Electroencephalogram (EEG)]] shows high activity in [[Alpha wave]] band for professional cup stackers, associated with brain at rest. While for rookie players [[Electroencephalogram (EEG)]] showed high activity in [[Beta wave]] frequency, associated with extensive problem solving.
* In early days of learning a new motor skill, the [[Cerebellum]] plays important role, coordinating the flow of movements required for accuracy and perfect timing.
!! Running on Autopilot
* Attempts to consciously interfere with automatized skills can worsen their performance. Learned proficiencies are best left to their own devices.
* Brain enters into a state called [[Flow]] - a state of hyperfrontality, meaning the [[Prefrontal Cortex]] temporarily becomes less active. Because the unconscious brains can perform at speeds that the conscious mind is too slow to keep up with.
!! Deep Caverns of Unconscious
* We take conscious credit for all our ideas, as though we have done the hard work in generating them, but in fact, the unconscious brain has been working on these ideas - consolidating memories, trying out new combinations, evaluating the consequences for hours or months before the idea rises to your conscious awareness.
* [[Priming]] can influence perception of something else.
** It can influence something as fundamental as the relationship with your mother by whether you take iced tea or hot. You describe the relationship more favorably while you are holding hot tea, and poorly while holding a cold drink.
** In foul smelling environment, you'll make harsher moral decisions
** If you sit on a hard chair, you'll be more of a hard line negotiator in a business transaction; in a soft chair you will yield more.
* [[Implicit Egotism]] - describes our attraction to things that remind us of ourselves. More married couples than expected share the same first initial.
!! Why are we conscious
* Consciousness is a way for billions of cells to see themselves as a unified whole. It is the CEO of large sprawling corporation, with many thousands of sub-divisions and departments. It decides what's best for the organism - for us. It plays the role of arbiter of the billions of sub-sytems and burnt-in processes and make plans and set goals for the system as a whole.
!! When consciousness goes missing
* [[Sleep Walking]]
!! The feeling of free will
* We feel like we have autonomy. But this feeling can sometimes be illusory.
* Alvaro Pascual-Leone conducted an experiment to use [[Transcranial Magnetic Stimulation]] to induces movement in hands. The outcome was that TMS induced and non-induced movements resulted in participants owning that they wanted to move that hand all along.
* Conclusion: Our lives are steered by the forces far beyond our capacity of awareness or control
!!! Tags
* [[Book: The Brain - The Story of you]]
* [[31 March 2021]]
! How do I decide?
!! The Sound of Decision
* [[Neurons]] talk with one another via electrical spikes called [[Action Potential]]s. These signals can be interpreted by trained ear by lowering the electrode to different regions of the brain.
* [[Perceptual Bi-stability]] tells us that, theoretically there are two interpretations, but the brain makes a choice and the mechanics are switchover are hidden. It is not a conscious decision.
!! The Brain is a machine built from conflict
* making a choice is a fight between different network of [[Neurons]]. Eventually one network wins over and the decision is made.
* [[Split Brain Surgery]] can lead to two halves in conflict with each other causing [[Alien Hand Syndrome]]
* In thought experiment [[Trolley Dilemma]] - most people theoretically save four and kill one. But when actually pulling the lever involves additional networks to the decision : brain regions involved in emotion.
* In real world - operating a drone can become a video game, cyber attacks wreak consequences at a distance, the rational networks are at work here, but not necessarily emotional networks. The detached nature of distance reduces internal conflict and makes it easier to wage. Also captured in the movie outside the wire
:<iframe width="300" height="160" src="https://www.youtube.com/embed/u8ZsUivELbs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* ''When making life and death decisions, uncheck reason can be dangerous; our emotions are a powerful and often insightful constituency''
!! States of the body help you decide
* [[Orbitofrontal Cortex]] keeps track of bodily state
* For example, deciding between two soups A and B. The brain runs simulations of experience with either of soups, and it places a value on both A and B, allowing you to tip the decision in one direction or the other. Data from soup cans is not extracted, it is felt.
* [[Neuroscientist]] [[Read Montague]] has found a link between a persons' politics and the character of their emotional responses. Mantague shows a series of images that arise disgust and predicts that the more disgusted you feel from the images, the more conservation you are going to be and less disgusted the more liberal. This strong correlation predicts political ideology by 95% accuracy.
!! Travelling to the future
* Reward in essence is something that steers the body closer to its ideal set points. For example, water is the reward for being thirsty.
* Water is a primary reward- that satisfy our biological needs. However, human behavior is steered by secondary rewards, rewards that predict primary reward. Unlike animals, humans can put secondary reward ahead of primary rewards.
* Time travel is something that human brain does relentlessly. When faced with a decision, our brains simulate a mockup of the future.
* ''The key to effective learning lies in tracking the [[Prediction Error]]'': the difference between expected outcome and the realized outcome. We use the ancient system of rewards to learn. [[Neurotransmitter]] called [[Dopamine]] increases and tells the system whether something turned out to be better than expected. If the outcome was worse, a decrease in [[Dopamine]] follows. [[Dopamine]] acts as error corrector.
!! The power of now
* Options in front of us are valued higher than those we merely simulate
* The thing that trips up good decision making about the future is present. For example, in [[2008 Financial Crisis]], the subprime loans allowed people to obtain a nice house now, with high interest payments defered later. It also incentivizes
!! [[The Ulysses Contract]]
* A deal between present and future you. The present you is certain that the future you won't be able to resist the temptation if the situation of some sort arises. So using that contract to bind yourself to the obligation which would make the future you choose
** Some people arrange things such that violation of contract would lead a charity to anti-party
** To make sure you go to the gym, is to arrange prior for a friend to be available at that time - pressure to uphold social contract.
!! Invisible Mechanisms of Decision Making
* We should know that the outcome of the battles won't be same everytime.
** [[Parole Judges 2011 Study]] shows that the likelihood of getting parole changes due to [[Ego-Depletion]]
** Decisions are also influenced by how we act with our romantic partners. Example, choice of monogamy - bonding and staying with single partner, which is clearly against the [[Evolution]]ary mandate of spreading genes. [[Oxytocin]] increases the bonding with their partners, and keeps other attractive prospects at bay. This is also because the survival of children is better when two parents are around than only 1.
!! Decisions and Society
* US has more people incarcerated for drug-related crimes than EU has prisoners, and it is growing.
* Attacks on supply and not demand. Core issue is the biology of the brain which causes lack of impulse control in addicts.
** One approach to solve this is to do biweekly testing and immediate jail time for failure.
** The police visibility stimulates the networks that weigh long term consequences.
!!! Tags:
* [[Book: The Brain - The Story of you]]
* [[31 March 2021]]
! Do I need you?
* Our social skills are deeply rooted in neural circuitry. Understanding this circuitry falls in [[Social Neuroscience]]
* We assign intentions to inanimate objects even though they are just shapes
:<iframe width="300" height="225" src="https://www.youtube.com/embed/sx7lBzHH7c8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
* Moving shapes hit our eyes, but what we see is motives, emotions all in the form of a social narrative. It is a clue that ''we navigate the social world by judging other people's intention''
* Trustworthiness is not learned but even babies that can't walk and talk inborn instincts to detect who is trustworthy
!! The Subtle Signals around Us
* Every moment of our lives, our brain circuitry decodes emotions of others
* ''How we read faces so automatically and rapidly?'' - A person's facial expression reflects what they are feeling. When another person tries to understand what they are feeling - they try [[Mirroring]] the facial expression, unconsciously, to know how they might be feeling.
* [[Botox]] users somewhat lose the ability to read other people facial expressions, because it freezes their facial muscles and makes it difficult to mirror expressions
!! The joys and sorrows of empathy
* [[Pain Matrix]] - pain is processed in multiple parts of the brain
* Watching someone in pain and feeling pain uses the same neural machinery. This is the basis for [[Empathy]]
* To empathize is to simulate what would it feel like to be in that situation.
* From [[Evolution]]ary standpoint, [[Empathy]] is a useful skill to know how someone is feeling and predict what they are about to do next.
* Social Rejection is so meaningful that it involves areas in the [[Pain Matrix]] to get active, meaning that it literally hurts.
!! beyond survival of the fittest
* Why does survival of the fittest explain [[Altruism]]? - ''Kin Selection''. That means I care not only about myself, but also others with whom I share genetic material, for example brothers and cousins. And the benefits can be explained by [[Eusociality]]
<<<
I would gladly jump in a river to save two of my brothers or eight of my cousins.
<<<
!! Outgroups
* The Dark side of [[Eusociality]] is that for every ingroup, there must exist one outgroup leading to acts known as [[Ethnic Cleansing]]
** 1915 - Killing of a million [[Armenian]]s by the [[Ottoman Turks]]
** 1937 - [[Nanjing Massacre]]
** 1941 - [[The Holocaust]]
** 1994 - [[Rwanda Genocide]]
** 1992 - [[Yugoslav war]]
The sad part about the Killing of 8000 Bosnian Muslims in [[Yugoslav war]] was that the continuation of killings, of torture was perpetrated by our neighbors - the very people that they had been living with for decades. They were capable of killing their own school friends. Answer lies in [[Syndrome E]]
!! Why does [[Genocide]] happens?
* A basic categorization is enough to change your brain's pre-conscious response to another person in pain. We are more empathetic for people belonging to the same group as ours and less empathetic towards others. This is true also for [[Atheist]]s. ''It's not about religion, it's about which team are you on''.
!! Dehumanization a key component to genocide.
* [[Medial Prefrontal Cortex]] is active when dealing with people but is inactive when interacting with inanimate objects like mug.
* Homeless people and drug addicts are common targets of dehumanization. Here [[Medial Prefrontal Cortex]] is less active.
* Also includes neural manipulation - propaganda - consistently presenting distorted news as factual statements. It allows for dehumanization at massive scale
* [[Experiment: Blue Eyes - Brown eyes]] explores what prejudice is about. The lesson was that the truths of the world aren't fixed and moreover they are not necessarily the truths. System of rules can be arbitrary.
* Education plays a key role in preventing [[Genocide]]
!!! Tags
* [[Book: The Brain - The Story of you]]
* [[31 March 2021]]
! Who will we be?
!! A flexbile computational device
* Brain retains astonishing ability to adapt and change. Even when half of the brain is removed. This is demonstrated in one case with a girl having diagnosed with [[Rasmussen's Encephalitis]]. The brain adapted without any problems to understanding language, music, math, stories etc. Brain is ''liveware''
!! Plugging in peripheral devices
* Brain can adapt to newly generated signals by implants such as [[Cochlear Implant]] or [[Retinal Implant]]. It is like learning a new language.
* Brain can be considered as general purpose computing. It doesn't know and doesn't care where it gets its data from. The brain figures out what to do with it. The conclusion is, all sensors are merely devices than can be swapped or augmented to look for more signals and brain will figure out how to process them -[[Sensory Substitution]]
* Blind subjects can learn to see through a vest connected to their lower back that converts signals from the camera at the back into electrical signals. [[BrainPort]] allows people to see using the tongue.
* [[David Eagleman]] is working on a wearable tech called [[Variable Extra-Sensory Transducer]] or VEST to give hearing to the deaf which is 20x cheaper and non-invasive
!! Sensory Augmentation
* Real time data streamed into your body so that it becomes a part of direct experience of the world. What if you could feel data?
!! How to get a better body?
* can use tech to enhance and extend our bodies beyond replacing limbs. We can improve them by ''elevating them from human fragility to something more durable.''
** Bionic body for space travel
** Wirelessly controlling an extension of your body from a room using brain-machine interface
!! Staying alive
* [[Alcor Life Extension Foundation]] freezes a [[Legally dead]] body to sub-zero temperatures for [[Cryopreservation]]. The hope is that technology will evolve to heal and revive these people.
!! Digital Immortality
* What if we could store our brains in data banks?
''First Step - Replicate the network architecture''
* Brain contains about 86 billion [[Neurons]] making about 10,000 connections each
* The connections are unique to each person and the pattern or [[Connectome]] is far too complex to comprehend
* Scientists are trying to make a digital copy of rat brain because it smaller in size. Using[[Serial Electron Microscopy]] and using a extremely precide blade to slice the brain and generate [[Electron Micrograph]]
* To store a high resolution architecture of brain of single human would require zettabytes of capacity equivalent to the size of current digital content on the planet.
''Second step - Simulate the chemical circuitry ''
* [[École polytechnique fédérale de Lausanne]] in [[Switzerland]] is working towards delivering a software and hardware infrastructure capable of running a whole human brain simulation.
* Current goal is to build a simulation of rat brain
!!
!!!Tags:
* [[Book: The Brain - The Story of you]]
* [[01 April 2021]]
- Traders blend best practices from candlesticks and Dow theory
- Introduced by Charles H Dow who also founded the Wall Street Journal
## The Dow theory Principles
There are 9 tenets
1. Indices discounts everything - all known and unkown information
2. Overall 3 broad market trends - primary, secondary and minor
3. Primary trend
1. lasts from an year to several years
2. Used by long term investors and active traders
4. Secondary trend - corrections in the primary trend
5. Minor trend - fluctuations or market noise
6. All indices must confirm with each other
1. the market is said to be bullish only if CNX Nifty, Nifty Midcap, Small Cap etc. all move in upward direction
7. Volumes must confirm
8. Sideways market can substitute secondary markets
1. May remain sideways for a long duration
2. could be a secondary trend
9. The closing price is the most sacred
## Different Phases of the Market
Self repeating Phases: Accumulation → Markup → Distribution → sell Off
### Accumulation
- After a steep sell off → prices fell down to rock bottom valuations
- Smart money enters
- Sellers trying to accumulate will also find buyers
- Can last up to several months
- Formation of support levels
### Mark-up
- Smart money absorbs available stocks
- Support + positive business sentiment
- Stock price rises sharply
- New high (52 week or all time)
### Distribution
- smart money starts offloading stocks slowly
- Public absorbs volumes
- Similar to accumulation phase
- Resistance level created
Smart money completely sells off leading to another cycle of Accumation → Markup and Distribution → Frustrates the markets → spans over a few years. FOr Indian markets this can vary wildly with duration, can last up to 2 week to several years
## The DOW Patterns
### The Double bottom and top formation
- Reversal pattern
- price hits two bottoms/tops → well spaced in time (> 2 weeks)
- Considered bullish/bearish → long/short opportunities
- Double bottom/top + candlesticks = strong signal
### Tripple top & bottom
- reversal pattern
- Stronger than 2x bottom/top
- Price tested more number of times
- Interpretation similar to double top and bottom
### Trading Range
- Stock attempts to hit same upper and lower price levels multiple times for extended periods = sideways market
- Long term investors frustrated
- Provide opportunities to trade both ways
- The area between upper and lower band =. Width of range
- Duration can vary between few weeks to 2 years
- Longer duration → longer width
## Range breakout
- Stock trades in range because
- No fundamental triggers - quaterly results, announcements, management shuffle
- In anticipation of big announcement
- Range breakout suggests start of new trend
- Go long when breakout of resistance levels and short when breaking out support levels
### False Breakout
- trigger not strong enough to pull the stock in that direction
- Volumes are low on false breakouts
- No smart money involved
### True breakout
- volumes are high
- Momentum is high after breakout
### Trade Setup
- Buy stock as soon as it breaks out
- No way for traders to know if the momentum is high enough or not → always a apply stop loos for range breakout
- Range (128, 165) → Breaks range 170 → Buy at 170, SL at 165
- Genuine breakout → can expect profits at least with width of range
###Flag Formation
- Rally with steep increase in prices
- Big move → strong correction → price moves between two parallel lines
- Flag formed stock invariably spurts back
- Often 2nd chance to buy
- Steep rally → book profits → selling stocks → price goes down → volumes low → smart money still invested → opportunity to buy → price rallies up
The Holocaust, also known as the Shoah, was the genocide of European Jews during World War II. Between 1941 and 1945, Nazi Germany and its collaborators systematically murdered some six million Jews across German-occupied Europe, around two-thirds of Europe's Jewish population
Discusses the __Fastest Growing Job Skills for Institutions__.
* 85M jobs to be replaced with automation by 2025. 149M new tech oriented jobs expected
* Organization > Individuals > Educational Institutions are responsible for workforce development.
* Traditional degree based environment switching to open-learning models where learners take whatever courses they want and skill based learning being preferred
* ''Fastest growing Digital Skills'': Product Design (1) > Plotting Data (2) > [[UX Design]] (3) > Statistical visualization (4)
** [[Data Visualization]] market expected to grow by $5.17B by 2026
* ''Fastest Growing Human Skills'': [[Communication Skill]] (1) > Storytelling (4) > Problem Solving (8)
* According to [[Deloitte]], [[skills have an average shelf-life of <5 years|https://www2.deloitte.com/content/dam/insights/us/articles/4697_Workforce-reinvention/DI_Workforce-reinvention.pdf]]. Enabling others to develop and retrain is top trend. Promoting a culture of lifelong learning is the only way to go, as no single skill can fuel a career
<img src='https://lh3.googleusercontent.com/2GRodt0U198s4F5CrJ8w0Vm_Wp4G7EVPaRVhXWfhLFb6h7bqIR6GMRVxgzZ2_KcFPWIw2DTkRSG-LoKyhrAZ6IBw3_U8hYz1bbaSKnyjYK0xm3FKVFJXTY1i9LITsA4ET9zVP08EGRMySab2uvylSa_B1P0KDl2weVuuZ0sRNoCAzpPeHFGvRU94jFEeitDhOSbc96KdxzdH2leEY09ouI8vn4iR7aXm8B6ifHFkUer9ZdjKMqeGexENFSHRJ6DkA-rK4R0h9zR8-YTeRpKv7PaTdD1DyzRM_HWJX4FF4xxIoHNRQNuBKIuiqlMvjbof4eVHtaUPvwfdDyjhlGEA1VBEh52j6DHSx1GuW1Stk0HlFfJ6i3bZNmiimpPebsgygxWJMZRRsHXxgCQXwV-qBU-MVDjldL0RIUSfLukq821hE8YsvWqiU7vjiMzj2Gi4JNfiJjblZc7n7nn5p-U6f8USBZLjLV3fCZW0eB4eKoueTCbgP7Vi7ccx2rTX2sUMVwpv80c7kI9hBugib1ScO5HxZ1H0FKxL-2aCZPA1eDzCQiAbl1a8AXAU2qB0tWxatL431oAhLXe5-B06fvskgIUFcgAFVige-Ci2isv0JeFI54ncDZRQvqPvHLs5rZomUF6H8V-ej8N1vgvP1_LQpdc3NdBXzk4iy1dABs9CFgtPjVn6vo1kOQ_YZGWAE6RF0N2k209Sget6MWY-C4s-1nU4BUyGECLcBqfxNqgxHVTHdO0smeJHizA0MYuP2SWuQDRxyPvvHfGmX5G5_DVg3vhecANXCbPHLYuq-r2qZXgQWXOF6MhUr8PKDu7mWKUAsMVGCqB9b1y9xiuJWlZGjPebTYDYWs-88FZGv0ciAnt3PPl1KHOsjGw3c6u5lMZq-hCeAPCZU4PbwoMktxd87G3hed-DOWWLzHnz0fvehwD9wmmY8FOlOvnX1rBLjST-nrENL9a3nKcssc0IclUUKDoNCz_stYVdDLpOKhIN5ZZ9dwGAUrwsmD-e=w697-h585-no?authuser=0' width=500>
,,[[25 October 2022]] | [[Coursera]],,
Featured in [[Adam Grant: Think Again]]
<img src='https://www.savagechickens.com/images/chickennarcissisttest.jpg' width=300>
* [[FBI]]s most potent negotiating tool
* Tactically calibrated questions: queries that the other side can respond to but that have no fixed answers
* It buys time
* It gives your counterpart [[Illusion of Control]] - they are the one with the answers and power after all - and it does all that without giving them any idea of how constrained they are by it.
''The strategy is to ask these open ended questions over and over with variations that the other party gives in to your request''
!! How am I supposed to do that?
* Question influences emotional mind into believing that the offer is not good enough
* Rational mind then rationalizes the situation so that it makes sense to give other person a better offer
,,[[Never Split the Difference]] | [[13 June 2021]],,
In [[Essentialism - The Disciplined Pursuit of Less]], Geroge McKeown discusses the paradox of success in four predictable phases
''PHASE 1:'' When we have clarity of purpose, it enables us to succeed in our endaveour
''PHASE 2:'' We gain reputation, we become the go to person and are presented with increased options and opportunities
''PHASE 3:'' Increased options and opportunities demand more time and energies which leads to diffused efforts. We get spread thinner and thinner
''PHASE 4:'' We get distracted from what would otherwise be our highest level of contribution. The effect of our success has been to undermine the very clarity that led to our success in the first place
<<<
The pursuit of success can be a catalyst for failure. Success distracts us from focusing on the essential things that produce success in the first place.
<<<
,,[[Essentialism - Chapter 1]] ,,
* book by [[Charles Duhigg]]
* By focusing on one habit - [[Keystone habit]], one can teach themselves how to reprogram other routines in their lives
<<<
All our life, so far as it has definite form, is but a mass of habits
<<< [[William James]] in 1892
* Most of the decisions we make are not products of well thought our [[Decision Making]] but they are [[Habit]]s
<<<
40% of the actions performed in a day were habits
<<< [[Duke University]], 2006
* This book is divided into 3 parts
** How habits emerge within individual lives. It explores the [[Neurology]] of habit formation
** Second part examines the habits of successful companies and orgs
** Third part looks at the habits of societies
*''Each chapter revolves around a central theme: Habits can be changed if we understand how they work''
* [[US Military]] is one of the biggest habit forming places
* Setting up right routines can help us make it easier to work alongside people we normally wouldn't stand
* A [[community]] in sense is a giant collection of habits occurring among thousands of people depending on how they are influenced, could result in [[Violence]] or [[Peace]]
* once you start to see the [[World]] in terms of habits, it is like someone gave you a flashlight and crowbar and you can get to work
,,[[The Power of Habit]] | [[29 April 2022]],,
<iframe width="560" height="315" src="https://www.youtube.com/embed/MGglyvc8d58" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
It is the similarity, repetitiveness, and relatedness of the content you’re consuming that makes it a rabbit hole of scrolling that you end up consuming content for an hour even though you started out to watch just one
!! Understanding the Rabbit Hole
* 6,445 U.S.-based students and working adults.
* three factors that influence whether people choose to continue viewing photos and videos rather than switch to another activity:
** ''the amount of media the person has already viewed'' - more videos viewed meant 10% more likely to watch another one
** ''the similarity of the media they’ve viewed'' - 21% more likely to watch a related video than switch to different category
** ''the manner in which they viewed the media (alternating between work and video vs uninterrupted viewing)'' - uninterrupted viewers 22% more likely to watch another video than those who alternated between work and video
* These three categories increased the accessibility of similar media - more accessibility means easier to process - anticipate that we will enjoy it more
!! Escaping the Rabbit Hole
* Watch unrelated videos
* Find ways to intentionally interrupt viewing - social media timer, keep a sticky note with a warning
!! References
* [[The Psychology of Your Scrolling Addiction|https://hbr.org/2022/01/the-psychology-of-your-scrolling-addiction?ab=hero-subleft-3]]
This book is for those who run a business and manage a team or collaborate with others in pursuit of common goal. This book is about being guided by a ''set of principles that help surfaces the good ad manage the bad''
* The one thing that weighs heavily is the knowledge that no matter how vigilant we are, we can't prepare for everything
* Sometimes even though you are in-charge, you need to be aware that in the moment you might have nothing to add, and so you don't wade in. It is best to trust your people and let them do their jobs while you focus energy on some other pressing issue
* [[Disney]] was founded by [[Walt]] in 1923
* [[Robert Iger]] worked at Dinesy for 45 years, 22 at [[ABC]] and 23 at Disney
* Disney had acquired [[Marvel]], [[Lucasfilms]] and [[21st Century Fox]] and [[Pixar]] under Robert's leadership and built synergies with them
!! 10 Principles necessary to true [[Leadership]]
* [[Optimism]] - People are not motivated by [[Pessimists]]
* [[Courage]] - fear of failure destroys creativitty
* [[Focus]] - allocating time, energy and resources and communicate your priorities clearly
* [[Decisiveness]] - Chronic indecision is inefficient, counterproductive and deeply corrosive to morale
* [[Curiosity]] - is a path to [[Innovation]]
* [[Fairness]] - Fair, decent treatment + [[Empathy]]
* [[Thoughtfulness]] - process of gaining knowledge to improve [[Decision Making]]
* [[Authenticity]] - Don't fake anything
* Relentless pursuit of [[Perfection]] - refusing mediocre outcomes or making excuses for something good enough.
<<<
If you are in the business of making something, be in the business of making things great
<<<
* [[Integrity]] - quality of people and product + high ethical standards
,,[[The Ride of a Lifetime]] | [[15 April 2022]],,
* Started reading since high school
* Liked using tools and taking things apart and understanding how they worked
* Less money, difficult childhood. Father had employment troubles, Robert had to find his own jobs to fund his needs
* Determined to work hard and learn as much as he could
* Had roof over heads and food on the table but no money for nothing else
* Took father at lunch in [[New York]] when he became the [[CEO]] of [[Disney]] - appreciate what all his parents had done giving love, instilling ethics
* Started career at [[ABC]] as network news anchorman. Observed and learned from the craft and spoke the lingo
* Tolerated the demanding hours and extreme workload
* Wake up early at 4:15, time to think read and exercise before the demands of the day take over
* Few productive hours away from emails and text messages
* Created an environment where you refuse to accept mediocrity. Push back against the urge to say 'There is not enough time or energy'
* learned the importance of owning up a screw up. You will be more respected and trusted by people around you if you honestly own up your mistakes
* Excellence and fairness don't have to be mutually exclusive. Be aware about the need to strive for perfection and the pitfalls of caring only about the product and never the people
,,[[The Ride of a Lifetime]] | [[15 April 2022]],,
* Knowing what you don't know is a rare trait in the boss
* Genuine decency and competitiveness doesn't have to be mutually exclusive
* True [[Integrity]] - a sense of who you are and being guided by your own clear sense of right and wrong is kind of a secret weapon
* Look at bad situation not as a catastrophe but a puzzle to be solved and communicate to team members that we are talented and nimble enough to solve these problems and make something wonderful on the fly
* The instinct throughout the career has to say yes to every opportunity. Always wanted to move up and learn more. Don't drop out of a difficult opportunity, prove to yourself that you are capable of doing things that were uncertain
,,[[The Ride of a Lifetime]] | [[18 April 2022]],,
* ''Your inexperience can't be excuse for your failure''
* Tough situation and you are in-charge. Don't fake anything. Be humble. You also can't let humility keep you from leading
* Managing [[Creative]] process starts with the understanding that it is not [[Science]] - Everything is subjective and there is often no right or wrong. The passion it takes to create something is powerful and most creators are understandably sensitive when their vision or execution is questioned
* Don't spend time on little details if bigger picture is a mess
* ''If you want [[Innovation]], you need to give permission to fail''
* Conveying the [[Faith]] in your team at every step can make all the difference in your success
,,[[The Ride of a Lifetime]] | [[18 April 2022]],,
* [[Michael Eisner]] has been [[Disney]]'s [[CEO]] since 1984
* Managing your own time and respecting other's time is one of the most vital things to do as a [[Manager]]
* You have to learn to absorb. You have to hear out other people's problems and help find solutions. It is all part of being a great manager
* Willfully avoiding hard questions can blind people to their needs
* In the instances where you hope something will work out but not knowing how, is when you should start asking clarifying questions
** what is the problem I need to solve?
** Does this solution makes sense?
** If I am feeling some doubt, Why?
** Am I doing this for sound reasons or am I motivated by something personal
,,[[The Ride of a Lifetime]] | [[18 April 2022]],,
[[The Ride of a Lifetime]]
by [[Morgan Housel]]
Studied recessions and depressions of the past, observed that people, politicians respond in similar fashion with similar policies
''1. No one knows how they’ll respond to risk and setback until they’re in the moment of terror''
* Under high stress, “A man becomes a beast in three weeks,”
* Low taxes as popular economic platform
* Pre and Post recession, planned economics and politics changes quickly and people are willing to take and accept fickle outcomes
''2. Declines occur because many people’s entire goal is to become so successful that they can relax, and relaxing leads to complacency that breeds decline.''
*“What’s the point of working hard if you’re never going to celebrate, if there’s never any reward?" - career goal is to work hard so they can stop working hard one day. ''Relaxation compounds to complacency''
* In 1920s, post WW1, people wanted to relax so they partied more, borrowed more and spent more
* People view bubbles as crossing the finish line instead as a warning sign
* A generation brought up in broken economy sees gains from meme stocks as rightful compensation
''3. Innovation is hard to predict and easy to underestimate because so much occurs by accident, when several boring discoveries compound into something extraordinary.''
* [[Innovation]] is not always some fundamental discovery but discoveries made from lot of boring experiments and people tinkering with it to find different use cases
* When airplane was invented, the immediate use cases were parcel delivery and sky racing
* [[Facebook]] began as a way for college students to share pictures of their drunk weekends and within a decade was the most powerful lever in global politics
* No one predicted nuclear power plants. But they wouldn’t have been possible without the plane. Without the plane we wouldn’t have had the aerial bomb. Without the aerial bomb we wouldn’t have had the nuclear bomb. And without the nuclear bomb we wouldn’t have discovered the peaceful use of nuclear power.
!! Reference
* https://www.collaborativefund.com/blog/the-same-stories-again-and-again
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 20
Subtlety #2: To not give a fuck about adversity, you must first give a fuck about something more important than adversity. Imagine you’re
12 August 2022
CHAPTER 1: Don’t Try, p. 8
He knew it. And his success stemmed not from some determination to be a winner, but from the fact that he knew he was a loser, accepted it, and then wrote honestly about it. He never tried to be anything other than what he was. The genius in Bukowski’s work was not in overcoming unbelievable odds or developing himself into a shining literary light. It was the opposite. It was his simple ability to be completely, unflinchingly honest with himself—especially the worst parts of himself—and to share his failings without hesitation or doubt.
12 August 2022
CHAPTER 1: Don’t Try, p. 8
his comfort with himself as a failure. Bukowski didn’t give a fuck about success
12 August 2022
CHAPTER 1: Don’t Try, p. 8
Self-improvement and success often occur together. But that doesn’t necessarily mean they’re the same thing
12 August 2022
CHAPTER 1: Don’t Try, p. 9
life advice—all the positive and happy self-help stuff we hear all the time—is actually fixating on what you lack. It lasers in on what you perceive your personal shortcomings and failures to already be, and then emphasizes them for you
12 August 2022
CHAPTER 1: Don’t Try, p. 9
Ironically, this fixation on the positive—on what’s better, what’s superior—only serves to remind us over and over again of what we are not, of what we lack
12 August 2022
CHAPTER 1: Don’t Try, p. 10
The key to a good life is not giving a fuck about more; it’s giving a fuck about less, giving a fuck about only what is true and immediate and important.
12 August 2022
The Feedback Loop from Hell, p. 12
Oh my God, I feel like such a loser for calling myself a loser. I should stop calling myself a loser. Ah, fuck! I’m doing it again! See? I’m a loser! Argh!”
12 August 2022
The Feedback Loop from Hell, p. 13
The Feedback Loop from Hell has become a borderline epidemic, making many of us overly stressed, overly neurotic, and overly self-loathing
12 August 2022
The Feedback Loop from Hell, p. 13
not giving a fuck that you feel bad, you short-circuit the Feedback Loop from Hell; you say to yourself, “I feel like shit, but who gives a fuck?” And then, as if sprinkled by magic fuck-giving fairy dust, you stop hating yourself for feeling so bad.
12 August 2022
The Feedback Loop from Hell, p. 14
Our crisis is no longer material; it’s existential, it’s spiritual. We have so much fucking stuff and so many opportunities that we don’t even know what to give a fuck about anymore
12 August 2022
The Feedback Loop from Hell, p. 14
The desire for more positive experience is itself a negative experience. And, paradoxically, the acceptance of one’s negative experience is itself a positive experience.
12 August 2022
The Feedback Loop from Hell, p. 15
It’s what the philosopher Alan Watts used to refer to as “the backwards law”—the idea that the more you pursue feeling better all the time, the less satisfied you become, as pursuing something only reinforces the fact that you lack it in the first place
12 August 2022
The Feedback Loop from Hell, p. 15
Albert Camus
12 August 2022
The Feedback Loop from Hell, p. 15
You will never be happy if you continue to search for what happiness consists of. You will never live if you are looking for the meaning of life.”
12 August 2022
The Feedback Loop from Hell, p. 16
Ever notice that sometimes when you care less about something, you do better at it?
12 August 2022
The Feedback Loop from Hell, p. 16
backwards” for a reason: not giving a fuck works in reverse
12 August 2022
The Feedback Loop from Hell, p. 17
The avoidance of suffering is a form of suffering. The avoidance of struggle is a struggle. The denial of failure is a failure. Hiding what is shameful is itself a form of shame.
12 August 2022
The Feedback Loop from Hell, p. 18
To not give a fuck is to stare down life’s most terrifying and difficult challenges and still take action.
12 August 2022
The Feedback Loop from Hell, p. 19
here is essentially learning how to focus and prioritize your thoughts effectively—how to pick and choose what matters to you and what does not matter to you based on finely honed personal values
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 20
There’s a name for a person who finds no emotion or meaning in anything: a psychopath. Why you would want to emulate a psychopath, I have no fucking clue
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 20
Subtlety #1: Not giving a fuck does not mean being indifferent; it means being comfortable with being different.
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 22
They say, “Fuck it,” not to everything in life, but rather to everything unimportant in life. They reserve their fucks for what truly matters. Friends. Family. Purpose
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 22
You can’t be an important and life-changing presence for some people without also being a joke and an embarrassment to others. You just can’t. Because there’s no such thing as a lack of adversity. It doesn’t exist
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 20
The point isn’t to get away from the shit. The point is to find the shit you enjoy dealing with.
12 August 2022
The Subtle Art of Not Giving a Fuck, p. 22
Essentially, we become more selective about the fucks we’re willing to give. This is something called maturity. It’s nice; you should try it sometime. Maturity is what happens when one learns to only give a fuck about what’s truly fuckworthy. As
12 August 2022
So Mark, What the Fuck Is the Point of This Book Anyway?, p. 18
Instead, this book will turn your pain into a tool, your trauma into power, and your problems into slightly better problems. That is real progress. Think of it as a guide to suffering and how to do it better, more meaningfully, with more compassion and more humility. It’s a book about moving lightly despite your heavy burdens, resting easier with your greatest fears, laughing at your tears as you cry them.
13 August 2022
Happiness Comes from Solving Problems, p. 40
Problems never stop; they merely get exchanged and/or upgraded. Happiness comes from solving problems. The keyword here is “solving.” If you’re avoiding your problems or feel like you don’t have any problems, then you’re going to make yourself miserable
13 August 2022
Choose Your Struggle
hedonic treadmill”: the idea that we’re always working hard to change our life situation, but we actually never feel very different. This is why our problems are recursive and unavoidable
13 August 2022
Choose Your Struggle
We like the idea that there’s some form of ultimate happiness that can be attained. We like the idea that we can alleviate all of our suffering permanently. We like the idea that we can feel fulfilled and satisfied with our lives forever. But we cannot.
13 August 2022
Choose Your Struggle
I didn’t actually want it. I was in love with the result—the image of me on stage, people cheering, me rocking out, pouring my heart into what I was playing—but I wasn’t in love with the process
13 August 2022
CHAPTER 2: Happiness Is a Problem, p. 38
As with being rich, there is no value in suffering when it’s done without purpose. And soon the prince came to the conclusion that his grand idea, like his father’s, was in fact a fucking terrible idea and he should probably go do something else instead.
13 August 2022
CHAPTER 2: Happiness Is a Problem, p. 38
One of those realizations was this: that life itself is a form of suffering. The rich suffer because of their riches. The poor suffer because of their poverty
13 August 2022
CHAPTER 2: Happiness Is a Problem, p. 38
This isn’t to say that all suffering is equal
13 August 2022
The Misadventures of Disappointment Panda, p. 38
The prince would later become known as the Buddha
13 August 2022
The Misadventures of Disappointment Panda, p. 38
There is a premise that underlies a lot of our assumptions and beliefs. The premise is that happiness is algorithmic, that it can be worked for and earned and achieved as if it were getting accepted to law school or building a really complicated Lego set
13 August 2022
The Misadventures of Disappointment Panda, p. 38
This premise, though, is the problem
13 August 2022
The Misadventures of Disappointment Panda, p. 38
superhero, I would invent one called Disappointment Panda
13 August 2022
The Misadventures of Disappointment Panda, p. 38
superpower would be to tell people harsh truths about themselves that they needed to hear but didn’t want to accept.
13 August 2022
The Misadventures of Disappointment Panda, p. 39
We suffer for the simple reason that suffering is biologically useful. It is nature’s preferred agent for inspiring change. We have evolved to always live with a certain degree of dissatisfaction and insecurity, because it’s the mildly dissatisfied and insecure creature that’s going to do the most work to innovate and survive
13 August 2022
The Misadventures of Disappointment Panda, p. 39
So no—our own pain and misery aren’t a bug of human evolution; they’re a feature.
13 August 2022
The Misadventures of Disappointment Panda, p. 39
Pain is what teaches us what to pay attention to when we’re young or careless
13 August 2022
The Misadventures of Disappointment Panda, p. 39
In fact, research has found that our brains don’t register much difference between physical pain and psychological pain
13 August 2022
The Misadventures of Disappointment Panda, p. 40
some cases, experiencing emotional or psychological pain can be healthy or necessary
13 August 2022
The Misadventures of Disappointment Panda, p. 40
failure teaches us how to avoid making the same mistakes in the future.
13 August 2022
The Misadventures of Disappointment Panda, p. 40
Don’t hope for a life without problems,” the panda said. “There’s no such thing. Instead, hope for a life full of good problems.”
13 August 2022
Emotions Are Overrated
People deny and blame others for their problems for the simple reason that it’s easy and feels good, while solving problems is hard and often feels bad. Forms of blame and denial give us a quick high. They are a way to temporarily escape our problems, and that escape can provide us a quick rush that makes us feel better.
13 August 2022
Emotions Are Overrated
Remember, nobody who is actually happy has to stand in front of a mirror and tell himself that he’s happy
13 August 2022
Emotions Are Overrated
The
13 August 2022
Emotions Are Overrated
negative emotions are a call to action. When you feel them, it’s because you’re supposed to do something. Positive emotions, on the other hand, are rewards for taking the proper action
13 August 2022
Emotions Are Overrated
Emotions are merely signposts, suggestions that our neurobiology gives us, not commandments. Therefore, we shouldn’t always trust our own emotions. In fact, I believe we should make a habit of questioning them.
13 August 2022
Choose Your Struggle
What pain do you want in your life? What are you willing to struggle for?”
13 August 2022
Choose Your Struggle
Because happiness requires struggle. It grows from problems
13 August 2022
Choose Your Struggle
didn’t like to climb much. I just liked to imagine the summit.
13 August 2022
Choose Your Struggle
See: it’s a never-ending upward spiral. And if you think at any point you’re allowed to stop climbing, I’m afraid you’re missing the point. Because the joy is in the climb itself.
13 August 2022
CHAPTER 3: You Are Not Special
If a person like Jimmy feels absolutely fucking great 99.9 percent of the time, despite his life falling apart around him, then how can that be a valid metric for a successful and happy life? Jimmy is entitled. That is, he feels as though he deserves good things without actually earning them
13 August 2022
Things Fall Apart
If we have problems that are unsolvable, our unconscious figures that we’re either uniquely special or uniquely defective in some way. That we’re somehow unlike everyone else and that the rules must be different for us. Put simply: we become entitled
13 August 2022
Things Fall Apart
I’m awesome and the rest of you all suck, so I deserve special treatment. 2. I suck and the rest of you are all awesome, so I deserve special treatment.
13 August 2022
B-b-b-but, If I’m Not Going to Be Special or Extraordinary, What’s the Point?
true). Each and every one of us can be extraordinary. We all deserve greatness. The fact that this statement is inherently contradictory—after all, if everyone were extraordinary, then by definition no one would be extraordinary—is missed by most people.
13 August 2022
CHAPTER 3: You Are Not Special
Research found that people who thought highly about themselves generally performed better and caused fewer problems. Many researchers and policymakers at the time came to believe that raising a population’s self-esteem could lead to some tangible social benefits: lower crime, better academic records, greater employment, lower budget deficits
13 August 2022
CHAPTER 3: You Are Not Special
self-esteem practices began to be taught to parents, emphasized by therapists, politicians, and teachers
13 August 2022
CHAPTER 3: You Are Not Special
Grade inflation, for example, was implemented to make low-achieving kids feel better about their lack of achievement
13 August 2022
CHAPTER 3: You Are Not Special
Participation awards and bogus trophies were invented for any number of mundane and expected activities
13 August 2022
CHAPTER 3: You Are Not Special
But the problem with entitlement is that it makes people need to feel good about themselves all the time, even at the expense of those around them
13 August 2022
CHAPTER 3: You Are Not Special
The true measurement of self-worth is not how a person feels about her positive experiences, but rather how she feels about her negative experiences. A person like Jimmy hides from his problems by making up imagined successes for himself at every turn
13 August 2022
CHAPTER 3: You Are Not Special
A person who actually has a high self-worth is able to look at the negative parts of his character frankly—“Yes, sometimes I’m irresponsible with money
13 August 2022
CHAPTER 3: You Are Not Special
But entitled people, because they are incapable of acknowledging their own problems openly and honestly, are incapable of improving their lives in any lasting or meaningful way. They
13 August 2022
Things Fall Apart
sucked donkey balls. I lost all of my friends, my community, my legal rights, and my family within the span of about nine months. My therapist in my twenties would
13 August 2022
Things Fall Apart
assumed inability to solve our problems causes us to feel miserable and helpless
13 August 2022
Things Fall Apart
The truth is that there’s no such thing as a personal problem. If you’ve got a problem, chances are millions of other people have had it in the past, have it now, and are going to have it in the future
13 August 2022
Things Fall Apart
It just means that you’re not special.
13 August 2022
The Tyranny of Exceptionalism
It’s strange that in an age when we are more connected than ever, entitlement seems to be at an all-time high. Something about recent technology seems to allow our insecurities to run amok like never before. The more freedom we’re given to express ourselves, the more we want to be free of having to deal with anyone who may disagree with us or upset us
13 August 2022
The Tyranny of Exceptionalism
The problem is that the pervasiveness of technology and mass marketing is screwing up a lot of people’s expectations for themselves. The inundation of the exceptional makes people feel worse about themselves, makes them feel that they need to be more extreme, more radical, and more self-assured to get noticed or even matter
13 August 2022
B-b-b-but, If I’m Not Going to Be Special or Extraordinary, What’s the Point?
The Internet has not just open-sourced information; it has also open-sourced insecurity, self-doubt, and shame.
13 August 2022
B-b-b-but, If I’m Not Going to Be Special or Extraordinary, What’s the Point?
Point?
13 August 2022
B-b-b-but, If I’m Not Going to Be Special or Extraordinary, What’s the Point?
Being “average” has become the new standard of failure.
13 August 2022
B-b-b-but, If I’m Not Going to Be Special or Extraordinary, What’s the Point?
People who become great at something become great because they understand that they’re not already great—they are mediocre, they are average—and that they could be so much better.
13 August 2022
B-b-b-but, If I’m Not Going to Be Special or Extraordinary, What’s the Point?
Your actions actually don’t matter that much in the grand scheme of things
14 August 2022
Rock Star Problems
Today, Mustaine is considered one of the most brilliant and influential musicians in the history of heavy-metal music. Unfortunately, the band he was kicked out of was Metallica, which has sold over 180 million albums worldwide. Metallica is considered by many to be one of the greatest rock bands of all time.
14 August 2022
Shitty Values
sometimes life sucks, and the healthiest thing you can do is admit it. Denying negative emotions leads to experiencing deeper and more prolonged negative emotions and to emotional dysfunction. Constant positivity is a form of avoidance, not a valid solution to life’s problems
14 August 2022
Defining Good and Bad Values
Good values are 1) reality-based, 2) socially constructive, and 3) immediate and controllable. Bad values are 1) superstitious, 2) socially destructive, and 3) not immediate or controllable
14 August 2022
CHAPTER 4: The Value of Suffering
Onoda said it was simple: he had been given the order to “never surrender,” so he stayed. For nearly thirty years he had simply been following an order
14 August 2022
CHAPTER 4: The Value of Suffering
Humans often choose to dedicate large portions of their lives to seemingly useless or destructive causes. On the surface, these causes make no sense
14 August 2022
CHAPTER 4: The Value of Suffering
To both men, their suffering meant something; it fulfilled some greater cause. And because it meant something, they were able to endure it, or perhaps even enjoy it
14 August 2022
The Self-Awareness Onion
If suffering is inevitable, if our problems in life are unavoidable, then the question we should be asking is not “How do I stop suffering?” but “Why am I suffering—for what purpose?”
14 August 2022
The Self-Awareness Onion
Self-awareness is like an onion. There are multiple layers to it, and the more you peel them back, the more likely you’re going to start crying at inappropriate times.
14 August 2022
The Self-Awareness Onion
constant questioning and effort, is incredibly difficult to reach. But it’s the most important, because our values determine the nature of our problems, and the nature of our problems determines the quality of our lives.
14 August 2022
Rock Star Problems
What is objectively true about your situation is not as important as how you come to see the situation, how you choose to measure it and value it. Problems may be inevitable, but the meaning of each problem is not
14 August 2022
Rock Star Problems
The guitarist’s name was Dave Mustaine, and the new band he formed was the legendary heavy-metal band Megadeth
14 August 2022
Shitty Values
These stories suggest that some values and metrics are better than others. Some lead to good problems that are easily and regularly solved. Others lead to bad problems that are not easily and regularly solved
14 August 2022
Shitty Values
Pleasure is great, but it’s a horrible value to prioritize your life around
14 August 2022
Shitty Values
Research shows that people who focus their energy on superficial pleasures end up more anxious, more emotionally unstable, and more depressed
14 August 2022
Shitty Values
easiest to obtain and the easiest to lose
14 August 2022
Shitty Values
Material Success
14 August 2022
Shitty Values
Research shows that once one is able to provide for basic physical needs (food, shelter, and so on), the correlation between happiness and worldly success quickly approaches zero.
14 August 2022
Shitty Values
Always Being Right
14 August 2022
Shitty Values
It’s far more helpful to assume that you’re ignorant and don’t know a whole lot
14 August 2022
Shitty Values
Staying Positive
14 August 2022
Shitty Values
The trick with negative emotions is to 1) express them in a socially acceptable and healthy manner and 2) express them in a way that aligns with your values
14 August 2022
Defining Good and Bad Values
One day, in retrospect, the years of struggle will strike you as the most beautiful
14 August 2022
Defining Good and Bad Values
This is why these values—pleasure, material success, always being right, staying positive—are poor ideals for a person’s life. Some of the greatest moments of one’s life are not pleasant, not successful, not known, and not positive.
14 August 2022
Defining Good and Bad Values
Popularity, on the other hand, is a bad value
14 August 2022
Defining Good and Bad Values
good, healthy values: honesty, innovation, vulnerability, standing up for oneself, standing up for others, self-respect, curiosity, charity, humility, creativity.
14 August 2022
Defining Good and Bad Values
bad, unhealthy values: dominance through manipulation or violence, indiscriminate fucking, feeling good all the time, always being the center of attention, not being alone, being liked by everybody, being rich for the sake of being rich, sacrificing small animals to the pagan gods.
14 August 2022
Defining Good and Bad Values
Bad values are generally reliant on external events
14 August 2022
Defining Good and Bad Values
improvement” is really about: prioritizing better values, choosing better things to give a fuck about. Because when you give better fucks, you get better problems. And when you get better problems, you get a better life.
14 August 2022
The Responsibility/Fault Fallacy
With great responsibility comes great power.” The more we choose to accept responsibility in our lives, the more power we will exercise over our lives. Accepting responsibility for our problems is thus the first step to solving them
14 August 2022
The Responsibility/Fault Fallacy
A lot of people hesitate to take responsibility for their problems because they believe that to be responsible for your problems is to also be at fault for your problems. Responsibility and fault often appear together in our culture. But they’re not the same thing. If I hit you with my car, I am both at fault and likely legally responsible to compensate you in some way. Even if hitting you with my car was an accident, I am still responsible. This is the way fault works in our society: if you fuck up, you’re on the hook for making it right. And it should be that way.
14 August 2022
Genetics and the Hand We’re Dealt
And it’s true, it’s not their fault. But it’s still their responsibility
14 August 2022
Victimhood Chic
outrage porn”: rather than report on real stories and real issues, the media find it much easier (and more profitable) to find something mildly offensive, broadcast it to a wide audience, generate outrage, and then broadcast that outrage back across the population in a way that outrages yet another part of the population. This triggers a kind of echo of bullshit pinging back and forth between two imaginary sides, meanwhile distracting everyone from real societal problems. It’s no wonder we’re more politically polarized than ever before. The biggest problem with victimhood chic is that it sucks attention away from actual victims
14 August 2022
The Choice
Often the only difference between a problem being painful or being powerful is a sense that we chose it, and that we are responsible for it.
14 August 2022
The Choice
When we feel that we’re choosing our problems, we feel empowered. When we feel that our problems are being forced upon us against our will, we feel victimized and miserable
14 August 2022
The Choice
William James went on to become the father of American psychology. His work has been translated into a bazillion languages, and he’s regarded as one of the most influential intellectuals/philosophers/psychologists of his generation
14 August 2022
The Responsibility/Fault Fallacy
Judges don’t get to choose their cases. When a case goes to court, the judge assigned to it did not commit the crime, was not a witness to the crime, and was not affected by the crime, but he or she is still responsible for the crime
14 August 2022
The Responsibility/Fault Fallacy
Responsibility is present tense. Fault results from choices that have already been made. Responsibility results from the choices you’re currently making, every second of every day. You are choosing to read this
14 August 2022
The Responsibility/Fault Fallacy
learned the hard way that if the people in your relationships are selfish and doing hurtful things, it’s likely you are too, you just don’t realize it.
14 August 2022
Genetics and the Hand We’re Dealt
OCD is a terrible neurological and genetic disorder that cannot be cured. At best, it can be managed. And, as we’ll see, managing the disorder comes down to managing one’s values
14 August 2022
Genetics and the Hand We’re Dealt
I didn’t choose this life; I didn’t choose this horrible, horrible condition. But I get to choose how to live with it; I have to choose how to live with it.”
14 August 2022
Genetics and the Hand We’re Dealt
The beauty of poker is that while luck is always involved, luck doesn’t dictate the long-term results of the game. A
14 August 2022
Genetics and the Hand We’re Dealt
see life in the same terms. We all get dealt cards. Some of us get better cards than others. And while it’s easy to get hung up on our cards, and feel we got screwed over, the real game lies in the choices we make with those cards, the risks we decide to take, and the consequences we choose to live with
14 August 2022
Victimhood Chic
The responsibility/fault fallacy allows people to pass off the responsibility for solving their problems to others. This ability to alleviate responsibility through blame gives people a temporary high and a feeling of moral righteousness
14 August 2022
There Is No “How”
Outrage is like a lot of other things that feel good but over time devour us from the inside out. And it’s even more insidious than most vices because we don’t even consciously acknowledge that it’s a pleasure
14 August 2022
There Is No “How”
Do, or do not; there is no ‘how.’ ”
14 August 2022
There Is No “How”
As you reassess your values, you will be met with internal and external resistance along the way. More than anything, you will feel uncertain; you will wonder if what you’re doing is wrong.
14 August 2022
CHAPTER 6: You’re Wrong About Everything (But So Am I)
Growth is an endlessly iterative process. When we learn something new, we don’t go from “wrong” to “right.” Rather, we go from wrong to slightly less wrong. And when we learn something additional, we go from slightly less wrong to slightly less wrong than that, and then to even less wrong than that, and so on. We are always in the process of approaching truth and perfection without actually ever reaching truth or perfection. We shouldn’t seek to find the ultimate “right” answer for ourselves, but rather, we should seek to chip away at the ways that we’re wrong today so that we can be a little less wrong tomorrow
14 August 2022
CHAPTER 6: You’re Wrong About Everything (But So Am I)
A certain woman is single and lonely and wants a partner, but she never gets out of the house and does anything about it. A certain man works his ass off and believes he deserves a promotion, but he never explicitly says that to his boss. They’re told that they’re afraid of failure, of rejection, of someone saying no.
14 August 2022
CHAPTER 6: You’re Wrong About Everything (But So Am I)
Certainty is the enemy of growth. Nothing is for certain until it has already happened—and even then, it’s still debatable. That’s why accepting the inevitable imperfections of our values is necessary for any growth to take place. Instead of striving for certainty, we should be in constant search of doubt: doubt about our own beliefs, doubt about our own feelings, doubt about what the future may hold for us unless we get out there and create it for ourselves. Instead of looking to be right all the time, we should be looking for how we’re wrong all the time. Because we are.
14 August 2022
Be Careful What You Believe
But there are two problems. First, the brain is imperfect. We mistake things we see and hear. We forget things or misinterpret events quite easily. Second, once we create meaning for ourselves, our brains are designed to hold on to that meaning. We are biased toward the meaning our mind has made, and we don’t want to let go of it. Even if we see evidence that contradicts the meaning we created, we often ignore it and keep on believing anyway.
14 August 2022
The Dangers of Pure Certainty
backwards law again: the more you try to be certain about something, the more uncertain and insecure you will feel. But the converse is true as well: the more you embrace being uncertain and not knowing, the more comfortable you will feel in knowing what you don’t know
14 August 2022
Manson’s Law of Avoidance
Avoidance Chances are you’ve heard some form of Parkinson’s law: “Work expands so as to fill up the time available
14 August 2022
Manson’s Law of Avoidance
Manson’s law of avoidance on them: The more something threatens your identity, the more you will avoid it.
14 August 2022
CHAPTER 6: You’re Wrong About Everything (But So Am I)
When I was a little boy, I used to think “mediocre” was a kind of vegetable that I didn’t want to eat
14 August 2022
Be Careful What You Believe
The result of all this? Most of our beliefs are wrong. Or, to be more exact, all beliefs are wrong—some are just less wrong than others
14 August 2022
Be Careful What You Believe
My Lie: A True Story of False Memory, throughout the 1980s, many women accused male family members of sexual abuse only to turn around and recant years later
14 August 2022
The Dangers of Pure Certainty
false memory syndrome. It changed the way courtrooms operate. Thousands of therapists were sued and lost their licenses. Repressed memory therapy fell out of practice and was replaced by more practical methods
14 August 2022
The Dangers of Pure Certainty
In the mid-1990s, psychologist Roy Baumeister began researching the concept of evil. Basically, he looked at people who do bad things and at why they do them.
14 August 2022
The Dangers of Pure Certainty
At the time it was assumed that people did bad things because they felt horrible about themselves—that is, they had low self-esteem
14 August 2022
The Dangers of Pure Certainty
Some of the worst criminals felt pretty damn good about themselves. And it was this feeling good about themselves in spite of the reality around them that gave them the sense of justification for hurting and disrespecting others.
14 August 2022
The Dangers of Pure Certainty
Evil people never believe that they are evil; rather, they believe that everyone else is evil.
14 August 2022
The Dangers of Pure Certainty
Milgram Experiments, named for the psychologist Stanley Milgram, researchers told “normal” people that they were to punish other volunteers for breaking various rules
14 August 2022
Kill Yourself
As noted before, we’re unfairly biased toward what we already know, what we believe to be certain.
14 August 2022
Kill Yourself
say don’t find yourself. I say never know who you are. Because that’s what keeps you striving and discovering. And it forces you to remain humble in your judgments and accepting of the differences in others.
14 August 2022
Kill Yourself
Buddhism argues that your idea of who “you” are is an arbitrary mental construction and that you should let go of the idea that “you” exist at all; that the arbitrary metrics by which you define yourself actually trap you, and thus you’re better off letting go of everything
14 August 2022
Kill Yourself
Buddhism encourages you to not give a fuck
14 August 2022
Kill Yourself
My recommendation: don’t be special; don’t be unique. Redefine your metrics in mundane and broad ways. Choose to measure yourself not as a rising star or an undiscovered genius. Choose to measure yourself not as some horrible victim or dismal failure. Instead, measure yourself by more mundane identities: a student, a partner, a friend, a creator.
14 August 2022
Kill Yourself
The narrower and rarer the identity you choose for yourself, the more everything will seem to threaten you. For that reason, define yourself in the simplest and most ordinary ways possible
14 August 2022
How to Be a Little Less Certain of Yourself
As a general rule, we’re all the world’s worst observers of ourselves.
14 August 2022
How to Be a Little Less Certain of Yourself
The goal is merely to ask the question and entertain the thought at the moment, not to hate yourself
14 August 2022
How to Be a Little Less Certain of Yourself
Question #2: What would it mean if I were wrong
14 August 2022
How to Be a Little Less Certain of Yourself
Aristotle wrote, “It is the mark of an educated mind to be able to entertain a thought without accepting it.” Being able to look at and evaluate different values without necessarily adopting them is perhaps the central skill required in changing one’s own life in a meaningful way
14 August 2022
How to Be a Little Less Certain of Yourself
Question #3: Would being wrong create a better or a worse problem than my current problem, for both myself and others?
14 August 2022
How to Be a Little Less Certain of Yourself
That’s simply reality: if it feels like it’s you versus the world, chances are it’s really just you versus yourself.
14 August 2022
Pain Is Part of the Process
When you choose a new value, you are choosing to introduce a new form of pain into your life. Relish it. Savor it. Welcome it with open arms. Then act despite it. I
14 August 2022
CHAPTER 7: Failure Is the Way Forward
I say I was fortunate because I entered the adult world already a failure. I started out at rock bottom. That’s basically everybody’s biggest fear later on in life
14 August 2022
CHAPTER 7: Failure Is the Way Forward
my value was something else. It was freedom, autonomy. The idea of being an entrepreneur had always
14 August 2022
The Failure/Success Paradox
Improvement at anything is based on thousands of tiny failures, and the magnitude of your success is based on how many times you’ve failed at something. If someone is better than you at something, then it’s likely because she has failed at it more than you have
14 August 2022
The Failure/Success Paradox
A lot of this fear of failure comes from having chosen shitty values.
14 August 2022
The Failure/Success Paradox
Whereas if I instead adopt the metric “Improve my social life,” I can live up to my value of “good relations with others” regardless of how other people respond to me. My self-worth is based on my own behaviors and happiness.
14 August 2022
The Failure/Success Paradox
Better values, as we saw, are process-oriented
14 August 2022
The Failure/Success Paradox
never completely finished; it’s
14 August 2022
Pain Is Part of the Process
It was the value “honest expression.” And this is what made that napkin so valuable.
14 August 2022
Pain Is Part of the Process
A sizable percentage of them believed that the wartime experiences they’d suffered, although painful and indeed traumatic, had actually caused them to become better, more responsible, and yes, even happier people
14 August 2022
Pain Is Part of the Process
You could call it “hitting bottom” or “having an existential crisis.” I prefer to call it “weathering the shitstorm
14 August 2022
Pain Is Part of the Process
just shut up and do
14 August 2022
Pain Is Part of the Process
The problem was that my emotions defined my reality. Because it felt like people didn’t want to talk to me, I came to believe that people didn’t want to talk to me
14 August 2022
The “Do Something” Principle
If you’re stuck on a problem, don’t sit there and think about it; just start working on it. Even if you don’t know what you’re doing, the simple act of working on it will eventually cause the right ideas to show up in your head.”
14 August 2022
The “Do Something” Principle
Don’t just sit there. Do something. The answers will follow.
14 August 2022
The “Do Something” Principle
Action isn’t just the effect of motivation; it’s also the cause of it.
14 August 2022
The “Do Something” Principle
If you lack the motivation to make an important change in your life, do something—anything, really—and then harness the reaction to that action as a way to begin motivating yourself.
14 August 2022
The “Do Something” Principle
call this the “do something” principle
14 August 2022
The “Do Something” Principle
do something” principle, failure feels unimportant. When the standard of success becomes merely acting—when any result is regarded as progress and important, when inspiration is seen as a reward rather than a prerequisite—we propel ourselves ahead
14 August 2022
The “Do Something” Principle
do something” principle not only helps us overcome procrastination, but it’s also the process by which we adopt new values
14 August 2022
Rejection Makes Your Life Better
To value X, we must reject non-X. That rejection is an inherent and necessary part of maintaining our values, and therefore our identity. We are defined by what we choose to reject. And if we reject nothing (perhaps in fear of being rejected by something ourselves), we essentially have no identity at all.
14 August 2022
Boundaries
entitled people fall into one of two traps in their relationships. Either they expect other people to take responsibility for their problems: “I wanted a nice relaxing weekend at home. You should have known that and canceled your plans.” Or they take on too much responsibility for other people’s problems: “She just lost her job again, but it’s probably my fault because I wasn’t as supportive of her as I could have been. I’m going to help her rewrite her résumé tomorrow.” Entitled people adopt these strategies in their relationships, as with everything, to help avoid accepting responsibility for their own problems. As a result, their relationships are fragile and fake, products of avoiding inner pain rather than embracing a genuine appreciation and adoration of their partner. This goes not just for romantic relationships, by the way, but also for family relationships and friendships
14 August 2022
How to Build Trust
When our highest priority is to always make ourselves feel good, or to always make our partner feel good, then nobody ends up feeling good. And our relationship falls apart without our even knowing it. Without conflict, there can be no trust. Conflict exists to show us who is there for us unconditionally and who is just there for the benefits. No one trusts a yes-man
14 August 2022
CHAPTER 8: The Importance of Saying No
Travel is a fantastic self-development tool, because it extricates you from the values of your culture and shows you that another society can live with entirely different values and still function and not hate themselves. This exposure to different cultural values and metrics then forces you to reexamine what seems obvious in your own life and to consider that perhaps it’s not necessarily the best way to live.
14 August 2022
Boundaries
Unhealthy love is based on two people trying to escape their problems through their emotions for each other—in other words, they’re using each other as an escape. Healthy love is based on two people acknowledging and addressing their own problems with each other’s support.
14 August 2022
Boundaries
The difference between a healthy and an unhealthy relationship comes down to two things: 1) how well each person in the relationship accepts responsibility, and 2) the willingness of each person to both reject and be rejected by their partner.
14 August 2022
Boundaries
Anywhere there is an unhealthy or toxic relationship, there will be a poor and porous sense of responsibility on both sides, and there will be an inability to give and/or receive rejection. Wherever there is a healthy and loving relationship, there will be clear boundaries between the
14 August 2022
Boundaries
two people and their values, and there will be an open avenue of giving and receiving rejection when necessary
14 August 2022
Boundaries
These two types of people are drawn strongly to one another, and they usually end up together. Their pathologies match one another perfectly. Often they’ve grown up with parents who each exhibit one of these traits as well. So their model for a “happy” relationship is one based on entitlement and poor boundaries
14 August 2022
Boundaries
People with strong boundaries are not afraid of a temper tantrum, an argument, or getting hurt. People with weak boundaries are terrified of those things and will constantly mold their own behavior to fit the highs and lows of their relational emotional roller coaster.
14 August 2022
How to Build Trust
Because honesty in my relationship is more important to me than feeling good all the time. The last person I should ever have to censor myself with is the woman I love.
14 August 2022
How to Build Trust
For a relationship to be healthy, both people must be willing and able to both say no and hear no. Without that negation, without that occasional rejection, boundaries break down and one person’s problems and values come to dominate the other’s. Conflict is not only normal, then; it’s absolutely necessary for the maintenance of a healthy relationship. If two people who are close are not able to hash out their differences openly and vocally, then the relationship is based on manipulation and misrepresentation, and it will slowly become toxic.
14 August 2022
How to Build Trust
If people cheat, it’s because something other than the relationship is more important to them. It may be power over others. It may be validation through sex
14 August 2022
How to Build Trust
I don’t know what I was thinking; I was stressed out and drunk and she was there” response, then he lacks the serious self-awareness necessary to solve any relationship problems.
14 August 2022
How to Build Trust
When trust is destroyed, it can be rebuilt only if the following two steps happen: 1) the trust-breaker admits the true values that caused the breach and owns up to them, and 2) the trust-breaker builds a solid track record of improved behavior over time.
14 August 2022
Freedom Through Commitment
Trust is like a china plate. If you break it once, with some care and attention you can put it back together again. But if you break it again, it splits into even more pieces and it takes far longer to piece together again
14 August 2022
Freedom Through Commitment
We are actually often happier with less. When we’re overloaded with opportunities and options, we suffer from what psychologists refer to as the paradox of choice. Basically, the more options we’re given, the less satisfied we become with whatever we choose, because we’re aware of all the other options we’re potentially forfeiting.
14 August 2022
Freedom Through Commitment
When you’ve never left your home country, the first country you visit inspires a massive perspective shift, because you have such a narrow experience base to draw on.
14 August 2022
Freedom Through Commitment
The older you get, the more experienced you get, the less significantly each new experience affects you
14 August 2022
Freedom Through Commitment
Commitment gives you freedom because it hones your attention and focus, directing them toward what is most efficient at making you healthy and happy. Commitment makes decision-making easier and removes any fear of missing out; knowing that what you already have is good enough, why would you ever stress about chasing more, more, more again? Commitment allows you to focus intently on a few highly important goals and achieve a greater degree of success than you otherwise would.
14 August 2022
Something Beyond Our Selves
Becker died in 1974. His book The Denial of Death, would win the Pulitzer Prize and become one of the most influential intellectual works of the twentieth century, shaking up the fields of psychology and anthropology, while making profound philosophical claims that are still influential today. The Denial of Death essentially makes two points:
14 August 2022
CHAPTER 9: . . . And Then You Die
The next summer, I challenged myself to read fifty nonfiction books in fifty days, and then did
14 August 2022
Something Beyond Our Selves
Oddly, it was someone else’s death that gave me permission to finally live. And perhaps the worst moment of my life was also the most transformational.
14 August 2022
Something Beyond Our Selves
Humans are unique in that we’re the only animals that can conceptualize and think about ourselves abstractly. Dogs don’t sit around and worry about their career. Cats don’t think about their past mistakes or wonder
14 August 2022
Something Beyond Our Selves
This realization causes what Becker calls “death terror,” a deep existential anxiety that underlies everything we think or do.
14 August 2022
Something Beyond Our Selves
Becker’s second point starts with the premise that we essentially have two “selves.” The first self is the physical self—the one that eats, sleeps, snores, and poops. The second self is our conceptual self—our identity, or how we see ourselves.
14 August 2022
Something Beyond Our Selves
This is why people try so hard to put their names on buildings, on statues, on spines of books. It’s why we feel compelled
14 August 2022
Something Beyond Our Selves
immortality projects,” projects that allow our conceptual self to live on way past the point of our physical death
14 August 2022
Something Beyond Our Selves
Becker argues that wars and revolutions and mass murder occur when one group of people’s immortality projects rub up against another group’s
14 August 2022
Something Beyond Our Selves
immortality projects are our values
14 August 2022
Something Beyond Our Selves
that people’s immortality projects were actually the problem, not the solution; that rather than attempting to implement, often through lethal force, their conceptual self across the world, people should question their conceptual self and become more comfortable with the reality of their own death. Becker called this “the bitter antidote,”
14 August 2022
Something Beyond Our Selves
While death is bad, it is inevitable. Therefore, we should not avoid this realization, but rather come to terms with it as best we can
14 August 2022
The Sunny Side of Death
The three-foot distance is most people’s absolute limit. It’s just close enough to lean forward and catch a glimpse of the bottom, but still far enough to feel as though you’re not at any real risk of killing yourself. Standing that close to the edge of a cliff, even one as beautiful and mesmerizing as the Cape of Good Hope, induces a heady sense of vertigo, and threatens to regurgitate any recent meal.
14 August 2022
The Sunny Side of Death
The only way to be comfortable with death is to understand and see yourself as something bigger than yourself; to choose values that stretch beyond serving yourself, that are simple and immediate and controllable and tolerant of the chaotic world around you. This is the basic root of all happiness. Whether you’re listening
14 August 2022
The Sunny Side of Death
You are already great because in the face of endless confusion and certain death, you continue to choose what to give a fuck about and what not to
14 August 2022
The Sunny Side of Death
Bukowski once wrote, “We’re all going to die, all of us. What a circus! That alone should make us love each other, but it doesn’t. We are terrorized and flattened by life’s trivialities; we are eaten up by nothing
[[The Subtle art of not giving a f*ck]]
Book by [[Mark Manson]]
[[15 August 2022]]
''Trick to learning more and success is to frame the learning process right. Focusing on the princess and not the pits, to stick with the task and learn more''
When users are penalized for failure and not penalized at all the results show that non-penalized people try more (2.5x more) than those who are penalized and thus increases their success rate by (16%) based on 50,000 data points for programming puzzle
<img src='https://miro.medium.com/max/2786/1*pZsz_aTxGKyHywhdc16GyA.png' width=500>
<iframe width="560" height="315"
src="https://www.youtube.com/embed/9vJRopau0g0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[08 April 2021]]
A Ulysses pact or Ulysses contract is a freely made decision that is designed and intended to bind oneself in the future.
!! Defining the problem and assembling a dataset
''Stage 1: Defining the problem and assembling a dataset''
* What will your input data be?
* What are you trying to predict?
* What type of problem are you facing? - binary, multi-class, multi-label classifcation, or scalar, vector regressions, clustering...
''Stage 2:''
* You hypothesize that your outputs can be predicted given your inputs
* You hypothesize that your available data is sufficiently informative to learn the relationship between inputs and outputs.
One class of unsolvable problems you should be aware of is [[Nonstationary problems]]. For example, clothes buying is a nonstationary phenomenon over the scale of a few months.
''Stage 3: Choosing a measure of success''
* Balanced-classification problems, where every class is equally likely, accuracy and area under the receiver operating characteristic curve (ROC AUC) are common metrics. For class-imbalanced problems, you can use precision and recall.
''Stage 4: Deciding on an evaluation protocol''
* Maintaining a hold-out validation set—The way to go when you have plenty of data
* Doing K-fold cross-validation—The right choice when you have too few samples for hold-out validation to be reliable
* Doing iterated K-fold validation - For performing highly accurate model evaluation when little data is available
''Stage 5: Preparing data''
* Format as tensors
* The values taken by these tensors should usually be scaled to small values
* If different features take values in different ranges (heterogeneous data), then the data should be normalized
* Feature engineering for small data problems
''Stage 6: Developing a model that does better than a baseline''
Your goal at this stage is to achieve ''statistical power'' : that is, to develop a small model that is capable of beating a dumb baseline.
If you can’t beat a random baseline after trying multiple reasonable architectures, it may be that the answer to the question you’re asking isn’t present in the input data. Three key choices to build your
first working model
* ''Last-layer activation''
* ''Loss function''
* ''Optimization configuration'' - In most cases, it’s safe to go with ''`rmsprop` and its default learning rate.''
''Stage 7: Scaling up: developing a model that overfits''
Once you’ve obtained a model that has statistical power, the question becomes, is your model sufficiently powerful? ''The ideal model is one that stands right at the border between underfitting and overfitting; between undercapacity and overcapacity''. To identify how big of a model you need, develop one that overfits
# Add layers.
# Make the layers bigger.
# Train for more epochs.
''Stage 8: Regularizing your model and tuning your hyperparameters''
* Add [[Dropout Regularization For Neural Networks]]
* Try different architectures: add or remove layers.
* Add L1 and/or L2 regularization.
* Try different hyperparameters
* Optionally, iterate on feature engineering: add new features, or remove features that don’t seem to be informative.
If it turns out that ''performance on the test set is significantly worse than the performance measured on the validation data, this may mean either that your validation procedure wasn’t reliable after all'', or that you began over fitting to the validation data while tuning the parameters of the model, switch to a more reliable evaluation protocol (such as iterated K-fold
validation).
* Theano is an open source project released under the BSD license and was developed by the LISA (now MILA1) group at the University of Montreal, Quebec, Canada (home of Yoshua Bengio).
* It is named after a Greek mathematician.
* At it’s heart ''Theano is a compiler for mathematical expressions in Python''.
* It takes your structures and turn them into very efficient code that uses NumPy, efficient native libraries like BLAS and native code to run as fast as possible on CPUs or GPUs.
* Theano was specifically designed to handle the types of computation required for large neural network algorithms used in [[Deep Learning]].
* Theono uses ''symbolic'' syntax
!!! Resources
* [ext[Theano Official Homepage |http://deeplearning.net/software/theano/]]
* [ext[Theano GitHub Repository|https://github.com/Theano/Theano/]]
* [ext[Theano: A CPU and GPU Math Compiler in Python (2010) | http://www.iro.umontreal.ca/~lisa/pointeurs/theano_scipy2010.pdf]]
* [ext[List of Libraries Built on Theano | https://github.com/Theano/Theano/wiki/Related-projects]]
* [ext[List of Theano configuration options | http://deeplearning.net/software/theano/library/config.html]]
The [[Vietnam]]ese Zen Buddhist monk who has been called the world's calmest man
A self-help book by [[Napoleon Hill]]
There are three scaling dimensions of a [[Convolutional Neural Network]]: depth, width, and resolution.
* ''Depth''- Depth simply means how deep the networks = ''number of layers''
* ''Width''- simply means how wide the network is. One measure is ''number of channels''
* ''Resolution'' - ''resolution of the image'' passed to a CNN
<img src="https://miro.medium.com/max/1400/1*xQCVt1tFWe7XNWVEmC6hGQ.png" width = "1000">
!! Depth Scaling (//d//)
Adding removing convolution layers
* Intuition - Deep [[Neural Network]] captures richer and more complex features and generalizes well on new tasks
* Problem - [[Vanishing Gradients]] problem as we go deep. [[ResNet-1000]] has same accuracy as [[ResNet-101]]
!! Width Scaling (//w//)
* ''Pros''
** Keeps model small
** Training is faster
** Captures more fine-grained features
* ''Cons''
** Accuracy saturates quickly
!! Resolution Scaling (//r//)
* Increasing resolution helps capture fine grained features
* Accuracy does not scale linearly with increasing resolution
<img src= "https://miro.medium.com/max/1400/1*yMCuuf5qzOVbYIJWmvW6Tg.png" width = "1000">
<small> Scaling Up a Baseline Model with Different Network Width (w), Depth (d), and Resolution (r) Coefficients. Bigger networks with larger width, depth, or resolution tend to achieve higher accuracy, but the accuracy gain quickly saturate after reaching 80%, demonstrating the limitation of single dimension scaling <small>
!! Ocean of Opportunity (Easiest)
Vast majority of companies in this category. Can Keep gobbling market share for next 10 years - comfortable compounding
* [[HDFC Bank]] - 6% of the banking loans outstanding4
* [[Asian Paints]] - 50% Market share in the paint industry by volume
* [[Relaxo Footwears]] - 5% of overall footwear market including informal market
* [[Titan]] - 5% market share in Jewelry Business
!! Market share high - Market grows in volume terms
Because a long way to go to become a middle income country
* [[Nestle]] - Market share 90% plus. Baby milk powder grows as 15% in volume terms
!! Monopoly saturated but an adjacency (Hardest)
* [[Pidilite]] - 2000s used adhesives cash flow to jump into waterproofing. Last 3 years they are jumping to become business 3 - (probably flooring)
<iframe width="560" height="315" src="https://www.youtube.com/embed/ai6-PBaVhRk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Time series data is the data collected at different points in time. Contrasting it with [[Cross-sectional data]] which collects data at a single point in time for different individuals
!!! Time Series Data
Time series data is a collection of quantities that are assembled over even intervals in time and ordered chronologically.
!! Time Series Graph
Visualizing time series for detecting behaviors like
* Mean-reverting or has explosive behavior
* Time-trend
* Seasonality
* Structural breaks
[[Matplotlib]]
```python
import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [-3,4,5,8]
plt.plot(x,y, c='red', linestyle='dashed')
plt.show()
```
[[Seaborn]]
```python
import pandas as pd
import seaborn as sns
data = pd.DataFrame({
'x':[1,2,3,4],
'y':[-3,4,5,8]
})
sns.lineplot(data=data, x='x', y='y')
```
[[Plotly]]
```python
import plotly.express as px
fig = px.line(data, x="x", y="y", title='Line Plot')
fig.show()
```
!!! 1. Mean Reverting
data over-time returns to invariant mean.
<img src='https://www.aptech.com/wp-content/uploads/2019/09/ts-pp-mean-reverting.jpg' width=300>
!!! 2. Time Trending
When time series has a deterministic component that is appropriate to time period.
<img src='https://www.aptech.com/wp-content/uploads/2019/09/ts-pp-trending-data.jpg' width=300>
!!! 3. Seasonality
Seasonality occurs when there is a predictable repeating pattern at interval that are smaller than an year.
<img src='https://www.aptech.com/wp-content/uploads/2019/09/ts-pp-seasonality.jpg' width=300>
!!! 4. Structural Breaks
Sudden change in behavior or non-linearities
<img src='https://www.aptech.com/wp-content/uploads/2019/02/gblog-ar1-level-sb.png' width=300>
!! Time Series Modelling
!!! A. Time-Domain Versus Frequency Domain Models
!!!! A1. Time-domain Approach
* Models future values as a function of past and present values
* Time Series Regression
* Used for [[Forecasting]]; popular in [[Econometrics]]
!!!! A2. Frequency Domain Approach
* Time series can be represented as a function of sine and cosine values rather than past and present values to model behavior of data
<table class="tableizer-table">
<thead>
<tr class="tableizer-firstrow">
<th>Time Domain Examples</th>
<th>Frequency Domain Examples</th>
</tr>
</thead>
<tbody>
<tr>
<td>[[Autoregressive Moving Average Models (ARMA)]]</td>
<td>[[Spectral analysis]]</td>
</tr>
<tr>
<td>[[Autoregressive Integrated Moving Average (ARIMA)]] Models</td>
<td>[[Band Spectrum Regression]]</td>
</tr>
<tr>
<td>[[Vector Autoregressive Models (VAR)]]</td>
<td>[[Fourier transform methods]]</td>
</tr>
<tr>
<td>[[Generalized autoregressive conditional heteroscedasticity (GARCH)]]</td>
<td>[[Spectral factorization]]</td>
</tr>
</tbody>
</table>
!!! B. Univariate Versus Multivariate Time Series Models
!!!! B1. Univariate Model
* Used when the dependent variable is a single time series
* For example, modelling individual's heart rate using only past observations
!!!! B2. Multivariate Model
* In addition to time series depending on their own past values, also depends on the values of other series
* For example, Country's GDP depends on inflation, growth, unemployment and other endogenous variables
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Univariate Model Examples</th><th>Multivariate Model Examples</th></tr></thead><tbody>
<tr><td>Univariate Generalized autoregressive conditional heteroscedasticity (GARCH)</td><td>Vector Autoregressive Models (VAR)</td></tr>
<tr><td>Seasonal Autoregressive Integrated Moving Average (SARIMA) Models</td><td>Vector Error Correction Model (VECM)</td></tr>
<tr><td>Univariate unit root tests</td><td>Multivariate unit root tests</td></tr>
</tbody></table>
!!! C. Linear Versus Nonlinear Time Series Models
Nonlinear time series analysis focuses on:
* Identifying the presence of structural breaks;
* Estimating the timing of structural breaks;
* Testing for unit roots in the presence of structural breaks;
* Modeling data behavior before, after, and between breaks.
!!!! Non-linear models
* [[Threshold autoregressive model]]
* [[Markov-switching model]]
!! [[Stationarity]]
''A time series is stationary when all statistical characteristics of that series are unchanged by shifts in time''. It means the time series change only depends on the lag by how the series changes over-time remains constant
* Strict Stationarity
* Weak Stationarity or covariance stationarity
** requires series to have finite unconditional mean and finite unconditional variance at all time periods
** autocovariances are independent of time
''Examples of Stationary Time Series Data''
* [[Gaussian White Noise]]
* [[Independent White Noise]]
''Non-stationary examples''
* [[Deterministically Trending Data]]
* [[Random Walk]]
!! [[Seasonality]]
!!! How to identify?
* background theory and knowledge
* seasonal subseries plot, the autocorrelation plot, or a spectral plot
* autocorrelation function, periodograms, or power spectrums can be used to identify the presence of seasonality
!! [[Structural Breaks]]
!! References
* [[Introduction to the Fundamentals of Time Series Data and Analysis|https://www.aptech.com/blog/introduction-to-the-fundamentals-of-time-series-data-and-analysis/]]
* Encoding time as cosine function instead of raw values
* Assume spend variable is available in time series
!! 1. Describing time series for N months
* [[Mean]]
* [[Median]]
* [[Standard Deviation]]/[[Mean]]
* Max, Min
* Sum
```python
df['spend_mean'] = df.spend.mean()
df['spend_median'] = df.spend.median()
df['spend_std_norm'] = df.spend.std()/df.spend.mean()
df['spend_max'] = df.spend.max()
df['spend_min'] = df.spend.min()
df['spend_sum'] = df.spend.sum()
```
!! 2. Lag Based
* get difference between lags to create change in value information
* Get mean, median, max, min, std of lag variables as well
```python
df['lag_diff'] = df['spend'].shift(1) - df['spend']
df['lag_diff2'] = df['spend'].shift(2) - df['spend']
```
Choosing lag based on [[Partial Autocorrelation]] - The partial autocorrelation tells you the correlation of a lag accounting for all of the previous lags
!! 3. Rolling window in last N months
* Average
* Sum
of spends in last N months
```python
df['spend_rolling3'] = df['spend'].rolling(window=3).mean()
df['spend_rolling6'] = df['spend'].rolling(window=6).mean()
```
* Can use weighted average to create recency weighted variables
!! 4. Expanding Window
* Unlike rolling window with a fixed window size, the expanding window increases window size by a lag
```python
df['spend_expanding_mean'] = df['spend'].expanding(2).mean()
```
!! Custom Features using above
* Sum, Mean, Median, Std/Mean, Max, Min - Spend in last 3M, 6M, 12M
* Mean, Max, Min - monthly lag is spend in last 3M, 6M, 12M
* Min/Max Monthly Spend / Total Spend in last 6M, 12M
* Range (Max-min) spend in last 6M, 12M
* Average Spend in last 3M/6M / Average spend in last 6M/12M
* Average spend in last 3M/6M - Average spend in last 3M/6M as of previous month
* Average spend in last 3M/6M ''-'' Average spend in last 6M/12M
* Average spend in last 3M/6M ''/'' Average spend in last 3M/6M as of previous month
* Average spend in last 3M/6M ''/'' Average spend in ''prior'' 3M/6M
!!!Using lag features to compute in last 6M, 12M
* Count of growth/decline phases
* sum of growth/decline
* count above/below mean
!! Embedding Interactions
* Sum, Average transactions in last 3M/6M/12M
* Total Spend/Total transactions in last 3M/6M/12M
* Total High ROC transactions/Total transactions in last 3M/6M/12M
* High ROC spend / Total Spend in last 3M/6M/12M
!! Neighbors based on ZIP, SIC,
*
!! Spend From Industry to Industry
* Matrix of Spend From Industry - to industry - can be dynamic based on last 6month spends or could be static
* industry weighted category spend
* Difference between current category spend - industry weighted category spend
* Industry growth in category spend vs current growth in category spend
* Spend of best customer in this industry
* Current spend relative to spend of best customer in this industry
!! Spend on products
* Average monthly spend/card in last 3M/6M/12M
* Recurring spend categories
!! Other Variables
* Preferred Card?
* Dominant Need
* Preferred channel
!! Validation
* Performance - Used in model to predict (post - pre), (post - baseline): variable importance/contribution, rank,
* Correlation with target, other variables
* Scored for last 12 months to assess volatility
! References
* [[tsfresh time series feature calculations |https://tsfresh.readthedocs.io/en/latest/text/list_of_features.html]]
,,[[Feature Engineering]] | [[30 July 2022]],,
[[Data Visualization Techniques]]
Tomek Links are pairs of instances, one from the majority class and one from the minority class, that are very close to each other in the feature space. They are used in the context of dealing with imbalanced datasets to help balance the class distribution. The key idea is to identify and remove those majority class instances that are near the minority class instances
```python
from imblearn.under_sampling import TomekLinks
def tomek_links (X,y) :
tl = TomekLinks(sampling_strategy='auto')
X_resampled, y_resampled = tl.fit_resample(X, y)
return X_resampled , y_resampled
X_resampled, y_resampled = tomek_links(X[xvars],y)
```
Tom's Obvious, minimal language
When the core belief is questioned we tend to shut down rather than open up, as if there is a miniature [[Dictator]] living in our minds controlling the flow of facts and it's job is to keep out threatening information
!! Introduction
<<<
The ''Tree-Based Pipeline Optimization Tool (TPOT)'' was one of the very first [[AutoML]] methods and open-source software packages developed for the data science community
<<< [[http://automl.info/tpot/]]
<<<
Consider TPOT your Data Science Assistant. TPOT is a [[Python]] Automated Machine Learning tool that optimizes [[Machine Learning]] pipelines using [[Genetic Programming]]
<<< [[TPOT Documentation|http://epistasislab.github.io/tpot/]]
!! Pipeline
:<img src= 'https://raw.githubusercontent.com/EpistasisLab/tpot/master/images/tpot-ml-pipeline.png' width=700>
!! References
* [[TPOT for Automated Machine Learning in Python|https://machinelearningmastery.com/tpot-for-automated-machine-learning-in-python/]] from [[Machine Learning Mastery]]
,,[[02 May 2021]],,
!!! Basics of Stock Market
# [ext[Varsity by Zerodha|https://zerodha.com/varsity/]]. Learn about Stocks, [[Futures]] & [[Options]]
# Understand [[Price Action]]
!!! Order of Understanding
# Read books on [[Price Action]]. What it is all about and why indicators fail?
# What is [[Money Management]]
# What is [[Trading Psychology]]
# Quant Topics
!!! Resources
# Telegram group FTU trading - for all the resources
!!! People to Follow
# Manu Bhatia
# Kirubakaran
# Madan Kumar
# Vihaan Singh - Knowledgeable in Quant
!! Information
* Stock Price data from [[TradingView]]
** [[OHLC]]
** Volume
** Indicators - [[MACD]], [[Bollinger Bands]] etc
** Structural Pivots - Atul
* Bulk deals from [[NSE]]
** Net buying or selling
** Algorithmic trades - small price changes
* News from [[MoneyControl]], [[Economic Times]], [[TradingView]]
** Sentiments
** Count/proportion of Keywords for Growth
** Count/proportion of Keywords for Decline
* US Stock market indices from [[TradingView]]
** OHLC
** Indicators
* Economic Indices from [[TradingView]]
** Monthly data
* Financial Information from [[Screener]]
** Revenue, Profit, ROCE
** Holding info
** QoQ, YoY Trajectories
* Tweets from [[Twitter]]
** sentiments of stock
** sentiments of market/economy
Trying to get data using [[Market Data Scrape Strategy]]
!! Methodology
!!! Long Term View
* Daily Data using information above
* ''Predict'': Stock price growth/decline over the next month/quarter
!!! Short term View
* 1 Minute Data
* Ensemble Model
** [[fbprophet]] time series model for change point detection
** [[XGBoost]]
** [[LSTM]]/[[Transformer Network]]
* ''Predict'': Stock price growth/decline over next day/week
!! Decision Points for Investing/Trading
* When to buy? - Both Short and Long Term View indicate growth > % threshold
* When to sell? - Both short and long term view indicates decline > y%
* Volume? - Based on Probability of growth
* Buy Price - Good signs of growth + Near support
* Sell Price - x% profit or 5% decline from the top
* Which Stock to Buy? - Rank Order stocks based on short and long term view
* Proportion of money to allocate? - [[Money Management]]
!! Other Ideas
* [[Reinforcement Learning]] model predictions
* [[04 Structural Pivots Method - Small Pivots]]
* [[fbprophet]]
* [[Classification Model]] to select to trade or not
!! Code
```python
import time
import json
import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup
import datetime
URL = 'https://in.tradingview.com/chart/NIFTYZ2020/BXw9RGS2-NIFTY-31DEC2020-1M/'
SAVE_CSV = 'datasets/NIFTYFUT_1M_20201231.csv'
SAVE_CHART = 'datasets/NIFTYFUT_1M_20201231.json'
def open_browser():
# Opens Chrome Browser
path_to_chromedriver = 'chromedriver.exe'
brow = webdriver.Chrome(executable_path = path_to_chromedriver)
return brow
def capture_prices(browser):
# Go to Amazon wishlist
browser.get(URL)
time.sleep(10)
content = browser.page_source
soup = BeautifulSoup(content)
json_string = soup.find(attrs={"class": "js-chart-view"})['data-options']
parsed_string = json.loads(json_string)
parsed_string = json.loads(parsed_string['content'])['panes']
with open(SAVE_CHART, 'w') as json_file:
json.dump(parsed_string, json_file)
df = pd.read_json(SAVE_CHART)
main_data = df['sources'][0][0]['bars']['data']
ohlc = pd.DataFrame()
for r in main_data:
ohlc = ohlc.append(pd.DataFrame({
'Index': [r['index']],
'Datetime': [r['value'][0]],
'Open': [r['value'][1]],
'High': [r['value'][2]],
'Low': [r['value'][3]],
'Close': [r['value'][4]],
'Volume': [r['value'][5]],
}))
ohlc['Datetime_formatted'] = pd.to_datetime(ohlc.Datetime, unit='s') + datetime.timedelta(hours=5.5)
ohlc.to_csv(SAVE_CSV, index = False)
browser = open_browser()
capture_prices(browser)
browser.close()
```
!! References
* [ext[Github Repo|https://github.com/jchao01/TradingView-data-scraper]]
* [ext[December Futures NIFTY 50 - Trading View|https://www.tradingview.com/chart/NIFTYZ2020/HJr6CaWq-Nifty-Dec-2020-Futures-Pos-Pivots1/]]
* [[How I webscraped 1 minute stock data from tradingview|https://medium.com/@rushic24/how-i-webscraped-1-minute-stock-data-from-tradingview-5bc9b4a823a9]]
TMS discharges a strong magnetic pulse and excites the area of the brain underneath and induces a small electric current temporarily disrupting the local brain activity.
According to [[Machine Learning Mastery]], ''Transfer learning'' generally refers to a process where a model trained on one problem is used in some way on a second related problem.
In [[Deep Learning]], transfer learning is a technique whereby a neural network model is first trained on a problem similar to the problem that is being solved. One or more layers from the trained model are then used in a new model trained on the problem of interest.
!! Benefits
* Faster Training
* Better Generalization
!! Transfer Learning for Image Recognition
* [ext[ImageNet Large Scale Visual Recognition Challenge|http://www.image-net.org/challenges/LSVRC/]] or ImageNet
* [[VGG16]]
!! Computing Transition Probabilities using [[Python]]
```python
def transition_matrix(transitions):
n = 1+ max(transitions) #number of states
M = [[0]*n for _ in range(n)]
for (i,j) in zip(transitions,transitions[1:]):
M[i][j] += 1
#now convert to probabilities:
for row in M:
s = sum(row)
if s > 0:
row[:] = [f/s for f in row]
return M
import pandas as pd
m = transition_matrix(t)
for row in m: print(' '.join('{0:.2f}'.format(x) for x in row))
df = round(pd.DataFrame(m),3)
df
```
!! Reference
* [[Stackoverflow]] reference [[link|https://stackoverflow.com/questions/46657221/generating-markov-transition-matrix-in-python/46657489]]
A trolley is barelling down a train track out of control. Four workers are making repairs on one track. A bystander, you quickly realize that all will be killed by the runaway trolley. Then you notice there is a level nearby to divert that trolley. But there is one worker on the other track. If you pull the lever, only one will be killed, but if you don't, four will be killed. Do you pull the lever?
<img src = 'https://www.relativelyinteresting.com/wp-content/uploads/2019/02/trolley-problem.jpg' width = 400>
//Tsundoku// is a Japanese word for acquiring reading materials but letting them pile up in one's home without reading them.
Tuesdays with Morrie is a book by [[Mitch Albom]] about discussions on life that happened every Tuesday with his Sociology Professor, who contracted ALS. After meeting with his professor 16 years later post his graduation, they happened to do one more thesis on life before his professor departs to heavenly abode.
Every Tuesday he met with his professor to talk about one topic related to life and below is the week by week account of lessons that his professor shared
1. Choose a GBM algorithm and build a baseline model
```python
model = lgb.LGBMClassifier(random_state=42)
```
2. Perform cross validation with early stopping
```python
hyperparameters = model.get_params()
cv_results = lgb.cv(hyperparameters, train_set,
num_boost_round = 10000,
nfold = N_FOLDS,
metrics = 'auc',
early_stopping_rounds = 100,
verbose_eval = False,
seed = 42)
best = cv_results['auc-mean'][-1]
```
3. Evaluate the baseline model on testing data
```python
model.n_estimators = len(cv_results['auc-mean'])
model.fit(train_features, train_labels)
preds = model.predict_proba(test_features)[:, 1]
baseline_auc = roc_auc_score(test_labels, preds)
```
4. [[Grid Search]], [[Random Search]] or do Bayesian Optimization to select best [[Hyperparameter]]
[[Hyperparameter Tuning]] with [[Optuna]] for [[XGBoost]] with [[GPU]] support
```python
SPLITS = 3
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=SPLITS)
folds = []
for i, (train_index, test_index) in enumerate(skf.split(X[xvars], y)):
print(f"Fold {i}:")
devx, devy = X.loc[train_index, xvars], y.loc[train_index]
oosx, oosy = X.loc[test_index, xvars], y.loc[test_index]
folds.append([devx, devy, oosx, oosy])
len(folds), len(folds[1])
from sklearn.metrics import roc_auc_score, accuracy_score
import optuna
from xgboost import XGBClassifier
def tuner(trial):
params = {
"n_estimators": 2500,
"max_depth":trial.suggest_int("max_depth", 4, 10),
"min_child_weight": trial.suggest_int("min_child_weight", 10, 500, step=10),
"learning_rate": trial.suggest_float("learning_rate", 0.01, 0.2, log=True),
"subsample": trial.suggest_float("subsample", 0.2, 1.0, step=0.05),
"colsample_bytree": trial.suggest_float("colsample_bytree", 0.1, 1.0, step=0.05),
"reg_alpha": trial.suggest_float("reg_alpha", 1e-2, 10., log=True),
"reg_lambda": trial.suggest_float("reg_lambda", 1e-2, 10., log=True),
}
model = XGBClassifier(
**params,
n_jobs=-1,
tree_method='gpu_hist',
gpu_id=0,
eval_metric='auc'
)
roc = 0
for data in folds:
x_train, y_train, x_test,y_test = data
model.fit(
x_train,
y_train,
early_stopping_rounds=25,
eval_set=[(x_test,y_test)],
verbose=0)
print(model.best_ntree_limit)
y_hat = model.predict(x_test, iteration_range = (0,model.best_ntree_limit))
# y_hat = model.predict(x_test, iteration_range = (0,model.best_ntree_limit))
roc += roc_auc_score(y_test, y_hat)/SPLITS
return roc*-1
start_time=timer(None)
study = optuna.create_study()
study.optimize(tuner, n_trials=50)
timer(start_time)
```
!! Reference
[[https://www.kaggle.com/code/saileshnair/tuning-xgboost-with-optuna-using-gpu]]
!! Inutition
* Input Image - compress info - spatial info is lost
* [[Bottleneck Layer]]
* [[Transpose Convolution]] to build over high level contextual info
* Texture information form [[Skip Connection]]s
!! Architecture
In the output map $$(h \times w \times n_{class})$$ is the probability value for each class. An argmax over each class is taken to arrive at the final class and used to create [[Segmentation Map]]
<img src='https://www.researchgate.net/profile/Alan-Jackson-2/publication/323597886/figure/fig2/AS:601386504957959@1520393124691/Convolutional-neural-network-CNN-architecture-based-on-UNET-Ronneberger-et-al.png'>
* Surfactants Business - [[Petrochemical]] based - goes in detergents
* Only manufacturer of surfactants in South India - mostly concentrated in west india - near the coast - advantageous location to companies in south India
* Relationship with Tier 2 manufacturers strong
* [[Ultramarine]] Blue - blue pigment - in detergents - new use case - prevents warping of plastic - top 3 makers in the Globe - no competition in India
* Manufactured out of China clay and sulfur - not easy to manufacture - cannot get exposed to oxygen
* 60-65% yield Ultramarine - other players have 10-15%
* export markets > 50% revenue
* ROCE > 40%
* Huge margins in ultramarine
Understudy is the role in theatre of a senior actor to take over that role
3 February 2022
1. Against Epiphanies
There’s a popular story about Netflix that says the idea came to Reed after he’d rung up a $40 late fee on Apollo 13 at Blockbuster. He thought, What if there were no late fees? And BOOM! The idea for Netflix was born. That story
3 February 2022
1. Against Epiphanies
but the idea for Netflix had nothing to do with late fees—in fact, at the beginning, we even charged them. More importantly, the idea for Netflix didn’t appear in a moment of divine inspiration—it didn’t come to us in a flash, perfect and useful and obviously right. Epiphanies are rare. And when they appear in origin stories, they’re often oversimplified or just plain false. We like these tales because they align with a romantic idea about inspiration and genius
3 February 2022
1. Against Epiphanies
Origin stories often hinge on epiphanies. The stories told to skeptical investors, wary board members, inquisitive reporters, and—eventually—the public usually highlight a specific moment: the moment it all became clear. Brian Chesky and Joe Gebbia can’t afford their San Francisco rent, then realize that they can blow up an air mattress and charge people to sleep on it—that’s Airbnb. Travis Kalanick spends $800 on a private driver on New Year’s Eve and thinks there has to be a cheaper way—that’s Uber.
3 February 2022
1. Against Epiphanies
The truth is that for every good idea, there are a thousand bad ones. And sometimes it can be hard to tell the difference
3 February 2022
1. Against Epiphanies
One of my goals in telling this story is to puncture some of the myths that attach themselves to narratives like ours. But it’s equally important to me to show how and why some of the things we did at the beginning—often unwittingly—worked
3 February 2022
1. Against Epiphanies
Truths like: Distrust epiphanies.
3 February 2022
1. Against Epiphanies
The best ideas rarely come on a mountaintop in a flash of lightning. They don’t even come to you on the side of a mountain, when you’re stuck in traffic behind a sand truck. They make themselves apparent more slowly, gradually, over weeks and months. And in fact, when you finally have one, you might not realize it for a long time.
3 February 2022
2. “That Will Never Work”
It’s a little more complicated than that. Freud was in fact my father’s great-uncle, making him my great-grand-uncle. Still, no matter how convoluted the chain of connection, my parents were proud of the family association with Freud
3 February 2022
2. “That Will Never Work”
Bernays is, in many ways, the father of modern public relations, the person who really figured out how to apply new discoveries in psychology and psychoanalysis to marketing
3 February 2022
2. “That Will Never Work”
Thomas Edison (and not Joseph Swan) as the inventor of the lightbulb. He’s the guy who, after helping popularize bananas for United Fruit
3 February 2022
2. “That Will Never Work”
As rewarding as those jobs were, part of me had always wondered what it would be like to build a company from the ground up, completely solo—if it would be more fulfilling if the problems I solved were my problems
3 February 2022
2. “That Will Never Work”
I kept a little notebook of ideas in my backpack and carried it with me everywhere I went: driving, mountain biking, you name it. It fit into the pocket of hiking shorts really nicely
3 February 2022
2. “That Will Never Work”
There’s a reason why rejected idea #114 is “personalized surfboards, machine-shaped to your exact size, weight, strength, and surfing style.
3 February 2022
3. Please, Mr. Postman
This is called valuation. You come up with a number: What your idea is worth. In common parlance, it’s typically a good thing when someone says, Hey, there’s a million-dollar idea! But in Silicon Valley, that’s not very much.
3 February 2022
3. Please, Mr. Postman
Prior to 1997, DVDs were only available in Japan. And even if you found one, there was no way to play it—no DVD players were for sale in the States
3 February 2022
3. Please, Mr. Postman
Cheaper inventory, cheaper shipping—it was looking like movies by mail could work, if (and this was a big if) DVD became a popular format. With other huge categories—books, music, pet food—slowly being taken online, the movie rental category (which brought in $8 billion a year!) was a tempting target. Betting on DVDs was a risk, but it might also be our way to finally crack that category
3 February 2022
3. Please, Mr. Postman
By mid-1997, there were still only about 125 titles to choose from. There were tens of thousands of movies on VHS.
3 February 2022
3. Please, Mr. Postman
When you start a company, what you’re really doing is getting other people to latch on to an idea. You have to convince your future employees, investors, business partners, and board members that your idea is worth spending money, reputation, and time on. Nowadays, you do that by validating your product ahead of time. You build a website or a prototype, you create the product, you measure traffic or early sales—all so that when you go to potential investors, palm outstretched, you have numbers to prove that what you’re trying to do isn’t just a good idea, but already exists and works.
3 February 2022
3. Please, Mr. Postman
Squarespace, set up a credit account on Stripe, bought some banner ads using AdSense, and set up some cloud-based analytics on Optimizely to measure the results. All within a single weekend.
3 February 2022
3. Please, Mr. Postman
To wit: Netflix is currently worth around $150 billion. Back in 1997, though, Reed and I decided that the intellectual property—the idea for DVD by mail, plus the fact that he and I were the ones working on it—was worth $3 million
3 February 2022
3. Please, Mr. Postman
But by not putting any money in at the outset, I’d effectively changed my ownership percentage. To
3 February 2022
3. Please, Mr. Postman
but I’d much rather own 30 percent of a company that has money to pursue its goals than 50 percent of a company with no cash on hand
3 February 2022
3. Please, Mr. Postman
Eric Meyer, a muppetlike Frenchman with a frenetic manner who would eventually become our chief technology officer. Eric had worked with Reed earlier in his career but now held a senior position at KPMG
3 February 2022
3. Please, Mr. Postman
By the mid-nineties, things had changed. Jeff Bezos’s success at Amazon had shown us that it wasn’t just more powerful hardware or more innovative software that would lead to future progress—it was the internet itself. You could leverage it to sell things. It was the future.
3 February 2022
3. Please, Mr. Postman
The internet was not predictable. Its innovations were not centralized on a corporate campus. It was a whole new world
4 February 2022
4. Getting the Band Together
I’d realized by then that telling people about my idea was a good thing. The more people I told my idea to, the more I received good feedback, and the more I learned about previous failed efforts. Telling people helped me refine the idea—and it usually made people want to join the party.
4 February 2022
4. Getting the Band Together
what I want in a negotiation, is to sigh and display my weary sadness, to make the other party feel like a child who has disappointed his parents. You know the drill: I’m not mad, I’m just disappointed
4 February 2022
4. Getting the Band Together
already decided that no one would get a VP title—at least at first. Instead, they would all be directors, and their titles would reflect what they actually did, not what they wanted to do
4 February 2022
4. Getting the Band Together
I’m usually wary of title inflation—although it’s something that seems like it costs you nothing to give, it actually is far more expensive than it seems, since it causes a cascading series of overpromotions
4 February 2022
4. Getting the Band Together
booth, essentially trying to figure out how the video store business worked. Who were the major players? Who made money? And how? My strategy was to play
4 February 2022
4. Getting the Band Together
the rube—to Columbo my way to an understanding.
4 February 2022
4. Getting the Band Together
pipe-and-drape” section—so called because each booth is separated from the next by a waist-high framework of metal pipes, draped with curtains to hide the ugliness
4 February 2022
4. Getting the Band Together
Mitch was a walking, talking IMDb. He watched movies all day at the store, then went home and watched a movie while he was eating dinner, then stayed up late watching even more movies.
7 March 2022
4. Getting the Band Together
Founder’s Fifteen.” I
7 March 2022
5. Show Me the Money
Other People’s Money. When entrepreneurs implore you to remember OPM, what they’re saying is: When it comes to financing your dream, use only other people’s money
7 March 2022
5. Show Me the Money
I got gradually better at asking. I learned to keep it short. To make eye contact. To slump, but not too much. To use a voice loud enough to be heard, but not loud enough to seem demanding or scary. But the breakthrough for me was simply telling people the truth. “Can you spare some change? I’m really hungry.” There was something about speaking from the heart that cut right through. It got people’s attention and broke down their cynicism and defenses
7 March 2022
5. Show Me the Money
That’s another benefit of using OPM: before you pour your life into starting a company, it’s not a bad idea to get just a little bit of reassurance that you’re not completely out of your mind
7 March 2022
5. Show Me the Money
The “seed” in seed funding usually refers to the business, newly planted and hoping to grow. But it also refers to investors, who are getting in on the ground floor
7 March 2022
5. Show Me the Money
But the real objective was to put the kids in situations that seemed impossible, and prove to them, over and over, that they were capable of much more than they imagined.
7 March 2022
5. Show Me the Money
I looked to bottled water as one of the great triumphs of salesmanship: marketing in its purest form. Give me your money, and I’ll give you…water. Something that is almost free, and that is available almost everywhere. Something that covers 75 percent of the earth’s surface
7 March 2022
5. Show Me the Money
Nine times out of ten, they’re not quiet because they’re politely listening—they’re quiet because they’re totally uninterested. Or worse: they’re thinking your arguments are so weak and pathetic that they don’t even warrant an argument.
7 March 2022
5. Show Me the Money
DVDs were a middle step between analog VHS tapes and downloads or streaming
7 March 2022
5. Show Me the Money
But he had the timeline all wrong. What he didn’t understand was Hollywood. We knew that the studios were betting big on the DVD format and, more importantly, were betting on DVD ownership. They didn’t want a repeat of the eighties, when video stores had established themselves as middlemen to consumers, renting the same video out dozens of times. Movie studios didn’t want to have to jack up the prices of movies just to earn their share of the home viewing market; they wanted to get their films directly into consumers’ homes, and DVD—a new technology that they could price competitively—represented an opportunity to hit the Reset button.
7 March 2022
5. Show Me the Money
we had a business model that worked in a DVD world. We could afford to wait. Every piece of brand equity that we were building—all those customer relationships, all of our movie-matching expertise—would still be relevant and useful when the world shifted
7 March 2022
5. Show Me the Money
In Silicon Valley, no one ever really tells you no. After a pitch, you’ll typically hear a sentence that begins with “This is great, but…
7 March 2022
5. Show Me the Money
For one thing, all boards need at least a third person to break ties.
9 May 2022
6. How It Feels to Deposit a Check for Almost $2 Million
If you want it, don’t try for a bargain and risk losing it,” she told me. “The anxiety of paying that much won’t last. But the enjoyment of living there will last forever. Go all in.”
9 May 2022
6. How It Feels to Deposit a Check for Almost $2 Million
buyer’s remorse?
9 May 2022
6. How It Feels to Deposit a Check for Almost $2 Million
but in the boom-bust cycle of Silicon Valley economics, I’ve always believed that you should spend the money you’re given. Spend it wisely, but spend it.
9 May 2022
6. How It Feels to Deposit a Check for Almost $2 Million
He wouldn’t announce himself as a Netflix employee. Posing as a home theater enthusiast or cinephile, he would join the conversation in communities geared to DVD fanatics and movie buffs, befriend the major players, and slowly, over time, alert the
9 May 2022
6. How It Feels to Deposit a Check for Almost $2 Million
most respected commenters, moderators, and website owners about this great new site called Netflix
9 May 2022
6. How It Feels to Deposit a Check for Almost $2 Million
But there was real pleasure in it: in the planning, in the problems, in the puzzles we had to solve. I had so many tasks set in front of me, so many little pieces I had to prep and build, that there wasn’t much time for anxiety about the future
9 May 2022
7. We Were Almost CinemaCenter
It arose organically, through a shared set of values among a team of people who had been through their fair share of offices—startups, major corporations, and everywhere in between. Netflix, for all of us, was an opportunity to work at the kind of place we’d always dreamed about. It was a chance to do things truly our way. Culture isn’t what you say. It’s what you do
9 May 2022
7. We Were Almost CinemaCenter
That was really all our culture amounted to. Handpick a dozen brilliant, creative people, give them a set of delicious problems to solve, then give them space to solve them. Netflix would eventually codify this as Freedom and Responsibility. But that was years later. At the time, it was just how we did things. We didn’t have set hours for work. You could come in when you wanted, leave when you wanted. You were being judged by what you could accomplish. As long as you were solving problems and getting things done, I didn’t care where you were, how hard you worked, or how long you stayed.
9 May 2022
7. We Were Almost CinemaCenter
What I learned, in those early months at pre-launch Netflix, was that working at a startup is like going on a backcountry trip where there are no trails. Say you were on such a trip, and knew that your next campsite was eight miles ahead, on the other side of a steep ridge. Say you had a specialized team—a couple of people carrying pack rafts, a couple more people with all the food and equipment, as well as some incredibly quick trail runners with light packs who could act as scouts. One possible route goes straight up and over the ridge to the campsite; one is less arduous but longer, and involves several water crossings; and one is a measured, stately hike up a series of gradual switchbacks. Which do you choose for the group? The answer is none of them. If there’s no one trail, why are you trying to force everyone to go the same way? The scouts with no packs should take the steep route, get there quickly, and scope out the best place to camp, with good access to water, flat spots for the tents, and good protection from the elements. The guys[…]
9 May 2022
7. We Were Almost CinemaCenter
bitching about the company. That’s right: sitting in the company hot tub, complaining about their situation. What’s wrong with this picture? It was a funny moment, but as Patty and I headed back to work, we couldn’t help but wonder: If we were supplying our employees with fine dining, a fitness center, and an Olympic-size pool and they were still complaining, what are the factors that really drive employee satisfaction? Or more importantly, what does it take to get other people to sign on to help you with your dream—and be happy doing it? What we found was surprising. And surprisingly simple. People want to be treated like adults. They want to have a mission they believe in, a problem to solve, and space to solve it. They want to be surrounded by other adults whose abilities they respect.
9 May 2022
7. We Were Almost CinemaCenter
Mitch Lowe was invaluable. He knew how to deal with distributors, even the small, elusive ones. He knew how to make them call us back. He was charming, persistent, and happy to call in the many favors he’d earned after his years as VSDA chairman. One of the most valuable skills he had was knowing exactly how many copies to buy. In those early days, there was no algorithm, no equation—just Mitch
9 May 2022
7. We Were Almost CinemaCenter
Amazon was originally called Cadabra. Twitter started off as Status. You have to allow for serendipity, for the right name to come along as you develop your service
9 May 2022
7. We Were Almost CinemaCenter
Picking a name is incredibly difficult. For one thing, you need something catchy, something that rolls off the tongue and is easy to remember. One- or two-syllable words are best—and ideally, the emphasis be should on the first syllable. Think of the most popular website names: Goo-gle. Face-book. These names open with a bang. Too many syllables, too many letters, and you run the risk of people misspelling your website. Too few letters, and you risk them forgetting the name.
9 May 2022
7. We Were Almost CinemaCenter
All of us—and I mean all of us—initially shied away from Netflix.com. Sure, it was two syllables. And sure, it satisfied both criteria, movies and internet. But there was a lot of worry in the office about the connotations of “flix.” “It just makes me think of porno,” Jim said at our meeting. “Skin flicks.” “Plus, that x,” Christina added. “We’ve got to settle on something,” said Te. She’d been almost tearing her hair out. We were just a few months from launch, and she still had to design a logo. “We’ve got to just decide.” So we did. There was no vote, no momentous ballot-casting. We printed out that spreadsheet and stared at it. Everyone went home to sleep on it. The next day, we all agreed: we were NetFlix.com. It wasn’t perfect. It sounded a little porn-y. But it was the best we could
9 May 2022
7. We Were Almost CinemaCenter
Netflix’s culture is famous. There’s a much-downloaded PowerPoint presentation given to all new employees.
9 May 2022
7. We Were Almost CinemaCenter
We call it being loosely coupled but tightly aligned.
9 May 2022
7. We Were Almost CinemaCenter
What they really want is freedom and responsibility. They want to be loosely coupled but tightly aligned.
9 May 2022
7. We Were Almost CinemaCenter
called this managed dissatisfaction. What do you do when a customer comes into the store looking for a copy of Die Hard 2, but all of the copies are checked out? You try to rent them something else that they might like just as much. You try to make them happy
9 May 2022
7. We Were Almost CinemaCenter
Michael Erlewine is, according to his current Wikipedia page, “an American musician, astrologer, photographer, TV host…and Internet entrepreneur” who founded, in 1991, the All Music Guide (now known as AllMusic). Back in 1998, all I knew was the last part. I’d come across All Music Guide’s sister site, All Movie Guide, when I was looking for possible data sources.
9 May 2022
7. We Were Almost CinemaCenter
The goal of All Movie was to compile a detailed catalogue of every film ever made
9 May 2022
7. We Were Almost CinemaCenter
Nowadays, they call that “self-care.” Back then, we just called it common sense. If we were going to try to fundamentally change an entire industry, we needed to have our wits about us.
9 May 2022
7. We Were Almost CinemaCenter
Our beta name was Kibble. As in dog food
9 May 2022
7. We Were Almost CinemaCenter
Six months in,” he said, “and you’ll be so fried that you’ll want to just say, ‘Screw it, let’s keep the beta name.’ Your sense of what’s good and what’s bad will be almost entirely depleted. But if you pick something so awful that it’s obviously impossible—WeWantToRipYouOff.com, GiveUsAllYourMoney.net—you’ll be forced to come up with something new.”
9 May 2022
7. We Were Almost CinemaCenter
Kibble had been my idea. It came from an old advertising and marketing adage: It doesn’t make a difference how good the ads are if the dogs don’t eat the dog food
10 May 2022
8. Ready for Launch
Cabernet (for me) and Chardonnay (for Lorraine)
10 May 2022
8. Ready for Launch
There are a great many stages in the life cycle of a startup. But a tectonic shift happens on launch day. Before you go live, you’re in the dreamy zone of planning and forecasts: your efforts are provisional. You’re making predictions about what can go wrong and what can go right. It’s a very creative, heady sort of work. It is essentially optimistic.
10 May 2022
8. Ready for Launch
The day your site launches, something shifts. Your work now is no longer predictive and anticipatory: it’s fundamentally reactive. Those problems you anticipated? You didn’t know the half of it. Your planned solutions? They’re a drop in the bucket. And there are hundreds—thousands—of issues that you could have never even imagined, and now have to deal with.
10 May 2022
9. A Day in the Post-Launch Life
Customers pay $25 for a DVD but only $4 for a rental. We make six times as much selling a DVD as we do renting it once. Of course, you can only sell a DVD one time. You can rent it hundreds of times. The problem is, no one is renting from us. And when we are able to convince someone to rent
10 May 2022
9. A Day in the Post-Launch Life
They called it the DVD Video Group. The 1998 CES conference was one of the first public appearances by the DVD Video Group
18 June 2022
9. A Day in the Post-Launch Life
Most engineers can choose where they want to work, and the way they make their decision boils down to two questions: 1) Do I respect the people I’m working for? 2) Will I be given interesting problems to solve?
10 May 2022
9. A Day in the Post-Launch Life
Every customer. Every order. Every shipment of a DVD. Our data warehouse knows where every customer lives, how and when they joined, how many times they’ve rented from us, and how long, on average, they keep their discs. It knows exactly what time someone visited the site, where they came from, and what they did once they got there. It knows which movies they looked at and which ones they chose to put in their cart. It knows whether they completed checkout—and if they didn’t, it knows where they gave up. It knows who was visiting us for the first time and who is a repeat customer.
18 June 2022
9. A Day in the Post-Launch Life
But the reality is that you can’t really do it on your own. You need to enlist help. Bring others around to your way of thinking. Let them share in your enthusiasm. Give them the magic glasses that will let them see your vision of the future.
18 June 2022
9. A Day in the Post-Launch Life
When you get down to it, selling DVDs is a commodities business
18 June 2022
9. A Day in the Post-Launch Life
DVD rental, on the other hand, has real potential. It’s hard to find places to rent DVDs in person, much less online
18 June 2022
9. A Day in the Post-Launch Life
general rule of web design is that if you have to explain something, you’ve already lost
18 June 2022
9. A Day in the Post-Launch Life
Should we focus on selling DVDs, which is bringing in 99 percent of our revenue, but will slowly—inevitably—evaporate as competitors crowd the field? Or should we throw our limited resources behind renting DVDs—which, if we can make it work, could be a hugely profitable business
18 June 2022
9. A Day in the Post-Launch Life
The second your dream becomes a reality, things get complicated. You simply can’t know how things are going to behave until you’ve actually tried them. Go ahead and write up a plan, but don’t put too much faith in it. The only real way to find something out is to do it.
18 June 2022
10. Halcyon Days
We could hear Jeff Bezos before we saw him. He-huh-huh-huh-huh. Jeff has a…distinctive laugh
18 June 2022
10. Halcyon Days
But Bezos inspired loyalty. He’s one of those geniuses—like Steve Jobs, or like Reed—whose peculiarities only add to his legend
18 June 2022
10. Halcyon Days
He didn’t look back—or, as he put it, he “evaluated opportunities using a regret minimization framework
18 June 2022
10. Halcyon Days
Doing rental and sales is confusing for our customers and unnecessarily complex for ops. And if we don’t sell, Amazon will destroy us when they enter the field. I think we get out now. Focus on rental
18 June 2022
10. Halcyon Days
When an opportunity comes knocking, you don’t necessarily have to open your door. But you owe it to yourself to at least look through the keyhole. That’s what we’d done with Amazon.
18 June 2022
10. Halcyon Days
The key to these pitches is to read the room, sense what they want to hear, and then give that to them—without lying, obfuscating, or distorting the truth. In a pitch, perfection isn’t always the goal: projection is. You don’t have to have all the answers if
18 June 2022
10. Halcyon Days
you appear to be the sort of person to whom they’ll eventually come
18 June 2022
10. Halcyon Days
The ancient Greeks had a term for this: halcyon days. I won’t bore you too much with the mythology, but essentially, they referred to the seven days each year when the winds were calm and Alcyone, a kingfisher, could lay her eggs
19 June 2022
11. Two Cents for Bill Clinton
We sent out a letter to every one of the nearly 5,000 people who had put in their two cents. We explained what had happened, and we apologized for the confusion and any possible offense. And if they had received the porn version, we asked that they return it to us, at our expense, after which we would gladly send them out the proper DVD. But you know? Funny thing. Not a single person did.
18 June 2022
11. Two Cents for Bill Clinton
But one of the things I was learning, that first year, was that success creates problems. Growth is great—but with growth comes an entirely new set of complications. How can you preserve your identity even as you include new members on your team? How do you balance continued expansion with coherent identity? How do you ensure that you continue to take risks, now that you have something to lose?
19 June 2022
11. Two Cents for Bill Clinton
Te would ask each new hire what his or her favorite film was. Then, the day before our monthly company-wide meeting, she’d instruct the person to come to work the next day dressed as a character from that film
19 June 2022
11. Two Cents for Bill Clinton
Small, semi-improvised rituals like this kept things light
19 June 2022
12. “I’m Losing Faith in You”
So he’d engineered a soft exit: Once Amazon moved into DVD, we’d push our users who wanted to buy DVDs there. They could rent through
19 June 2022
12. “I’m Losing Faith in You”
us, and buy through Amazon, via a link. In exchange, Amazon would direct traffic our way
19 June 2022
12. “I’m Losing Faith in You”
There’s a speaking tactic in business, useful for breaking bad news. It’s called a shit sandwich. You open up with a string of compliments, praise for work well done. That’s your first piece of bread. Once that’s done, you pile on the shit: the bad news, the less than glowing report, the things your audience doesn’t particularly enjoy hearing. You close with more bread: a blueprint for moving forward, a plan for dealing with all the shit.
19 June 2022
12. “I’m Losing Faith in You”
When your dream becomes a reality, it doesn’t just belong to you. It belongs to the people who helped you—your family, your friends, your co-workers. It belongs to the world.
19 June 2022
12. “I’m Losing Faith in You”
Paradoxically, if I hadn’t relinquished the title of CEO to Reed in 1999, I wouldn’t be writing this book.
25 June 2022
13. Over the Hill
it. All I remember is that the male employees of Netflix played it constantly. The rules were simple: You put a coin in the bottom of the urinal. The next person to use the facilities would see it and either ignore it, or reach into the bowl and take it. It was a sort of sociological experiment: How much money would it take for someone to do something disgusting and unsanitary, and reach into the bowl? The game only worked, of course, if not everyone knew they were playing. But whoever seeded the urinal would usually tip me off. We learned a
25 June 2022
13. Over the Hill
lot of interesting things about human nature, playing that game. For instance: a quarter would disappear much more quickly than three dimes. No one would touch paper money, unless the denomination was over five dollars. The highest cash value ever achieved was when someone threw in a twenty-dollar bill. It languished in the urinal all day, and was still there when I left at six for dinner with my family. But when I came back to the office later, at eight or nine, it was gone. I still have my suspicions.
25 June 2022
13. Over the Hill
Society for the Preservation and Encouragement of Barber Shop Quartet Singing in America. SPEBSQSA
25 June 2022
13. Over the Hill
If you hired the right people—smart, capable, trustworthy—they’ll figure out what needs to be done, and they’ll go ahead and do it. They’ll solve problems on their own before you even know the problems exist.
25 June 2022
13. Over the Hill
Radical honesty. Freedom and Responsibility. These are phenomenal ideals, but for our first couple of years, they weren’t really written down. We approached things on an ad hoc basis.
25 June 2022
13. Over the Hill
Most companies end up building a system to protect themselves from people who lack judgment. And that only ends up frustrating the people who have it
25 June 2022
13. Over the Hill
you need to take a day off, just take it. I don’t need to know about your root canal, or your kid’s school schedule. Just get your work done, and cover for yourself when you’re gone
25 June 2022
13. Over the Hill
Case in point: a little game we called Coins in the Fountain
25 June 2022
13. Over the Hill
détente
25 June 2022
13. Over the Hill
But once you’ve gone from 0 to 1, and the seed you’ve planted is starting to grow, some shuffling happens. Often the person who was right for the job at the beginning is not right for the middle. Sometimes bringing in people with decades of experience and institutional know-how is the necessary thing to do.
25 June 2022
13. Over the Hill
Overplanning and overdesigning is often just overthinking—or just plain old procrastination. When it comes to ideas, it’s more efficient to test ten bad ones than spend days trying to come up with something perfect.
25 June 2022
14. Nobody Knows Anything
William Goldman is most famous for writing three words: Nobody. Knows. Anything
3 July 2022
14. Nobody Knows Anything
Canada Principle. Netflix, for its first twelve years, limited its services to the United States
3 July 2022
14. Nobody Knows Anything
When we ran the numbers, we saw that we could probably get an instant revenue bump of about 10 percent. But we didn’t do it. Why? Two reasons.
25 June 2022
14. Nobody Knows Anything
It’s because Nobody Knows Anything. And it’s not just in Hollywood. It’s true in Silicon Valley, too.
25 June 2022
14. Nobody Knows Anything
I’ve always disagreed. There are bad ideas. But you don’t know an idea is bad until you’ve tried it.
25 June 2022
14. Nobody Knows Anything
Other people call that luck. I call it nobody knowing anything.
3 July 2022
14. Nobody Knows Anything
negative option”—that is, not even ask. Instead, we would automatically roll customers into their next month of membership—and bill their credit card—unless they proactively canceled. You see this all the time now—Amazon Prime and virtually every subscription plan does it. But at the time it seemed like an overly aggressive money grab—verging on sleazy. Reed hated it.
3 July 2022
14. Nobody Knows Anything
it was inevitably going to be more complicated than it looked. Because French is the main language spoken in some parts of Canada, we would have translation headaches. Canadians use a different currency, which would have complicated our pricing—and the fact that Canada also calls that currency a “dollar” threatened to be a communications nightmare. Postage was different, too, so we would have had to use different envelopes. In other words, even something seemingly simple was bound to be a pain in the ass.
3 July 2022
14. Nobody Knows Anything
Focus. It’s an entrepreneur’s secret weapon
3 July 2022
14. Nobody Knows Anything
He’d also figured out that it was much cheaper—and more efficient—to ship all DVDs separately and as they became available, even if a user had ordered more than one
3 July 2022
14. Nobody Knows Anything
Don’t build a warehouse. Just drive everything up from here every night for a month,
3 July 2022
14. Nobody Knows Anything
Next-day delivery didn’t really change our cancelation rates
3 July 2022
14. Nobody Knows Anything
The longer we ran the test, the more apparent it was that next-day delivery was a real game changer—just not in the ways we thought. It didn’t affect retention—it affected sign-ups. Next-day delivery inspired real dedication, the kind that makes you tell all your friends about this new service you’re using
3 July 2022
14. Nobody Knows Anything
The whole saga had provided a valuable lesson: trust your gut, but also test it
3 July 2022
14. Nobody Knows Anything
Whenever anyone asks me what my favorite movie is, I never tell the truth
3 July 2022
14. Nobody Knows Anything
The public answer—the convenient lie—is Pulp Fiction
3 July 2022
14. Nobody Knows Anything
If we wanted any chance of surviving long-term, we had to convince customers that we were giving them something better than an online library and quick shipping. Neither the technology nor the delivery method mattered
3 July 2022
14. Nobody Knows Anything
One disadvantage of being an online store was that it made browsing difficult. If you knew what you were looking for, you could just search for it. But if not, finding movies was surprisingly difficult
3 July 2022
14. Nobody Knows Anything
Christina, the editorial content team, and I designed content-rich landing pages for a variety of genres
3 July 2022
14. Nobody Knows Anything
We’re redesigning the site anyway. Instead of hard-coding pages, how about we just do it like this: Create a frame on the home page that has slots to display four movies at a time. Each slot can show the cover of the movie, run time, date of release, a little capsule synopsis—the data we already have. Then just make a list of fifty movies you might want to have appear there, and have the site randomly pick which four to display.
3 July 2022
14. Nobody Knows Anything
At first, we did what Amazon did. Using a process called “collaborative filtering,” Amazon would suggest products to you based on common buying patterns.
3 July 2022
14. Nobody Knows Anything
clustering” users according to overlapping positive or negative reviews—meant that we could efficiently recommend films to users based not on what they’d rented but what they liked.
3 July 2022
14. Nobody Knows Anything
we needed users to review movies—lots of them.
3 July 2022
14. Nobody Knows Anything
Theoretically, a user could review every movie he or she had ever seen
3 July 2022
14. Nobody Knows Anything
The result—which launched in February of 2000 as Cinematch—was a seemingly more intuitive recommendation engine, one that outsourced qualitative assessment to users while also optimizing things on the back end
3 July 2022
15. Drowning in Our Own Success
Leslie Kilgore, whom Reed had convinced to leave Amazon to head our marketing efforts as CMO,
3 July 2022
15. Drowning in Our Own Success
Cinematch, our recommendation engine
3 July 2022
15. Drowning in Our Own Success
But in retrospect, it was possibly one of the best things that ever happened to us. If we’d gone public in the fall of 2000, we would have been tied to the portal idea and to the unrealistic financial expectations that we had built around it—and that would have been a disaster
3 July 2022
15. Drowning in Our Own Success
Becoming a “movie portal” was the complete opposite of the Canada Principle
3 July 2022
15. Drowning in Our Own Success
Fucked Company, the cynical website of record for troubled and failing dot-coms, thinking that could have been us, even when reading about obviously mismanaged and doomed-from-the-start entries.
3 July 2022
15. Drowning in Our Own Success
spend more time with his family, what that really means is my ass got fired. When someone says this marketing copy just needs some wordsmithing, what they really mean is this sucks and needs to be completely rewritten. When someone says we decided to pivot, what they really mean is we fucked up, royally
3 July 2022
15. Drowning in Our Own Success
honor-bound
3 July 2022
15. Drowning in Our Own Success
we were still renting out soft-core pornography in 2000. And the reviews were typically…enthusiastic.)
3 July 2022
17. The Belt Tightens
For more than three years, we have all worked tremendously hard to get Netflix where it is today, work we should all be very proud of. But we’ve all known that there would be days that we had to make hard decisions. I’m afraid that today is one of those days.” Reed
3 July 2022
17. The Belt Tightens
scraping barnacles off the hull.
3 July 2022
17. The Belt Tightens
After a while, we got pretty callous about it. Let ’em scream, we would rationalize. We’re okay with upsetting a thousand if it means we get it right for ten thousand.
12 July 2022
18. Going Public
It’s more fun to come to work when you know you’re part of the handpicked elite
12 July 2022
18. Going Public
Here’s how Tom’s reflection-point method worked
12 July 2022
18. Going Public
Out of every hundred discs that arrived each day, ninety of them had a customer in that region who wanted them
12 July 2022
18. Going Public
we didn’t have movies sitting on shelves—even overnight—our utilization of inventory was exceptionally high. All we needed were a few dozen cheap storefronts, a couple hundred remote employees, and a bunch of shoeboxes and—bingo: next-day delivery to almost every mailbox in America.
12 July 2022
18. Going Public
The original crew of skilled generalists had been replaced with superstar specialists
12 July 2022
18. Going Public
The first was that the studios and networks were terrified of being “Napster-ed.” They’d watched the music industry fall victim to widespread piracy and cratered sales, so they weren’t very keen to give up digital rights
12 July 2022
18. Going Public
a way to use digital means to deliver Netflix movies directly to TV sets and further shrink the time between finishing one movie and getting the next one. Instantaneous streaming wasn’t possible in 2002, and downloads would take hours—but we were betting that even so, passively downloading a movie while you were asleep or at work was still preferable to getting in the car and driving to Blockbuster
12 July 2022
18. Going Public
Xbox to connect to the internet and then store whatever it downloaded
12 July 2022
18. Going Public
The way we saw it, Microsoft had the technology, and we had the content.
12 July 2022
18. Going Public
Here’s what I’ve learned: when it comes to making your dream a reality, one of the most powerful weapons at your disposal is dogged, bullheaded insistence. It pays to be the person who won’t take no for an answer, since in business, no doesn’t always mean no
17 July 2022
18. Going Public
VCs will always say that they’re aligned with your mission, that they want what’s best for the company. But what they really want is what’s best for their investment in the company. Which isn’t always the same thing
17 July 2022
18. Going Public
Everyone is aligned when the wind is blowing the right way. It’s when a storm comes up that all of a sudden it becomes apparent that people have different goals and objectives
17 July 2022
18. Going Public
It was May 22, 2002—the day before our IPO
17 July 2022
18. Going Public
was the opportunity to give their best customers an opportunity to buy low at the opening and sell high at the closing. Banks call that an opening day “bounce.”
17 July 2022
18. Going Public
A bounce is not necessarily a bad thing. The quick jump in price can show the public that a company is “hot” and has “momentum
17 July 2022
18. Going Public
Working, for me, was never about getting rich—it was about the thrill of doing good work, the pleasure of solving problems. At Netflix, those problems had been incredibly complex
17 July 2022
Epilogue: Randolph’s Rules for Success
But as quarterly numbers mechanically came and went each successive year, I slowly realized that although I loved the company, I no longer loved working there. It turns out that I did know what I like, and what I’m good at. And it wasn’t a company as big as Netflix. It was small companies struggling to find their way
17 July 2022
Epilogue: Randolph’s Rules for Success
That will never work. By now, I hope you know what my answer to that line is. Nobody Knows Anything
17 July 2022
Epilogue: Randolph’s Rules for Success
Be courteous and considerate always—up and down. Don’t knock, don’t complain—stick to constructive, serious criticism
17 July 2022
Epilogue: Randolph’s Rules for Success
Quantify where possible. Be open-minded but skeptical. Be prompt.
17 July 2022
Epilogue: Randolph’s Rules for Success
Do at least 10% more than you are asked.
17 July 2022
Epilogue: Randolph’s Rules for Success
Never, ever, to anybody present as fact opinions
17 July 2022
Epilogue: Randolph’s Rules for Success
on things you don’t know. Takes great care and discipline.
17 July 2022
Epilogue: Randolph’s Rules for Success
Don’t be afraid to make decisions when you have the facts on which to make them.
17 July 2022
Epilogue: Randolph’s Rules for Success
As you get older, if you’re at all self-aware, you learn two important things about yourself: what you like, and what you’re good at. Anyone who gets to spend his day doing both of those things is a lucky man.
17 July 2022
Epilogue: Randolph’s Rules for Success
The truth is, the patrimony of any innovation is complicated. There are always multiple people involved. They struggle, they push, they argue. They each contribute different backgrounds and inspirations:
17 July 2022
Epilogue: Randolph’s Rules for Success
But I’ve come to realize that success is not defined by what a company accomplishes. Instead, I have a different definition: Success is what you accomplish. It’s being in a position to do what you like, do what you do well, and pursue the things that are important to you.
17 July 2022
Epilogue: Randolph’s Rules for Success
The most powerful step that anyone can take to turn their dreams into reality is a simple one: you just need to start. The only real way to find out if your idea is a good one is to do it. You’ll learn more in one hour of doing something than in a lifetime of thinking about it.
17 July 2022
Epilogue: Randolph’s Rules for Success
So take that step. Build something, make something, test something, sell something. Learn for yourself if your idea is a good one
17 July 2022
Epilogue: Randolph’s Rules for Success
You have to learn to love the problem, not the solution. That’s how you stay engaged when things take longer than you expected.
17 July 2022
Epilogue: Randolph’s Rules for Success
Nolan Bushnell, the co-founder of Atari, once said something that has always resonated with me. “Everyone who has taken a shower has had an idea,” he said. “But it’s the people who get out of the shower, towel off, and do something about it that make the difference.”
,,[[Marc Randolph: That will never work]] | [[17 July 2022]],,
<h2 class="" style="box-sizing: border-box; line-height: 1.2; font-weight: 300; margin-top: 0.3em; margin-bottom: 0.3em; color: rgb(64, 64, 64); font-family: "SF Pro Display", -apple-system, BlinkMacSystemFont, BentonSans, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">982</h2>
* Tools for better thinking
* website - https://untools.co/
[[Mental Models]]
!! Packages
* [[EconML]]
* [[CausalML]]
* [[sk-uplift]]
!! Metrics
* [[Area Under Uplift Curve (AUUC)]]
* [[Area Under Qini Curve (Qini)]]
* [[Uplift@k]]
* [[Weighted Average Uplift]]
!! Tutorials
!!! [[CausalML]]
<iframe width="400" height="225" src="https://www.youtube.com/embed/2J9j7peWQgI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen float='left'></iframe>
* Presentation - [[Why start using uplift models for more efficient marketing campaigns|https://www.slideshare.net/sawjd/why-start-using-uplift-models-for-more-efficient-marketing-campaigns]]
!!! Introduction to Uplift Modeling
<iframe width="400" height="225" src="https://www.youtube.com/embed/VWjsi-5yc3w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
!!! From [[Propensity]] to Uplift
<iframe width="400" height="225" src="https://www.youtube.com/embed/UamvZ-J0eVA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
!! References
* [[What is Uplift modelling and how can it be done with CausalML?|https://analyticsindiamag.com/what-is-uplift-modelling-and-how-can-it-be-done-with-causalml/#:~:text=Uplift%20modeling%20is%20a%20causal,action)%20on%20an%20individual's%20behaviour.]]
* [[A Literature Survey and Experimental Evaluation of the State-of-the-Art in Uplift Modeling: A Stepping Stone Toward the Development of Prescriptive Analytics|https://www.liebertpub.com/doi/10.1089/big.2017.0104]]
* [[Using Control Groups to Target on Predicted Lift:Building and Assessing Uplift Models|https://silo.tips/download/using-control-groups-to-target-on-predicted-lift#modals]]
Underlying predictive model
[[NetworkX]] is a Python library for studying graphs and networks. [[Markov Chain]] can be visualized using [[Networkx]]. The code to do the same can be found in [[Kaggle]] notebook [ext[Networkx Force Plots|https://www.kaggle.com/sumitkant/networkx-force-plots]]
!! References
* [ext[https://mungingdata.com/python/dag-directed-acyclic-graph-networkx/]]
!! Step1: Enable gsheets api from google cloud and create and download credentials
```python
with open("gsheets_api_creds.json", "w") as outfile:
outfile.write(json_serialized_obj)
gc = pygsheets.authorize(service_file='/kaggle/working/gsheets_api_creds.json')
```
!! Get data from tradingview
use [[Fetching Prices data from tradingview websocket]]
```python
for ticker, excel in tickers:
# get data from tradingview
df = search_data(ticker, "1", bars=10000)
# select worksheet
sh = gc.open(excel)
wks = sh[0]
# resize worksheet
len_records = len(wks.get_all_records()) + 2
wks.resize(len_records)
# get start of the cell
start = 'A' + str(len_records)
if len_records == 2:
wks.set_dataframe(df, start, copy_index = False, copy_head = False)
elif len_records > 2:
last_datetime = wks.get_all_records()[-1]['datetime']
df['select'] = df['datetime'] > last_datetime
selected_df = df[df.select].drop('select', axis=1)
if selected_df.empty:
pass
else:
wks.set_dataframe(selected_df, start, copy_index = False, copy_head = False)
print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: {selected_df.shape[0]} RECORDS SAVED {ticker} -> {excel}")
```
!! 1. [[Categorical]] or [[Nominal]]
* two or more categories
* NO intrinsic rank ordering
* Example: Yes/No answers, Hair Color: Blonde, Brown, Brunette, Black, etc..
!! 2. [[Ordinal]]
* similar to [[Categorical]] variable
* Clear rank ordering between categories
* Example: Income-High, Med, Low; [[Likert Scale]] - Strongly Disagree(1),2,3,4,5 (Strongly agree)
!! 3. [[Interval]]
* Similar to Ordinal
* interval between numerical values are equally spaced
!! Why is it important?
* Cannot take average of Categorical (non-sense) or Ordinal (questionable at best). To take an average, the variable has to be numerical
!! Reference
* [[WHAT IS THE DIFFERENCE BETWEEN CATEGORICAL, ORDINAL AND INTERVAL VARIABLES?|https://stats.oarc.ucla.edu/other/mult-pkg/whatstat/what-is-the-difference-between-categorical-ordinal-and-interval-variables/]]
!! Chapter 1 - Corporate Action
# [[Dividends]]
# [[Bonus Issue]]
# [[Stock Split]]
# [[Rights Issue]]
# [[Buy Back]]
!! Chapter 4 - Market Events
# [[Monetary Policy]] - RBI Changes event rates to balance growth and inflation
#* [[Repo Rate]] - Markets don’t like increasing repo rates because of high cost of borrowing which limits company growth
#* [[Reverse Repo Rate]] - Reverse repo rate increase is also not favorable since banks prefer to lend money to RBI than corporates/companies
#* [[Cash Reserve Ratio (CRR)]] - increasing CRR leads to less money supply and is bad sign for the economy.
:Changes in interest rates is a key market even and the first stocks to react are the interest rate sensitive stocks e.g. banks, automobile, housing finance, real estate, metals etc.
#* [[Inflation Rate]] - increase in inflation rate leads to increase in [[Repo Rate]] and [[Reverse Repo Rate]]
#* [[Wholesale Price Index (WPI)]]
#* [[Consumer Price Index (CPI)]]
#* [[Index of Industrial Production (IIP)]]
!! 1. The Need to Invest
# Fight Inflation
# Create Wealth
# Meet financial aspirations
!!! Types of Investments
# [[Fixed Income Instruments]]
# [[Equity]]
# [[Real Estate]]
# [[Gold Investment]]
Typical asset allocation recommended for a young professional, 70% of investable amount in Equity, 20% in Fixed Income & Rest in Gold and Silver
!! 2. Financial Regulator and Intermediaries
!!! Ecosystem
* [[Stock Market]] facilitates equity transactions
** Stock Exchanges - [[BSE]] & [[NSE]]
* Market Participants
** Domestic Retail Participants
** NRI's
** Domestic Insitutions
** Asset Management Companies (AMC) - [[Mutual Fund]] companies such as SBI, DSP, HDFC AMC, Franklin
** Foreign Institutional Investors (FIIs)
* [[SEBI]] - Stock market regulator
* [[Depository]] - DEMAT account
* [[Depository Participant]] - liason with [[Depository]]
* [[Stock Brokers]] - Trading account
* [[Banks]] - facilitate funds transfer from /to bank account to/from trading account. Can have primary and secondary bank account transfer money to trading account. The withdrawl can happen only in the primary account
* [[Clearing Corporation]] - settlement of transactions
!! 3. The IPO Market
Company goes for IPO primarily to raise funds. Some reasons for raising funds
* funds for CAPEX
* provide early investor exit
* repay existing debt
* increase visibility of the company
!!! Process of IPO
# Company appoints Merchant bank to carry out underwriting process, conduct due deligence, promotion of IPO and prepare [[Draft Red Herring Prospectus (DRHP)]]
# Company files DRHP, the next steps include
#* IPO Promotion
#* Price Band estimation
#* Book Building - opening a window to subscribe to shares
#* Closure - decide price point (usually max bids on the price)
#* Listing Day - company gets listed on [[Stock Exchange]]
!!! IPO Subscription
# IPO may get over-subscribed or under-subscribed
# [[Greenshoe option]]
!! Chapter - 1 - Why [[Stock Market]]s fluctuate?
* Due to favorable or adverse news
!!! How to Transact in [[Stock Market]]
* Login to Trading Portal
* Fill an order form # shares
* Hit buy - if sufficient money then money is deducted from trading account by (# shares x share price) + (applicable charges)
* Debit from trading account immidiately
* Takes T+2 days for shares to arrive in [[DEMAT Account]] also called ''T+2 settlement''
!!! Common Terms
# [[Holding Period]] - Time Period between buying and selling of shares
# [[Absolute Return]] - `(Ending Period value/Starting period value - 1) x 100%`
# [[Compounded Average Growth Rate (CAGR)]] - used to compare performance of stocks
# [[INDEX]] - combination of stocks of companies which qualifies minimum requirements.
#* [[S&P BSE SENSEX]]
#* [[NIFTY]]
!!! Jargons
# ''Bullish'' - [[Stock Market]] trending upwards. An optimist is also called a ''bull''
# ''Bearish'' - [[Stock Market]] trending downwards. A pessimist also called a ''bear''
# ''Trading sideways'' - neither trading up or down
# ''52 Week High/Low'' - Highest/Lowest point trade of stock in the last 52 weeks or one year
# ''All time high/low'' - highest/lowest stock price since the stock was listed.
# ''Face Value'' - par Value or Nominal value of stock
# ''Long Position'' - bullish, buying a stock to sell later
# ''Short Position'' - bearish, selling a stock (by borrowing from exchange) and buying later
!! Trading Terminal
Two options
* Call & Trade - call your stock broker and specify the transactions
* Online Terminal - login to the trading account. Most trading terminals have 2 Factor Authentication also called ''2FA''
!!! Market Watch
The following things are visible for a stock in market watch
# ''LTP'' - Last Traded price - current price of the stock
# ''%change'' - from previous day close
# ''OHLC'' - Open High Low & Close prices of stock
# ''Volumes'' - Total buy and sell transactions
# ''Bid & Ask'' - offer prices and bid prices for stocks
!!! How to Transact in the [[Stock Market]]
* [[Limit Order]] - buy sell when stock hits specified price
* [[Market Order]] - buy/sell at current stock price
* [[Stop Loss Order]] - sell/buy the order before max loss hits
* [[Stop Loss Trigger]] - triggers price for stop loss order to be triggered
!!! Types of Trades
* CNC - For trades which involves holding of stocks for days, weeks, months or years
* MIS - Intraday Trading
!!! Registers
* Trading Book - list executed orders
* Order book - list all orders
!! Chapter 3 - Clearing and Settlement
!!! 1. T day
* Also called Trade day - the day of transaction
* For a buy trade `money deducted = Turnover + Applicable charges`
* [[Contract Note]] - provided by the stock broker with breakup of all stocks and transactions done during the day
!!! 2. T+1 day
* Can sell the stock purchased on T day on T+1 day. This is called [[Buy Today Sell Tomorrow (BTST)]]. This could be a risky proposition, since selling a stock you don’t currently own.
* On this day, broker transfers money to exchange
!!! 3. T+2 day
* Exchange credits broker with the shares bought
* Broker credits the shares in [[DEMAT Account]] by the end of this day
* Shares available to transact @ T+3 day
!! Sale Transaction
* T-day: Shares sold on T-day gets blocked in [[DEMAT Account]]
* T+1 day : Blocked shares transferred to [[Stock Exchange]]
* T+2 day : Receives funds from the sale in the trading account with applicable charges deducted
[[Backtesting]] library in [[Python]] optimized using [[Numba]]
!! References
* [[Github|https://github.com/polakowo/vectorbt]]
* <iframe width="560" height="315" src="https://www.youtube.com/embed/9rpMzng_aw0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
VGG16 is a [[Convolutional Neural Network]] model proposed by K. Simonyan and A. Zisserman from the University of Oxford in the paper “Very Deep Convolutional Networks for Large-Scale Image Recognition”.
<img src= 'https://neurohive.io/wp-content/uploads/2018/11/vgg16.png' width=' 700'>
!!Architecture
:<img src='https://neurohive.io/wp-content/uploads/2018/11/vgg16-neural-network.jpg' width='700'>
!! Use-Cases and Implementation
* Unfortunately, there are two major drawbacks with VGGNet:
* It is painfully slow to train. The network architecture weights themselves are quite large (concerning disk/bandwidth).
* Due to its depth and number of fully-connected nodes, VGG16 is over 533MB. This makes deploying VGG a tiresome task.
!! Alternatives
* [[SqueezeNet]]
* [[GoogLeNet]]
!! Implementation using Tensorflow
```python
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Flatten, Dense, Dropout
prior = tf.keras.applications.VGG16(
include_top=False,
weights='imagenet',
input_shape=(150, 150, 3)
)
model = Sequential()
model.add(prior)
model.add(Flatten())
model.add(Dense(256, activation='relu', name='Dense_Intermediate'))
model.add(Dense(1, activation='sigmoid'))
# Freeze the VGG16 model, e.g. do not train any of its weights.
# We will just use it as-is.
for cnn_block_layer in model.layers[0].layers:
cnn_block_layer.trainable = False
model.layers[0].trainable = False
```
!! Coursera - Andrew Ng
* [[Convolution]] layers = 3x3, s=1, same padding for all layers
* [[Max Pooling]] = 2x2, s=2
* Simplified NN Architecture - attractive for researchers
* VGG16 - refers to 16 layers with weights
* 188 M parameters - one of the downsides
* VGG-19, much bigger network than VGG-16
* $$n_H, n_W$$ decreases by a factor of 2 consistently
* $$n_C$$ increases by factor of 2
!! Links
[ext[External link for VGG16|https://neurohive.io/en/popular-networks/vgg16/]]
,,[[29 Jun 2020]],,
[[Lumen5.com|https://lumen5.com/]]
* Uses AI to find the background for a text
* very easy to create videos
!! References
* [[http://images.moneycontrol.com/static-mcnews/2021/09/Vinati-Organics-01-09-2021-cd.pdf]]
How do you plan to bring up your team
* People Leader Answer
* Technical & Deliverables
[[Preparing for the next role]] |
<<<
Don’t project the idea that you’re showing a chart. Project the idea that you’re showing a reflection of human activity, of things people did to make a line go up and down. It’s not ‘Here are our Q3 financial results,’ it’s ‘Here’s where we missed our targets
<<< Nancy Duarte, Presentation Expert
* To start with chart-making rules is to forgo strategy for execution; it’s to pack for a trip without knowing where you’re going.
!! Two Questions
* Is the information conceptual or data-driven?
* Am I declaring something or exploring something?
!! Four types of visual communication
* ''Idea Illustration''
** Org Chart
** [[Decision Trees]]
<img src='https://hbr.org/resources/images/article_assets/2016/05/R1606H_BERINATO_B.png' width=400>
!! Reference
* [ext[https://hbr.org/2016/06/visualizations-that-really-work]]
Interaction effects are also called ''moderation analyses''
!! Methods
<table>
<tr>
<th>Moderator (m1)</th>
<th>Variable (m2)</th>
<th>Dep Var</th>
<th>Visualization</th>
</tr>
<tr>
<td>Discrete</td>
<td>Discrete</td>
<td>Continuous/Discrete</td>
<td>[[Bar chart with Facet]] , [[Modified Line Plot]]</td>
</tr>
<tr>
<td>Discrete</td>
<td>Continuous</td>
<td>Continuous</td>
<td>[[Scatter plot]] colored by m1 , [[Scatter plot with regression lines]]</td>
</tr>
<tr>
<td>Continuous</td>
<td>Continuous</td>
<td>Continuous</td>
<td>''Pick-a-point approach'' - Cut the moderator variable into buckets and use [[Scatter plot with regression lines]]. The groups here are arbitrary.
Can use OLS with [[ANOVA]] to plot conditional coefficient with [[Histogram]]
</td>
</tr>
</table>
!! Two Variable Inteactions
Using [[Seaborn]]'s [[point plots|https://seaborn.pydata.org/generated/seaborn.pointplot.html]] plotting two way interactions handling both categorical and numerical variables
Prepared a [[Kaggle]] Notebook for plots with interactions [[here|https://www.kaggle.com/sumitkant/identifying-variable-interactions-2-way-3-way?scriptVersionId=70791375]]
!! References
* [[How to visualize interaction effects|https://philippmasur.de/2018/11/26/visualizing-interaction-effects/]]
* https://seaborn.pydata.org/generated/seaborn.pointplot.html
,,Tags: [[08 August 2021]] | [[Feature Interactions]],,
* https://www.voicemod.net/
* Change Voice in Realtime
[[AI Businesses]] | [[AI Speech]]
''A waffle chart shows progress towards a target or a completion percentage. There is a grid of small cells, of which coloured cells represent the data.'' A chart can consist of one category or several categories. Multiple waffle charts can be put together to show a comparison between different charts.
<img src='https://depictdatastudio.com/wp-content/uploads/2017/10/EmeryAnalytics_Visualizing-Survey-Data_Crowded-Agree-Disagree-Scales_After-8-1024x294.png' width=700 >
!! References
* [ext[Waffle Chart|https://datavizproject.com/data-type/percentage-grid/#:~:text=A%20waffle%20chart%20shows%20progress,a%20comparison%20between%20different%20charts.]]
[[PyWaffle]] is a [[Python]] library to create [[Waffle Charts]].
<iframe width="560" height="315" src="https://www.youtube.com/embed/AMjcT6B9dHI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!! References
in 1965, Warner proposed the randomized response method as a survey technique to reduce potential bias due to [[Non-Response Bias]] and social desirability when asking questions about sensitive behaviors and beliefs.
''It has been far safer to steal large sums with a pen than small sums with a gun'' – Warren Buffet
* Indian platoform to buy and sell [[Cryptocurrency]](ies)
!! Terms of service
<embed src='https://s3.ap-south-1.amazonaws.com/wrx-assets/WazirXUserAgreement.pdf?v1' width='1200px' height='400px'>
!! References
* https://www.cnbc.com/2021/07/07/wazirx-nischal-shetty-built-indias-largest-crypto-trading-exchange.html
! Week 1
!!! Learning objectives
# Creating synthetic time series data
# Explore existing statistical methods to predict time series before diving into building NN
!!! What is time Series?
* [[Time series]] is defined as an ordered sequence of values that are usually equally spaced over time.
* If there is only a single value for each time step then it is described as univariate time series other wise called multivariate time series.
!!! Things to do with ML on Time Series
# ''Forecasting'' - projecting forwards
# ''Imputation'' - Project backwards
# ''[[Anomaly detection]]''- sudden shifts in the data
# ''Spotting patterns ''- analyse sound waves to spot words in them, to be used as a [[Neural Network]] for [[Speech Recognition]]
!!! Patterns in time series
# ''Trends''
# ''Seasonality'' - repeating patterns at predictable intervals
# ''White Noise'' - set of random values
# ''[[Auto-correlation]]'' - correlates with a delayed copy of itself often with a lag. Often a time series like this is described of having a memory as steps are dependent on previous ones.
# ''Innovation'' - Un-predictable spikes in the data
!!! Types of Time Series
# ''Stationary time series'' = Trend + Seasonality + Auto-Correlation + Noise
# ''Non-Stationary time series'' = Trends + Big event + No Trend
!!! Train & Test Sets
* ''Fixed Partitioning'' - Divide the dataset into 3 parts - training, validation & test period. Generally want each period contains a whole number of seasons. Sometimes while forecasting actual values, we can train on the test data and predict - since the test data closet to the actual values
* ''Roll-Forward Partitioning'' - Starting with the short training period and gradually increasing it by day or week and predicting for the following day or the following week.
!!! Metrics
# Errors = Forecasts - actual
# MSE = `np.square(errors).mean()` - prefer this if large errors are more dangerous
# RMSE = `np.sqrt(mse)` - same scale as of errors
# MAE - Mean absolute error/deviation (MAD) = `np.abs(errors).mean()` - better if gain or loss is proportional to the error
# MAPE - Mean Absolute Percentage Error (Mean ratio between absolute error and absolute value) = `np.abs(errors/x_valid).mean()`
`keras.metrics` provides library of these metrics
!!! Forecasting
# ''Naive Forecasting'' - Next value will be the same as the last value. Can consider MAE/MSE from this model as the Baseline value
# ''Moving Average'' - Eliminates a lot of noise and it gives a curve roughly emulating the original series, but it ''does not anticipate trend or seasonality''. Sometimes, It may end up being worse than the naive forecast.
* Method to avoid this is to use ''differencing ''which removes trend and seasonality by computing the difference between the values at a time t and a value at earlier period.
* So predict the values for the differencing series with no seasonality or trend and add back the values for the latest time period. This addition will lead to noise in the predicions, which can be removed by smoothing out using moving average.
* ''Moving Average using centered windows'' can perform better than moving average with trailing windows as mentioned above.
!!! Colab Notebooks
* [ext[Week 1 Quiz|https://colab.research.google.com/drive/1ho8DQE7FbdZ9GqP0-7LZw1JmdPs9r8vL#scrollTo=wLO3pyM1vkLt]]
* [ext[Week 1 Exercise|https://colab.research.google.com/drive/1WIz1tYm5nShDBPKJUwKw1K-g_wdLvant]]
,,[[Sequences, Time Series and Prediction]],,
! Week 2
!!! Learning Objectives
# Build a DNN for Time series data
# Tuning learning rate of optimizer
!!! Preparing Features & Labels
* Learning on windows of time - e.g. window of 30 days will result in 30 feature values as `x` and label `y` being the 31st value or current value
* Creating dataset using tensorflow [[tf.data.dataset]]
* shuffling is done to remove [[Sequence bias]]
!!! Linear Regression using Neural Networks
* Splitting Data into train and validation
```python
split_time = 1000
time_train = time[:split_time]
x_train = series[:split_time]
time_valid = time[split_time:]
x_valid = series[split_time:]
```
* Windowed Dataset - windowed_dataset is a helper function that uses [[tf.data.dataset]]
```python
window_size = 20
batch_size = 32
shuffle_buffer_size = 1000
dataset = windowed_dataset(x_train, window_size, batch_size, shuffle_buffer_size)
```
* linear model
** single dense layer - `input_shape = window_size`
** learned weights can be accessed by using `l0.get_weights()` - which gives out two arrays containing parameter weights and bias value
```python
l0 = tf.keras.layers.Dense(1, input_shape=[window_size])
model = tf.keras.models.Sequential([l0])
model.compile(loss="mse", optimizer=tf.keras.optimizers.SGD(lr=1e-6, momentum=0.9))
model.fit(dataset,epochs=100,verbose=0)
```
* ''Predictions'' : These predictions are the next value of the window. Forecast is done to
```python
forecast = []
for time in range(len(series) - window_size):
forecast.append(model.predict(series[time:time + window_size][np.newaxis]))
# taking forecasts only after split time, or in the validation dataset
forecast = forecast[split_time-window_size:]
results = np.array(forecast)[:, 0, 0]
```
!!! Using DNN
* To use [[Deep Neural Networks]] we just need to replace the code defining `l0` to the code below
```python
model = tf.keras.layers.Sequential([
tf.keras.layers.Dense(10, input_shape = [window_size], activation = 'relu'),
tf.keras.layers.Dense(10, activation = 'relu'),
tf.keras.layers.Dense(1)
])
```
!!! Tuning Learning Rates
* Defining [[LearningRateScheduler]] as a callback and using it in `model.fit` statement
,,[[Sequences, Time Series and Prediction]] | [[20 Jun 2020]],,
!!! 1. What is a windowed dataset?
* ''A fixed subset of a time series''
!!! 2. What does ‘drop_remainder=true’ do?
* ''It ensures that all rows in the data window are the same length by cropping data''
!!! 3. What’s the correct line of code to split an n column window into n-1 columns for features and 1 column for a label
* ''dataset = dataset.map(lambda window: (window[:-1], window[-1:]))''
!!! 4. What does MSE stand for?
* ''Mean Squared error''
!!! 5. What does MAE stand for?
* ''Mean Absolute Error''
!!! 6. If time values are in `time[]`, series values are in `series[]` and we want to split the series into training and validation at time 1000, what is the correct code?
* ''time_train = time[:split_time]''
* ''x_train = series[:split_time]''
* ''time_valid = time[split_time:]''
* ''x_valid = series[split_time:]''
!!! 7. If you want to inspect the learned parameters in a layer after training, what’s a good technique to use?
* ''Assign a variable to the layer and add it to the model using that variable. Inspect its properties after training''
!!! 8. How do you set the learning rate of the SGD optimizer?
* ''Use the lr property''
!!! 9. If you want to amend the learning rate of the optimizer on the fly, after each epoch, what do you do?
* ''Use a LearningRateScheduler object in the callbacks namespace and assign that to the callback''
,,[[Week 2 - Deep Neural Networks for Time Series]],,
! Week 3
of [[Sequences, Time Series and Prediction]]
!!! [[Recurrent Neural Network]] for [[Time series]]
* Using two recurrent layers followed by a dense layer
* Batch inputs to output batch of forecasts
* `input_shape = [batch_size, # time steps, # dims]`
:<img src = "https://lh3.googleusercontent.com/RYOXTMbcTCYivTivclvVhk_FLLKe8qmiV8G0Z0ZO_EGttRbYv27m3HXrVGSV_W3zPmOn5B6n9_52L0p3mLPXBJxe96bXNo19I3VbOkcTQEfYiSEPcq7cUc-ptn6ArDp-krLzGZbvcRVI2p7S-jSujpZ6uGMBBLBFnkEkhDgOyJRS05YEpWim5C1AjXg_cs3SrKX2YmLXepQhOTRYS5a1-jIQlOnqchfQY6gX6IGqdO9Z73CsFjIGZTq7sLWYIYrRmyxDa6wryrIVyiiw15DAlN8aBGXBPjZa6umg0HMlxrof_u9m-uU8A3Z9fHuP3jbbVAZzQ9wqXXXGf-upWjjK4SO-cCh7Iaa86ItynnyhuSQtqNmupX4eU4t2tVSVJSlW3J48WHcPjWLJhsRMPVv4crBg5xerUAXMYm43LkM5KkLXu_oWBRubgtYetVpGUUaNb9mtd40JallSGxYBJuN9SpbWwZiTlS7yx0mUC4LKNDbqsUJgzKI0gKnwRKv66DWBXLlkryvMLnu3dUPQ4s4GjdQhw0WH5UvQKlivbjL1b3CAPnOdJNY8ttARpztJQvXxi8TRklMp57hpls-3SlZjt9rfy3MilCeyT7pFn4ogqDfvDBDmyJbyxxMJiwwNeV03JJwUnPHO6ZO8P1mS0QKUmQ1gVIBKGhLPlpzj9BkDFncbQBW5LLk1L8aE0zf_OOg=w1560-h878-no?authuser=0" width="700">
:If the batch size is 4 and the number of time steps is 30 and # dims = 1 then input shape = [4, 30, 1]. So for RNN, the input shape at each time step is [4,1]. The output shape at each time step [batch size, # neurons] and for full RNN layer, output_shape = [4, 30, 3]
* When stacking multiple RNNs, we need to specify `return_sequences = True` to return vectors output which essentially ignores all outputs in all time steps except in the last one.
!!! Outputting a sequence
*Sequence to vector prediction
```python
model = keras.models.Sequential([
keras.layers.SimpleRNN(20, return_sequences=True, input_shape = [None, 1]),
keras.layers.SimpleRNN(20),
keras.layers.Dense(1)
])
```
:<img src = "https://lh3.googleusercontent.com/HOE978uRbHJe6wKbUunSDmwL2H01lbBwfc-UPNWAOKrZ1sUvJc6FHrM3SF_oszDqpXxoC01Ce6kzor-BtIa7X7UOXll9ESYYySbgHRCuWbsTSVa76ZedCehc_QKMdc3u4JfZAIVmxPM6ja7iL8c0i-BW1FfeXJhaBnzEZC_1WtQK0mquRg3IhDRRVkiG1pwROtQW1YzExeQRsvpRvOM4COZHOlxKeakpJ_W_YQ0ZI710B7ZgDLuVZtoB0vpEszZdEAwNX_jXpPrV2Kff0eOrxQ1Zwrl5PymozJO9FfP7spiY6YE17ezyZWhaL60vXQBy_3U17NlDR5b6VzwYad5tMjUVbsXtdbCrQvPilnaZvdkPxpNl4-SPDV87G4-dY1xgyR-BaS0gGo8QPPzmQe9c2spNO4leCG0HMscT7j7eCRrNlrW3jwm2j6caTa2GVCogftNtLszYph6bXcHym68yvKPCok0Bmj8_xRq1I2WpFo4vpFT6J4wbMRlHWGYpSL_7hC4rCUfH5-CPNEUvMQ32sNh09-6eggjbh0RoFuncMp7F57UzmUvH5Mx1mhnlNY1PWbcprT48Abk7Vowy6hW3O3MzbYecCAS4nlHTzxytbNeCAEOjfZt0yLo25hpnYbh8VjUNngwCUJyBnkHVUTk61BMeANMaRccSDB1LN2x-V8V2jGfWRC7UnAnxLVeuMkg=w474-h243-no?authuser=0" width="500">
:Note: `input_shape = [None,1]` in which batch size is note defined, but already assumed by RNN, and number of time steps is set to `None` which means RNN can handle input sequence of any length and lastly `1` or 1 dimension.
*''Sequence to sequence prediction'' - can be achieved by setting `return_sequences = True` for second RNN.
!!! [[Lambda Layers]]
Helps writing custom functions in model definition to expand the functionality for [[TensorFlow]] [[Keras]]
* ''Reshaping input data'' - current input shape (# batch size, # time steps), but RNN expects 3 dimensions. Using lambda function to expand functionality. Setting `input_shape` to `None` means model can take sequences of any length.
```python
keras.layers.Lambda(lambda x : tf.expand_dims(x, axis = -1), input_shape = [None])
```
* ''Function for scaling output predictions ''
```python
keras.layers.Lambda(lambda x : x * 100.0)
```
!!! [ext[RNN Notebook|https://colab.research.google.com/drive/1qgqBmv7m0S2ec7VL7v_7K3Z_ltDtZChS]]
* Created a windowed dataset from time series
* model definition with 2 layer RNN
* optimizing learning rate using LearningRateScheduler and training for 100 epochs with loss function as [[Huber loss]]
* Selecting best learning rate by looking at the plots for learning rate and loss value and training for 400 epochs
!!! [[LSTM]]
* because of [[Recurrent Neural Network]]'s diminishing gradients, it is better to use [[LSTM]]s to improve the accuracy of predictions by using information further back in the series.
!!! [ext[Week 3 Quiz|https://colab.research.google.com/drive/1npwsqpZfOhUkro45jQFbsmimTl9YYh2S#scrollTo=TN0Woxx_b-jD]]
! Week 4
,,[[Sequences, Time Series and Prediction]],,
!! Computer Vision Problems
* [[Image Classification]] - cat/not-cat
* [[Object Detection]] - position of object in the image, draw a bounding box
* [[Neural Style Transfer]] - use content of one image in the style of the other
''Challenge with [[Computer Vision]] problems'', is inputs can get really big. For example 1000 x 1000 pixel color image will have an input size of 3,000,000 pixel values. And if the hidden layer subsequent to the input units have 1000 units, that 3M x 1000 = 3Billion parameters to learn. The $$w$$ matrix will be (1000, 3000000) matrix. This can be solved using [[Convolution]]s
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[23 June 2021]],,
! Train/Dev/Test Datasets
Making good choices on how you setup train, dev and test datasets can make a huge difference in helping quickly find a high performing [[Neural Network]]
While training a [[Neural Network]], you have to make a lot of decisions on the [[Hyperparameter]]s like
* number of layers
* number of hidden units
* learning rate
* [[Activation Function]]s
In practice, applied [[Machine Learning]] is highly iterative process, because it is impossible to correctly guess the right value of hyperparameters.
<img src='https://3.bp.blogspot.com/-yuuiK-ysDX8/XJTHY4TDE2I/AAAAAAAAZf8/8hgBnVYWQ_0iY8VcaLBK0qsXCTmB0wGmACLcBGAs/s1600/ML%2Bideas%2Bcycle-min.png' width=300>
Intuition developed in one area like [[Natural Language Processing (NLP)]], [[Computer Vision]] or [[Speech Recognition]] ''often do not transfer from another area of application'' even for an experienced individual. And the best choices may depend upon the amount of data, number of input features, computer configuration etc. Hence, finding out the right network depends a lot on how quickly can you go around the iterative process of $$Idea \rightarrow Code \rightarrow Experiment $$. Setting up Train/Dev/Test sets is the first step in that direction.
!! Train Test Splits
In [[Machine Learning]] era, we often used 60:20:20 splits for Train Dev and Test sets. This is a reasonable rule given you have 100 to 10K observations.
In [[Big Data]] era, the dataset sizes can be often of the order of millions. So, given a dataset with 1,000,000 observations, Dev and Test set requires only a small percentage of volume to evaluate different [[Algorithm]]s on the dev set. Common splits can be ''98:1:1'' for train:Dev:test respectively.
!! Mismatched train and test distributions
For a cat classifier
* Train set - cat pictures from the web page (images of cats under controlled conditions)
* Dev/Test sets - cat pictures from mobile app (users uploading images taken under casual conditions)
This kind of setup can work. This makes sure that test and dev are coming from same distributions.
Finally, it might be okay to not have a test set. Remember, the use of the test set is to give you an unbiased estimate of your final network on the test set. but if you don't need that estimate, then it is okay not to have a test set.
[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]
! What is a Neural Network?
* [[Deep Learning]] normally involves training [[Neural Network]]s, often very large.
* Example: Housing price prediction problem
** X = Size of the house
** Y = Price of the house
** The blue line in the image is a very simple trained NN approximated to fit the function representing the relationship between size and price.
<img src= 'https://images3.programmersought.com/689/6e/6ebe1bd966461cbcb94cf0f6ddb39321.png' width=300>
A complex example can of house price prediction can be thought of as such.
<img src='https://miro.medium.com/max/2732/1*PfebrhoODdlz3Gtgzsnyhg.png' width = 700>
[[COURSE1: Neural Networks & Deep Learning]]
!! What is ML Strategy
* Way of analysing [[Machine Learning]] problem that will point us in the direction of the most promising thing to try
ML Strategy is also changing in the era of [[Deep Learning]]
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[13 May 2021]],,
!! Why Sequence Models
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Use Case</th><th>Input (X)</th><th>Output (Y)</th></tr></thead><tbody>
<tr><td>Speech Recognition</td><td>Sequence</td><td>Transcript</td></tr>
<tr><td>Music Generation</td><td>Notes/MIDI/Audio</td><td>Audio</td></tr>
<tr><td>Sentiment Classification</td><td>Review</td><td>Rating</td></tr>
<tr><td>DNA Sequence Analysis</td><td>DNA</td><td>Which part corresponds to which portion</td></tr>
<tr><td>Machine Translation</td><td>French</td><td>English</td></tr>
<tr><td>Video Activity Recognition</td><td>Sequence of video frames</td><td>Running (Activity)</td></tr>
<tr><td>Named Entity Recognition</td><td>Sentence</td><td>Identify People</td></tr>
</tbody></table>
All of these problems can be modelled using [[Supervised Learning]]
,,Tags: [[COURSE5: Sequence Models]] | [[18 August 2021]],,
! [[Bias]]/[[Variance]]
Bias and variance are concepts that are easily learned but are difficult to master. In [[Deep Learning]] era, there is less of [[Bias-Variance Trade-off]], but we still talk about them independently.
<img src='https://cdn.analystprep.com/study-notes/wp-content/uploads/2021/03/31182150/cfa-leve-2-underfitted-vs-overfitted.png' width=700>
!! Understanding Bias and Variance
<table>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
</tr>
<tr>
<th>Train set Error</th>
<td>1%</td>
<td>15%</td>
<td>15%</td>
<td>0.5%</td>
</tr>
<tr>
<th>Dev set Error</th>
<td>11%</td>
<td>16%</td>
<td>30%</td>
<td>1%</td>
</tr>
</table>
* ''CASE A'' - ''High variance'' problem because model overfit on train set but high error on dev set
* ''CASE B'' - If the human error is 0.5% for the cat classifier, then the algorithm is not doing a good job on the training set. It means there is ''high bias''
* ''CASE C'' - If the human error is 0.5% for the cat classifier, both ''high bias and high variance problem''
* ''CASE D'' - ''low bias and variance''
[[Bayes Error]] - Minimum achievable error rate. If the Bayes error is 0%, then Model D is good, but if Bayes error is around 15%, then model B is good enough.
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[06 May 2021]],,
!Edge Detection Example
[[Convolution]] operation is one of the fundamental building block of [[CNN]]s. Let's look at convolution example for edge-detection
Consider a 6x6 image where convolution operation is done using a 3x3 filter or [[Kernel]] and we want to detect an edge in 6x6 image.
$$
\begin{bmatrix}
10 & 10 & 10 & 0 & 0 & 0 \\
10 & 10 & 10 & 0 & 0 & 0 \\
10 & 10 & 10 & 0 & 0 & 0 \\
10 & 10 & 10 & 0 & 0 & 0 \\
10 & 10 & 10 & 0 & 0 & 0 \\
10 & 10 & 10 & 0 & 0 & 0 \\
\end{bmatrix}^{6 \times 6} *
\begin{bmatrix}
1 & 0 & -1 \\
1 & 0 & -1 \\
1 & 0 & -1 \\
\end{bmatrix}^{3\times3} =
\begin{bmatrix}
0 & 30 & 30 & 0 \\
0 & 30 & 30 & 0 \\
0 & 30 & 30 & 0 \\
0 & 30 & 30 & 0 \\
\end{bmatrix}^{4 \times 1}
$$
''Computation for top left output'' =
$$(10\times 1 + 10 \times 1 + 10 \times 1)+ (10 \times 0+ 10 \times 0+ 10 \times 0)+ (10 \times -1 + 10 \times -1+ 10 \times -1) = 0$$
<img src='https://dummyimage.com/600x400/000/fff' width=250>
The detected edge might look thick but it works well with larger images.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[23 June 2021]],,
For example in [[Named Entity Recognition]], given input sequence
$$\begin{matrix} X: & Harry & Potter & and & Hermione & Granger & invented & a & new & spell \\ \ & x^{<1>} & x^{<2>} & x^{<3>} & ... & x^{<t>} & ... & ... & ... & x^{<9>} \\ Y: & 1 & 1 & 0 & 1 & 1 & 0& 0 & 0& 0 \\ \ & y^{<1>} & y^{<2>} & y^{<3>} & ... & y^{<t>} & ... & ... & ... & y^{<9>} \end{matrix}$$
* $$x^{(i)<t>}$$ - $$t^{th}$$ element in $$i^{th}$$ training example for ''input''
* $$y^{(i)<t>}$$ - $$t^{th}$$ element in $$i^{th}$$ training example for ''output''
* $$T_x^{(i)}$$ - length of input sequence
* $$T_y^{(i)}$$ - length of output sequence
!! Representing Words
Using vocabulary of 10,000 words and [[One-hot Encoding]] each word.
* each word is represented by 10,000 dimensional vector one-hot encoded
* Words not falling in vocab are represented with `<UKN>`
$$\begin{matrix} X: & Harry & Potter & and & Hermione & Granger & invented & a & new & spell \\ \ & x^{<1>} & x^{<2>} & x^{<3>} & ... & x^{<t>} & ... & ... & ... & x^{<9>} \\ \begin{bmatrix} a^0 \\ ... \\ and^{367} \\ ... \\ Harry^{4075} \\ ... \\Potter^{6830} \\ ... \\ Zulu^{10000} \end{bmatrix}^{Vocab} & \begin{bmatrix} 0 \\ ... \\ 0 \\ ... \\ 1 \\ ... \\ 0 \\ ... \\ 0 \end{bmatrix} & \begin{bmatrix} 0 \\ ... \\ 0 \\ ... \\ 0 \\ ... \\ 1 \\ ... \\ 0 \end{bmatrix} & \ & \ & \ & \ & \begin{bmatrix} 1 \\ ... \\ 0 \\ ... \\ 0 \\ ... \\ 0 \\ ... \\ 0 \end{bmatrix}\end{matrix}$$
Most commercial applications use 30-50k words. 100,000 is not uncommon and some use 1M vocab also.
,,Tags: [[COURSE5: Sequence Models]] | [[19 August 2021]],,
!! Orthogonalization
In [[Machine Learning]], for improving performance, there are many things we can try. Orthogonalization refers to a dimension that can only affect the outcome of one thing. For example, while driving a car
* Brake has one job of slowing the car down
* Accelerator has only one job of increasing the speed of the car
* Steering - direct the car's movement
If movement and speed was also afffected by the steering angle then it would have been difficult to control the car. Orthogonality allows us to use one knob to specifically solve the problem that limits the performance of ML system
!! Chain of Assumptions in ML
* ''Performance on the training set should pass some acceptability threshold''. If not, then
** train on a bigger [[Neural Network]]
** change the optimization algorithm
*''Performance should be acceptable on the dev/validation set''. If not, then
** regularize
** get a bigger training set
* ''Performance should be acceptable on test/OOT set''. If not, then
** get a bigger dev set, since overtuned to dev/validation data
* ''Performance should be good in real world'', If not, then
** change the dev set
** change the [[Cost Function]]
''Early stopping'' affects both dev and train set performance hence the parameter is not orthogonal.
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[[13 May 2021]],,
!! Supervised learning with [[Neural Network]]s
There is a lot of hype about neural networks, some of it is justified given the performance. Almost all of the economic value is created by one type of [[Machine Learning]] problem called [[Supervised Learning]].
<style type="text/css">
table.tableizer-table {
font-size: 12px;
border: 1px solid #CCC;
}
.tableizer-table td {
padding: 4px;
margin: 3px;
border: 1px solid #CCC;
}
.tableizer-table th {
background-color: #104E8B;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Input (X)</th><th>Output (Y)</th><th>Application</th><th>NN Type</th></tr></thead><tbody>
<tr><td>home Features</td><td>Prices</td><td>Real Estate</td><td>Standard</td></tr>
<tr><td>Ad, User Info</td><td>Click on Ad? (0/1)</td><td>Online Advertising</td><td>Standard</td></tr>
<tr><td>image </td><td>Object</td><td>Photo tagging</td><td>CNNs</td></tr>
<tr><td>Audio</td><td>Text Transcript</td><td>Speech Recognition</td><td>RNNs</td></tr>
<tr><td>English</td><td>Chinese</td><td>Machine Translation</td><td>RNNs</td></tr>
<tr><td>image, Radar Info</td><td>position of other cars</td><td>Autonomous Driving</td><td>Custom/Hybrid</td></tr>
</tbody></table>
!!! Two types of data
* ''Structured'' - Tabular data
* ''Unstructured ''- Images, text, audio
Much of the short-term economic value by NNs is created on structured data ([[Online Advertising]] and [[Recommendations Systems]]). Because of advancements in NNs, computers are much better equipped to understand unstructured data.
[[COURSE1: Neural Networks & Deep Learning]]
!Basic Recipe for Machine Learning
* After training an initial model, first ask, ''does the model have high bias?''. Look at the training set performance. If yes, then you can try
** a bigger network - increase the number of layers, increase the number of hidden units
** Train it longer
** Try advanced optimization algorithms
** [[Neural Network]] architecture finding - better suited for the problem. It may or may not work
:Do this unit the model fits the training set well
* Then look at the variance problem $$\rightarrow$$ look at generalization by looking at dev set performance. Best way to solve a high variance problem is to get more data.
** regularization
** Appropriate NN architecture (may or may not work)
* You have now something with low bias and low variance
In pre [[Deep Learning]] era, there was a tradeoff between [[Bias]] and [[Variance]]. There were not tools to affect the bias independently of variance.
''Training with bigger network or training with more data almost always reduces bias and variance respectively''. This is one of the big reasons that [[Deep Learning]] has been so useful for [[Supervised Learning]] without the bias/variance tradeoff.
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[15 June 2021]],,
!More Edge Detection
What happens when the image is flipped. Darker on the left and lighter on the right.
$$
\begin{bmatrix}
0 & 0 & 0 & 10 & 10 & 10 \\
0 & 0 & 0 & 10 & 10 & 10 \\
0 & 0 & 0 & 10 & 10 & 10 \\
0 & 0 & 0 & 10 & 10 & 10 \\
0 & 0 & 0 & 10 & 10 & 10 \\
0 & 0 & 0 & 10 & 10 & 10 \\
\end{bmatrix} *
\begin{bmatrix}
1 & 0 & -1 \\
1 & 0 & -1 \\
1 & 0 & -1 \\
\end{bmatrix} =
\begin{bmatrix}
0 & -30 & -30 & 0 \\
0 & -30 & -30 & 0 \\
0 & -30 & -30 & 0 \\
0 & -30 & -30 & 0 \\
\end{bmatrix}
$$
<img src='https://dummyimage.com/600x400/000/fff' width=250>
This filter/[[Kernel]] differentiates between light-to-dark and dark-to-light edge detection. The advantage is that it puts more weight to the central row
!! Different Kinds of Filters
* Detecting Horizontal Edges $$\rightarrow \begin{bmatrix}1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1 & -1 \\ \end{bmatrix}$$
* [[Sobel Filter]] $$\rightarrow \begin{bmatrix}1 & 0 & -1 \\ 2 & 0 & -2 \\ 1 & 0 & -1 \\ \end{bmatrix}$$. The advantage is that it puts more weight to the central row
* [[Scharr Filter]] $$\rightarrow \begin{bmatrix}3 & 0 & -3 \\ 10 & 0 & -10 \\ 3 & 0 & -3 \\ \end{bmatrix}$$
When you want to detect edges in some complicated image, you don't have to use [[Computer Vision]] researcher's hand-picked numbers for the filter. They can be treated as parameters and can be learned using [[Backpropagation]]. The goal is to learn these 9 numbers when convolved with an image, that gives and edge detector.
$$
\begin{bmatrix}W_1 & W_2 & W_3 \\ W_4 & W_5 & W_6 \\ W_7 & W_8 & W_9 \\ \end{bmatrix}
$$
[[Backpropagation]] can choose to learn normal, Sobel or Scharr filter based on statistics of data.
It can also learn to detect edges at angles. Learning these parameters from data have proven that the [[CNN]]s are better at learning these parameters themselves which detect low level features like edges even more robustly than CV researchers are generally able to code them up by hand.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[23 June 2021]],,
!! What not use a standard network?
$$
\begin{matrix}
x^{<1>} & \bigodot \rightarrow \\
x^{<2>} & \bigodot \rightarrow \\
. \\ . \\ . \\
x^{<T_x>} & \bigodot \rightarrow
\end{matrix}
\begin{bmatrix}
\bigodot \\ \bigodot \\ . \\ . \\ . \\ \bigodot
\end{bmatrix}
\rightarrow
\begin{bmatrix}
\bigodot \\ \bigodot \\ . \\ . \\ . \\ \bigodot
\end{bmatrix}
\begin{matrix}
\rightarrow \bigodot & y^{<1>} \\
\rightarrow \bigodot & y^{<2>} \\
\\
\\
\\
\rightarrow \bigodot & y^{<T_y>}
\end{matrix}
$$
This representation does not work well because
* Inputs and outputs can be of different lengths
* ''Doesn't share features learned across different points of text''. For example, if the word Harry is a name, then word Harry appearing in the later part of the sentence should also be a name and it is not learnt in this naive representation
* just like in [[Convolutional Neural Network]]s, using a better representation can also reduce number of parameters in the model
* [[Recurrent Neural Network]]s does not have either of the above disadvantage
!! [[RNN]]
<img src='https://dummyimage.com/600x400/000/fff' width=250>
* Where $$a^{<0>}$$ is either a vector of zeros or randomly initialized vector. A vector of zeros is more commonly used
* The RNN scans the data from left to right and the parameters used by the model are shared. The parameter governing the connection between $$x^{<t>}$$ and hidden layer $$W_{ax}$$ share across the time step is same
* to make a prediction $$\hat{y}^{<3>}$$, the decision is based not only on $$x^{<3>}$$ but also on $$x^{<1>}$$ and $$x^{<2>}$$, which is flowing through the activations $$a^{<1>}$$ and $$a^{<2>}$$.
* one drawback of this setup is that it uses the information from earlier part of the sentence only, to make a prediction. Wherein, information from the later part of the sentence could be useful as well. This is resolved using [[Bidirectional RNN]]s
*:For example, to differentiate between Teddy in the following two sentences
*:* //'Teddy Roosevelt was a great President'//
*:* //'Teddy bears are on sale'//
*:the model will have trouble telling that the first one is a Name and in the second one it is an object. So, context from later part of sentence can help improve the model differentiation
!! [[Forward Propagation]]
$$a^{<0>} = \vec{0}$$
$$a^{<1>} = g(W_{aa}a^{<0>} + W_{ax}x^{<1>} + b_a)$$; where tanh and ReLU activations are commonly used for g
$$y^{<1>} = g(W_{ya}a^{<1>} + b_y)$$; using sigmoid or softmax for single or multiple output probs
''Final Forward Prop Equations''
<<<
$$a^{<t>} = g(W_{aa}a^{<t-1>} + W_{ax}x^{<t>} + b_a)$$
$$y^{<t>} = g(W_{ya}a^{<t>} + b_y)$$
<<<
''Simplified notation''
<<<
$$a^{<t>} = g(W_{a}[a^{<t-1>} ,x^{<t>}] + b_a)$$
$$y^{<t>} = g(W_{ya}a^{<t>} + b_y)$$
where $$W_a = [W_{aa} : W_{ax}] \leftarrow $$ parameter matrices stacked horizontally.
: If $$W_{aa} \rightarrow (100, 100)$$
: and $$W_{ax} \rightarrow (100, 10000)$$
: then, $$W_a \rightarrow (100,10100) $$
whereas, $$[a^{<t-1>} ,x^{<t>}] $$ are stacked on top $$\begin{bmatrix} a^{<t-1>} \\ x^{<t>} \end{bmatrix}^{10100 \times 100}$$
So, when $$W_{a}[a^{<t-1>} ,x^{<t>}] \rightarrow [W_{aa} W_{ax}]\begin{bmatrix} a^{<t-1>} \\ x^{<t>} \end{bmatrix}$$ which gives quantity inside g for the first equation (final Forward Prop Equations)
<<<
This simplifies notation by allowing us to denote two parameter matrices as one matrix
,,Tags: [[COURSE5: Sequence Models]] | [[19 August 2021]],,
Having a single evaluation metric can help us quickly identify whether we are performing better or worse than the last idea.
<img src='https://3.bp.blogspot.com/-yuuiK-ysDX8/XJTHY4TDE2I/AAAAAAAAZf8/8hgBnVYWQ_0iY8VcaLBK0qsXCTmB0wGmACLcBGAs/s1600/ML%2Bideas%2Bcycle-min.png' width=300>
<table>
<thead><tr><th>Classifier</th><th>Precision </th><th>Recall</th><th>F1 Score</th></tr></thead><tbody>
<tr><td> </td><td>What % of examples identified by the classifier as 1 are true</td><td>What % of actual cats were identified by the classifier</td><td></td></tr>
<tr><td>A</td><td>95%</td><td>90%</td><td>92.40%</td></tr>
<tr><td>B</td><td>98%</td><td>85%</td><td>91.00%</td></tr>
</tbody></table>
In case of using two metrics, [[Precision & Recall]] and [[Recall]], it is difficult to identify which classifier performance better than the other based on the tradeoff. [[F1 Score]] (Harmonic mean of Precision and Recall) is a better metric to evaluate performance of A and B, because it summarizes the performance into a single metric. Here, classifier A is better than B, because [[F1 Score]] is higher
''having a well defined dev/validation set and a single number evaluation metric helps iterate faster through the loop of idea $$\rightarrow$$ code $$\rightarrow$$ experiment''
In case, the performance is being measured at various segments, then there should be a number that average the performance of all segments, and use that to evaluate the classifier
<style>.red{color:red;} .green{color:green;}</style>
<table>
<thead><tr class="tableizer-firstrow"><th>Algorithm</th><th>US</th><th>China</th><th>India</th><th>Other</th><th>Average</th></tr></thead><tbody>
<tr><td>A</td><td>3%</td><td>7%</td><td>5%</td><td>9%</td><td>''6.00%''</td></tr>
<tr><td>B</td><td>5%</td><td>6%</td><td>5%</td><td>10%</td><td>''6.50%''</td></tr>
<tr><td>C</td><td>.</td><td>.</td><td>.</td><td>.</td><td class='red'>''3.50%''</td></tr>
<tr><td>D</td><td>.</td><td>.</td><td>.</td><td>.</td><td>''5.25%''</td></tr>
<tr><td>E</td><td>.</td><td>.</td><td>.</td><td>.</td><td>''3.75%''</td></tr>
<tr><td>F</td><td>.</td><td>.</td><td>.</td><td>.</td><td class='green'>''9.50%''</td></tr>
</tbody></table>
Assuming average performance is a reasonable single number evaluation metric, F is the best performing model and C is the worst.
,,Tags : [[COURSE3: Structuring Machine Learning Projects]]|[[13 May 2021]],,
!Why is deep learning taking off now?
If the basics of [[Deep Learning]] existed for decades, why is deep learning taking off now? Some of the drivers of [[Deep Learning]] are:
<img src='https://lh3.googleusercontent.com/He1kSMBJCTpyJtxEaTOfBH7c-wvV3HFUPoGDJhR-Zvo-pqdH_vlD_wGu9KvqP-vmKjzje2-5c6iszijhgFitMpFboQsJwuMcnavRBUqjuAuyzpb014XP7KRilYsXk60VBkBT3E1NjvEMwCWDz2R_4WoUNkvujsctGqwnGcChhBA5_Tu9ryZWkC-uWMlVUz9zlVUh7ORB8Dcmc-qZeeBUpr1dAJWPWs-NG03Z4XUXrfwIJrYSEVKX4zfC9PFj4zYwShf_pfMxUq2Rk7SWUJHA2iXG85Q1IwGYqXGLeKB3sf6w7TakJctujyLdfs4kAsyourT4a7QWmczlxdUNyRhg4LI4wvripD-XXDvlyVi0GXmP_eUocjG9RH4yQi9XT3ITlMeR8YGzWQc87fBu2DE57roW9Butdb2SrmXvN_sFSJWIa48zkOXWl8zw_wmWWfP90q4aqef1dRreE_R0YxGOR9q1JevHuWI3L2TkajHLHy3PjmIfh2Kkz-FtC_xVtcFWENkqfxsSV1yqaMfgeCv3C5p_kUMO5ttOqrVsB75FFd5ViS_yN5o3O7jZ1NYFP_Tlr1b5Y--hTyjoGR5VSQR7yUqsks8KQZIUkPki2cD3_dcE9T_8AjJqeZYlmOjH-Z8hePnC8a0fGW6UpJyjZRH9aHdveV-SYsBODjc1RtIPRS-in3XJ3L0xFX57fT8xyVWGPNmcEfmA_qKjfl9t3TUBVu2fvQ=w784-h512-no?authuser=0' width=700>
* Over the last 20 years we have collected more data
* Traditional ML algorithm performance plateaus when provided with more data
Scale has been driving deep learning progress. scale includes both size of [[Deep Neural Networks]] and size of data available. Also algorthimic innovation, where changing from [[Sigmoid]] to [[Rectified Linear Unit (ReLU)]] activation makes the [[Gradient Descent]] process run much faster, and thus increasing training speed. This allows us to train larger neural networks in reasonable amount of time.
In small data realm
* Ordering of algorithms is not very well defined, an SVM with well engineered features by hand can perform better than DNNs
In [[Big Data]] realm
* Large NNs consistently dominate other approaches
[[COURSE1: Neural Networks & Deep Learning]]
<img src='https://x-wei.github.io/images/Ng_DLMooc_c5wk1/pasted_image012.png' width=700>
!! Loss Function
$$\mathscr{L}(\hat{y}^{<t>}, y^{<t>}) = - y^{<t>} \log \hat{y}^{<t>} - (1-y)\log (1 - \hat{y}^{<t>})$$
Loss for one element is the logistic loss, and for full dataset the loss is
$$\mathscr{L}(\hat{y}, y) = \sum_{t=1}^{T_y} \mathscr{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})$$
The red arrows in the image are for [[Backpropagation]]. These are automatically computed in the framework where the algorithm is being implemented. For [[RNN]]s, this is called [[Backpropagation]] through time.
,,Tags:[[COURSE5: Sequence Models]] | [[19 August 2021]],,
! Interview with [[Geoffrey Hinton]]
<img src='https://sigir.org/sigir2020/assets/img/keynotes/geoffrey-hinton.jpg' width=250>
* Godfather of deep learning - by [[Andrew Ng]]
* Started exploring [[Neural Network]]s in [[Britain]] but were regarded as silly, when he moved to [[California]] people were open minded
* Inspired by the physiology and how the brain works
* [[Backpropagation]]
* Significant work on [[Boltzmann Machines]]
** Meant to learn hidden representations
** Simple [[Algorithm]]
** Each neuron only needed to know the info coming from other two neutrons it was connected to
* [[Restricted Boltzmann Machines]]
* [[Capsules]]
** NN representation of [[Hidden Layer]] instead of doing whatever they want to do, represent those NN by partitioning them with a specific function or objective called Capsule. A capsule represents various attributes of only one entity
** During face detection, the parts of NN can be segmented to capsule for mouth, capsule for nose
** The two capsules will vote if they both agree to be put together in the dimensional space
** Capsules can help NN generalise better
* [[Wegstein Algorithm]]
* Also developed [[RMSProp]]
!! Advice for anyone who wants to enter deep learning
* Read literature but not too much of it
** Notice something that everybody is doing wrong and figure out how to do it right
* Never stop programming
* Read enough to star developing intuitions and then trust your intuition
* Grad Students
** Pick an advisor with the same beliefs as yours
!! Company vs Research University
** Companies are doing much better because computer science departments are designed around programming computers and not showing them. This lag is temporary
** [[Google]] has brain residence to train people about deep learning
[[COURSE1: Neural Networks & Deep Learning]]
!Padding
$$n \times n * f \times f = (n-f+1)\times(n-f+1)$$
If an $$n \times n$$ image convolves with $$f \times f$$ filter there are two downsides
* Images shrink with every [[Convolution]] operation
* The pixels at the edges are given less importance than at the center when computing output values during the convolution operation. So, a lot of information from the edges might be thrown off
[[Padding]] fixes these two downsides. Padding applies border to all around the edges, such that when $$ 6\times6$$ image padded with 1 pixel becomes $$8\times8$$ when convolved with $$3\times3$$ filter gives $$6\times6$$ as output which is the same size as input. ''Zero'' is the default padding value for the border.
More formally, the output dimension can be formulated as
$$ = (n+2p-f+1) \times (n+2p-f+1)$$
!! Valid and Same Convolutions
In terms of how much to pad, there are two common choices
* [[Valid Convolution]] - Means no padding
* [[Same Convolution]] - output size = input size
** $$n + 2p - f + 1= n$$ .i.e, for same convolution, padding can be computed as $$p = \frac{f-1}{2}$$
** for $$f = 3 \rightarrow p = 1$$
** for $$f = 5 \rightarrow p = 2$$
By convention, ''$$f$$ is usually odd''. It can be an even number when you need asymmetric padding. Odd filters have a central pixel to talk about. This is not a good reason to NOT use even number filters
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[23 June 2021]],,
![[Regularization]]
If training data is overfit and the model does not generalize between train and dev then, it is a ''high variance problem'', so, need to use ''regularization''.
For example, in [[Logistic Regression]], the [[L2 regularization]]
$$w \in \mathbb{R}; b \in \mathbb{R}$$
$$ \mathcal{J}(w,b) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(\hat{y^{(i)}}, y^{(i)}) + \frac{\lambda}{2m} ||w||_2^2$$
where
* $$\lambda$$ is the regularization parameter
* norm of w squared = $$||w||_2^2 = \sum_{j=1}^{n_x}w_j^2 = w^T.w$$
''Why is the bias term not added?''
: This is usually omitted because all parameters are part of $$W$$ and $$b$$ is just a single number. So, regularizing it won't make much of a difference.
!! [[L1 Regularization]]
* $$\frac{\lambda}{2m}||w||_1$$
* L1 Norm of w is used
* If you use L1 regularization, $$w$$ will end up being sparse. This means that $$\vec{w}$$ will have a lot of zeros. Some people argue in favor of this, as this helps compressing the model, also you need less memory to store the mode. Although, it makes little difference
* It is not that widely used. ''L2 Reg is used much more often''
* $$\lambda$$ is one other hyperparameter to tune
!! Neural Network Regularization
$$
J(w^{[1]}, b^{[1]}, w^{[2]}, b^{[2]}, ...) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(\hat{y^{(i)}}, y^{(i)}) + \frac{\lambda}{2m} \sum_{i=1}^L ||w^{[l]}||_F^2$$
where, [[Frobenius Norm]] of $$w$$ is computed as
$$
||w^{[l]}||_F^2 = \sum_{i=1}^{n^l} \sum_{j=1}^{n^{l-1}} (w_{i,j}^{[l]})^2$$
!! Weight Decay
<<<
$$dw^{[l]} = (backprop) + \frac{\lambda}{m}w^{[l]}$$
$$w^{[l]} := w^{[l]} - \alpha dw^{[l]}$$
$$w^{[l]} := w^{[l]} - \alpha \Big[(backprop) + \frac{\lambda}{m}w^{[l]}\Big]$$
$$w^{[l]} := w^{[l]} - \alpha\frac{\lambda}{m}w^{[l]} - \alpha (backprop) $$
$$w^{[l]} := (1 - \alpha\frac{\lambda}{m})w^{[l]} - \alpha (backprop) $$
where,
$$backprop = \frac{1}{m} dz^{[l]} a^{[l-1]T} $$
and, $$(1 - \alpha\frac{\lambda}{m})$$ is a quantity < 1. Also called [[Weight Decay]]
<<<
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]| [[15 June 2021]],,
When it is difficult to have a combined single real number evaluation metric, it is useful to setup ''satisficing'' as well as ''optimizing'' metrics.
For example, in the table below, if we want a model that runs in < 100 ms and has good performance, we can set up the metrics as,
* Run time - satisficing metric
* Accuracy - optimizing metric
<table >
<thead><tr ><th>Classifier</th><th>Accuracy</th><th>Run Time</th></tr></thead><tbody>
<tr><td>A</td><td>90%</td><td>80 ms</td></tr>
<tr><td>B</td><td>92%</td><td>95 ms</td></tr>
<tr><td>C</td><td>95%</td><td>1500 ms</td></tr>
</tbody></table>
Typically, ''if there are N metrics, then N-1 metrics should be satisficing metrics and 1 should be the optimizing metric''
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[13 May 2021]],,
!! 1. One-to-one
<<<
These are generic recurrent neural networks
$$a^{<0>} \rightarrow \begin{matrix} \hat{y}^{<1>}\\ \uparrow \\ \bigodot \\ \uparrow \\ x^{<1>} \end{matrix}$$
<<<
!! 2. One-to-many
<<<
[[Music Generation]]. Previous output is fed as the input for next prediction in sequence
<img src='https://stanford.edu/~shervine/teaching/cs-230/illustrations/rnn-one-to-many-ltr.png?d246c2f0d1e0f43a21a8bd95f579cb3b' width=300>
<<<
!! 3. Many-to-one
<<<
<img src='https://stanford.edu/~shervine/teaching/cs-230/illustrations/rnn-many-to-one-ltr.png?c8a442b3ea9f4cb81f929c089b910c9d' width=310>
can be used for [[Sentiment Classification]] where the input is a review and the output is a single number or binary (good/bad)
<<<
!! Many-to-Many ($$T_x = T_y$$)
<<<
<img src='https://stanford.edu/~shervine/teaching/cs-230/illustrations/rnn-many-to-many-same-ltr.png?2790431b32050b34b80011afead1f232' width=300>
[[Named Entity Recognition]]
<<<
!! Many-to-Many ($$T_x \neq T_y$$)
<<<
[[Machine Translation]]
<img src='https://stanford.edu/~shervine/teaching/cs-230/illustrations/rnn-many-to-many-different-ltr.png?8ca8bafd1eeac4e8c961d9293858407b' width=350>
<<<
,,Tags: [[COURSE5: Sequence Models]] | [[19 August 2021]],,
!Strided Convolutions
* Another piece of basic building block used in [[CNN]]s
* controls the shift of filter on the image
For an $$n\times n$$ image using $$f\timesf$$ filter with a padding pf $$p$$ and stride of $$s$$, the output size of the image can be formulated as
$$ = \bigg\lfloor\frac{n+2p-f}{s} + 1\bigg\rfloor \times \bigg\lfloor\frac{n+2p-f}{s} + 1\bigg\rfloor
$$
where $$\lfloor z \rfloor$$ = floor(z) = rounding down to nearest integer
For example, $$s = 2; n=7, f = 3, p=1$$ the output size should be $$4\times4$$
!! Summary of Convolutions
* Image dimensions = $$n \times n$$
* Filter dimensions = $$f \times f$$
* Padding = $$p$$
* Stride = $$s$$
* Output size = $$\bigg\lfloor\frac{n+2p-f}{s} + 1\bigg\rfloor \times \bigg\lfloor\frac{n+2p-f}{s} + 1\bigg\rfloor$$
!! Technical Note on cross-correlations and Convolutions
[[Convolution]] operations in math textbooks (or [[Signal Processing]] also involves flipping of $$f\times f$$ filter horizontally and vertically before applying it to the image for convolving.
$$
\begin{bmatrix} 3&4&5\\1&0&2\\-1&9&7 \end{bmatrix} \rightarrow flipped \ horizontally \ and \ vertically \rightarrow \begin{bmatrix} 7&9&-1\\2&0&1\\5&4&3 \end{bmatrix}
$$
Applying convolution operation without applying horizontal and vertical flipping is called [[Cross-Correlation]], but most of the [[Machine Learning]]/[[Deep Learning]] literature ignores this detail and it is not applied
In mathematics, flipping the convolution enjoys the associativity property $$(A*B)*C = A*(B*C)$$. This is nice for some signal processing applications but this really does not matter for deep learning. So omitting this step simplifies the code and make the NN work just fine as well.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[23 June 2021]]
,,
!! Train/Test/Dev(validation) dataset
* Training and dev (validation) datasets can have a huge impact on how rapidly you and your team can make progress on building [[Machine Learning]] applications. Set up these datasets to maximize efficiency
* ''Dev (Validation) set and Test should come from the same distributions''
* Dev and Train set should be randomly shuffled
''Guideline -'' choose a dev set and test set to reflect data you expect to get in the future and consider important to do well on
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[13 May 2021]],,
<img src='https://lh3.googleusercontent.com/6hU_234LvXr0iUETtuoM9NqTYLyz0huoNPmQLDjU_roiYQ7ujX1w55VpXfVGUzWHp0ySuGaWhzW_AIalSAHKwI11p_SMAVqDDZ5onUJDIT53qixtnlWq9kWxZU5piBJvW3P1HQyReBpQiAHnBvaj24DZ_vX5LqGcDGfVkUMsZ74lnNwxJRCKQ0RwXB6F2bHIMk1LVGJBgekjTyPAUvljD8IIEKSH2oeNPcrPdZ2A1VsEDJ-rxc5h_Ot-SQjKHcPszgaHS_nYKKwalNX_Wd3xzeUMcLgFYmwZ7YuPzI-svzkuPZFJyxkh5g67AWnQLrQwl6mifnVhDZpt2xbp0AQH22BGdfjZrqLF64YtuAazS1SyVFWO_IyoikPwJ64xFdxBVZdK3lPp2AYCOYxJbIxCQv6aldme432AE2cHz-I3oEj4pqKxnmTzM1rP9AW64hlXOgH00Vj6NfJ4M45zzh1NG2c7YQ03tfoqhYkjlMnAuj-uzItvahLbhApqqQm528EQd920U4SWdvxKKaVIoAULBM_p9fyrUdKeBUM-FIBSeHOixoirMXdCgASkewgnpa3W1JB6Z9GsvcRWLBikzxJ1gHlL2yds5W2KKfAIO0jCyEh5cUNFfGsYyUtlIi_VGCBSGTkkPBZRPpo0vJGqP5MZpV-51XCshI5RRysjyr2hhC8bwijFSaWj43o5_eVAqmizK2QvJ_Y1L_Fs3UUzHKK553-XMw=w1571-h563-no?authuser=0' width=800>
If $$\lambda$$ is big $$\rightarrow w \approx 0$$. This means, that zeroing out the weights for various nodes, zeroes out the impact of hidden units, which makes the [[Neural Network]] simpler and smaller. This tries to move the model from the 'high [[Variance]]'/ [[Overfitting]] case on the right to 'high [[Bias]]' case.
So there exists some intermediate value of lambda which can help us find the 'just right' case.
For example, [[tanh]] function
<img src='https://lh3.googleusercontent.com/EZcKaTy8Qcxqpm-PLliiAMPcJ2Bsz3hQejJvTHX9L6xJzyjuQfngkfhx2z60OKZkTyJ491CxpwUBx5mGseV_PxOjjGDZH6sPicSWJzhZ2P67sjGx5058s2QcTXhrylUkdt5HYCQJUHCiXkEaqb0eU_u2dMiOcO2Tah8wUfSzGKNj_-B74Y7dILt5hsckR5T4hzT5SMC9sF4YnAIEzTl5iRxhYUNf9r3yfrVDmCqX91G2BEGpdcs8hk5Fp3qMXt9Zd5CAva9KUEs_Gt54fhBNR-UREstb0cHZ1SPuCBRJcr7AkI7oLliMIKLjJ3a-fMOlQXsLR_bh7Vk2x5buL1G-vmGkbrSaye2u82PMHP_nomNY_gbEJT_SH-jwTn12MeQkym5B3gOpJje75HriHtZRSRGk-mIofT-b-H2dJFL800cdwAhByILPA6qMSvdHhivlR03h9epPadfUGPGRPzBGPLiDRBs4VMvEFDrPrkD9bVp227yCEaJb8LZiIjoe5-JLz9dcpG_VSrHAX9QS7cbUa0bntTn1Hw7rOQGuKbrpjCLNg4AMhA6tv1_mPAWnzjEUHRW7Bm-yNI2Ft5jBIwe2g0egl_EIi1FrGLQTzXq5A2Wt0ZenH-3AYxWYf5cLYItuG1Zq1b5s9V4h1DELmVpfWqS4JG9YgbGtQzZge1h5BwE-lZM1fSMIMDlxpK51GGGX8IazZgvjHXYvL-6eKyautODxjA=w827-h711-no?authuser=0' width=400>
if $$\lambda$$ is large $$w \rightarrow \approx 0$$ which means $$z$$ is also small because $$z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$$, which makes z linear in that range. ''So every layer behaves like a linear layer and prevents overfitting. This results in function learned being simpler and less non-linear''
!! Implementation Tip
Plot the cost function w.r.t. number of iterations
in gradient descent.
$$ \mathcal{J}(w,b) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(\hat{y^{(i)}}, y^{(i)}) + \frac{\lambda}{2m} \sum_l ||w^{[l]}||_F^2$$
<img src='https://i.stack.imgur.com/JLme4.png'>
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[15 June 2021]],,
!Convolutions Over Volume
Applying [[Convolution]] for 3D Inputs - detecting features in color images.
<img src='https://i.stack.imgur.com/POQ2J.png' width=500>
* Height - Image = 6, filter = 3
* Width - Image = 6, filter = 3
* Channels - Image = 3, filter = 3
''# channels in the image = # of channels in filter''
<img src='https://i.stack.imgur.com/QZsRB.png' width = 500>
Multiplies 27 numbers to get 1 number for $$4 \times 4$$ output.
To detect edges in the red channel following filter can be used
$$
R = \begin{bmatrix} 1&0&-1\\1&0&-1\\1&0&-1\\ \end{bmatrix}; G = \begin{bmatrix} 0&0&0\\ 0&0&0\\ 0&0&0\\ \end{bmatrix}; B = \begin{bmatrix} 0&0&0\\ 0&0&0\\ 0&0&0\\ \end{bmatrix}
$$
To detect edges irrespective of the color channel
$$
R = \begin{bmatrix} 1&0&-1\\1&0&-1\\1&0&-1\\ \end{bmatrix}; G = \begin{bmatrix} 1&0&-1\\1&0&-1\\1&0&-1\\ \end{bmatrix}; B = \begin{bmatrix} 1&0&-1\\1&0&-1\\1&0&-1\\ \end{bmatrix}
$$
''What if you want to detect multiple features at the same time'' - i.e. detect vertical edges, horizontal edges, edges at angles. You can use multiple filters at the same time and the ''output can be stacked.''
<img src='https://indoml.files.wordpress.com/2018/03/convolution-with-multiple-filters2.png' width=500>
''Summary of Dimensions''
<<<
$$n \times n \times n_c \ * \ f\times f\times f \rightarrow (n-f+1)\times(n-f+1) \times n_c$$
where $$n_c$$ is the number of filters = number of channels in the image
<<<
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[24 June 2021]],,
! Dropout Regularization
% chance that during implementation of training of [[Neural Network]] x% of units from the hidden layer will be dropped out along with their links which results in much simpler network and less prone to [[Overfitting]].
<img src='https://lh3.googleusercontent.com/uiah8Ah2fgAQYw3zg1z_mmEMXfv2H87OtOAHtC4eNz6Dpa41rpf55Tih5WL7G35IMOMrV5Wu9JH5oiDx_xtIontDryXIMIj4i7Ikmk-Df_H3osCRaO4ka0wVYPaVFeUULToQaRPmk-C_pR6msFyKQYSv-IBN95Ppq1QCFCK30B7mtz7iZJoGLKTW89yRRxgDTpZXDmn7LeksMRDulUKxlX-tiPemFLR2IYIlktgzrTWyfvckPl8CJW2otvlsGhZ8nSZIbltmHxt4InHai9iWZmDB7aP5XJyXr8U5N4yVNoBPtsIYWJ36zuW4P6gXZ6DcmZSjR7Nwuf_vZ7Aw0sYxdfrjDNazVzRDQjmiUP09W-oNPJpeULEifK0QNjX7F7_7VvgxcnHMEImI5wUgNw4lNZHHduszyBryw2xmdxhPKzHiDUEWeAGKMMeyVKDnBmpEDF79X9UR46LQ7pbY50cct_iI50oy8Y5kXVgZnfKKgmTMHlH1YN4a0ju8p4LLO-1rsaZf-JmtO-S9GglLZgnnbC_GOQOo1sMdLgKJTEkOB6BhJqAmGBxniw3UswEH-UNEOcxXTtCs7HIl5DIs5wd5Tq7xEpBFyRelY6mCcbtub9K8OVgntMFjuGbc2rrGcbuRs-xGWibttvvd0Ecos45MtttamG6pJxBk3W6AE9YD08ghnjWKvYE3tsPDRVemZ8YPGET_oGq2BBAm4k8A_x_TxfMMKw=w1690-h589-no?authuser=0' width = 800>
!! Implementing : [[Inverted Dropout]]
''keep_prob = 0.8'' - means 20% chance of dropping out or being (0) & 80% chance of being True (1)
```python
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3,d3)
a3/= keep_prob # scaling operation
```
The ''scaling operation'' is used to correct the expected values that decreased due to dropout.
<<<
$$ z^{[4]} = w^{[4]}a^{[3]} + b^{[4]}$$
$$a^{[3]}$$ - reduced by 20% due to dropout
$$a^{[3]}/=0.8$$ - bumps up the expected values
<<<
[[Inverted Dropout]] is by far the most oftenly used dropout technique. For different passes of training examples, you zero out different hidden units. ''If multiple passes to the same training set, then on multiple passes, you should randomly zero out different hidden units.''
!!Making predictions at test time
* Won't use dropout while making predictions
* If not using dropout, does not require us to use the scaling operation
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[16 June 2021]],,
[[Language Modelling]] is one of the basic and most important task in [[Natural Language Processing (NLP)]]. It is also the one where [[Recurrent Neural Network]]s do very well
!! What is [[Language Modelling]]
Given any sentence, what is the probability of that particular sentence
* A: P(The apple and pair salad) = $$3.2 \times 10^{-3}$$
* B: P(The apple and pear salad) = $$5.7 \times 10^{-10}$$
A good language model will be able to give a higher probability to B than A. The same thing can be rewritten as
$$P(y^{<1>}, y^{<2>},...,y^{<T_y>}) = ?$$
For a language model, it will be useful to represent these sentences as outputs y instead of x
!! How do you build a language model?
''Training set'': would contain large corpus of english text. given a sentence in training set, first step is to [[Tokenize]] , by creating a vocabulary and mapping each word to the indices in the vocab, transforming sequences of text to sequences of numbers
* One useful thing, is to model when sentence end with an extra `<EOS>`token
* Out of vocabulary words can be tokenized as `<UNK>`
''Build RNN'': Next, build an [[RNN]] model to predict the chance of these different sequences. IN this cases you end up setting inputs $$x^{<t>}$$ as $$\hat{y}^{<t-1>}$$. i.e. output of last prediction.
$$
a^{<0>} \longrightarrow
\begin{matrix}
\hat{y}^{<1>}\\
\uparrow \\ \bigodot \\ \uparrow \\
x^{<1>} = \vec{0}
\end{matrix} \longrightarrow
\begin{matrix}
\hat{y}^{<2>}\\
\uparrow \\ \bigodot \\ \uparrow \\
x^{<2>} = \hat{y}^{<1>}
\end{matrix} \longrightarrow
\begin{matrix}
\hat{y}^{<3>}\\
\uparrow \\ \bigodot \\ \uparrow \\
x^{<3>} = \hat{y}^{<2>}
\end{matrix}
$$
In a sentence, //Cats average 15 hours of sleep a day `<EOS>`//, the predictions of the next word can be described as
* $$\hat{y}^{<1>}$$ = P('cats')
* $$\hat{y}^{<2>}$$ = P('average'| 'cats')
* $$\hat{y}^{<3>}$$ = P('15' | 'cats average')
''[[Loss Function]]'' - [[Softmax]]
$$\mathscr{L}(\hat{y}^{<t>}, y^{<t>}) = - \sum_i y_i^{<t>}\log\hat{y}_i^{<t>}$$
''Overall Loss'' - cumulative loss across all time steps
$$\mathscr{L}(\hat{y}, y) = \sum_{t=1}^{T_y} \mathscr{L}^{<t>}(\hat{y}^{<t>}, y^{<t>})$$
''Predictions'' - are multiplicative
$$P(y^{<1>}y^{<2>}y^{<3>}) = P(y^{<1>})P(y^{<2>}|y^{<1>})P(y^{<3>}|y^{<1>}y^{<2>})$$
,,Tags: [[COURSE5: Sequence Models]] | [[19 August 2021]],,
In [[Machine Learning]], typical train, test and dev split could have been as follows
<table>
<thead><tr class="tableizer-firstrow"><th>Train</th><th>Test</th><th>Dev</th></tr></thead><tbody>
<tr><td>60%</td><td>20%</td><td>20%</td></tr>
<tr><td>70%</td><td>30%</td><td></td></tr>
</tbody></table>
In the era of [[Deep Learning]], with the availability of much larger datasets (eg. 1,000,000 observations), it is quire reasonable to choose split as
<table >
<thead><tr><th>Train</th><th>Test</th><th>Dev</th></tr></thead><tbody>
<tr><td>98%</td><td>1%</td><td>1%</td></tr>
</tbody></table>
Then 1% test set would mean, 10,000 observations which is good enough for test data
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[13 May 2021]],,
!One Layer of [[CNN]]
<img src='http://media5.datahacker.rs/2018/11/new_NN_CNN_1_1.png' width=700>
where
<<<
$$z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$$
$$a^{[l]} = g^{[l]}(z^{[l]})$$
<<<
''Let's suppose you have 10 filters that are $$3\times 3 \times 3$$ in one layer of [[Neural Network]], how many parameters does this layer have?'' $$= (3 \times 3 \times 3 + 1) \times 10 = 280$$. This means that irrespective of the size of the image the number of parameters are fixed at 280. ''This makes CNN less prone to [[Overfitting]]''.
!! Summary of Notation
For describing one layer of [[CNN]] - $$l$$
<<<
$$f^{[l]}$$ - filter size for layer $$l$$
$$p^{[l]}$$ - padding for layer $$l$$
$$s^{[l]}$$ - stride for layer $$l$$
$$n_c^{[l]}$$ - number of filters $$l$$
Input - $$n_H^{[l-1]} \times n_W^{[l-1]} \times n_c^{[l-1]}$$
Output - $$n_H^{[l]} \times n_W^{[l]} \times n_c^{[l]}$$
$$n_H^{[l]} = \bigg[ \frac{n_H^{[l-1]} + 2p^{[l]} - f^{[l]}}{s^{[l]}} + 1 \bigg]$$
$$n_W^{[l]} = \bigg[ \frac{n_W^{[l-1]} + 2p^{[l]} - f^{[l]}}{s^{[l]}} + 1 \bigg]$$
Filter = $$f^{[l]} \times f^{[l]} \times n_C^{[l-1]}$$
Activations = $$a^{[l]} \rightarrow n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]}$$
Weights = $$f^{[l]} \times f^{[l]} \times n_C^{[l]} \times n_C^{[l]}$$
Bias = $$n_C^{[l]} = (1,1,1,n_C^{[l]})$$
<<<
For [[Batch Gradient Descent]] with $$m $$ training examples
$$A^{[l]} = m \times n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]}$$
''Note: the ordering of m''
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[24 June 2021]],,
After training an [[RNN]], one of the ways to get a sense of what your model has learnt, is to sample some novel sequences
!! Sampling
Sample the first word using [[Softmax]] probabilities over possible outputs
$$
a^{\langle 0\rangle} \longrightarrow
\begin{matrix}
\hat{y}^{\langle 1 \rangle}\\
\uparrow \\ \bigodot \\ \uparrow \\
x^{\langle 1 \rangle} = \vec{0}
\end{matrix} \longrightarrow
\begin{matrix}
\hat{y}^{\langle 2 \rangle}\\
\uparrow \\ \bigodot \\ \uparrow \\
x^{\langle 2 \rangle} = \hat{y}^{\langle 1 \rangle}
\end{matrix}
$$
Randomly sample acccorinding to softmax distribution from $$\hat{y}^{\langle 1 \rangle} $$ where $$\hat{y}^{\langle 1 \rangle} $$
* $$\vec{V} = \begin{bmatrix} P(a) & ... &P(aaron) & ... & P(Zulu) & P(UNK) & P(EOS) \end{bmatrix}$$
* `np.random.choice(`$$\vec{V}$$`)`
Next, sample from the second word using the first words as input. You can choose to sample till
* number of desired tokens e.g. 20 or 100
* `<EOS>` is the output
!! Character level language Modelling
Instead of using words, your application may call for using the chracters, where the vocabulary is reduces to just the alphabets, space, punctuations, 0 - 9 digits, and may be upper case alphabets A-Z.
This outputs the characters in the sequence
* ''Pros'': does not have to worry about unknown word
* ''Cons'': you end up with large sequences. They are not as good as word level language models which capture long range dependencies from earlier and later part of sentences.
: training character level model is quite computationally expensive
!! Trends
In [[Natural Language Processing], word level [[Language Modelling]] is in use. As the computers are getting faster, character level modelling is being explored.
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! Understanding Dropout
''Intuition 1''
* Smaller network helps in [[Regularization]] and decrease complexity
''Intuition 2''
* Can't rely on any one feature, so have to spread out weights.
''Intuition 3''
* For a unit receiving inputs from multiple hidden units, will not rely on any one unit while using [[Dropout]]. They would randomly get eliminated so the weights would get distributed - shrinking the squared norm of weights.
!!Implementation Tip
* It would be feasible to have different dropout for different layers, so you can keep the ''keep_prob'' lower for layers with larger number of hidden units (meaning high dropout) and higher keep_prob for layers with less hidden units (meaning low dropout).
* ''larger layers are more prone to [[Overfitting]]''
* can also apply dropout to input layer, but it would most likely be with the ''keep_prob $$\approx 1$$''
* Dropout is very frequently used in [[Computer Vision]], as many of the successful implementation of dropout were in [[Computer Vision]]. Some researches would almost always use dropout.
* Dropout is a [[Regularization]] technique that prevent s [[Overfitting]] unless the algo is overfitting. Don't bother to use dropout.
* ''Downside'' - Cost function $$J$$$ is no longer well defined. So it is hard to compute and visualize it going down for every iteration. So, ''plot without dropout (make sure the code is working fine)$$\rightarrow$$ implement dropout $$\rightarrow$$ plot with dropout''
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[16 June 2021]],,
Setting up dev set and real number evaluation metric sets up the target for the team. If partway through the project, you realize that you put a wrong target, in that case, you should move your target.
Metric: Classification error - classifies the cat images correctly
<table >
<thead><tr class="tableizer-firstrow"><th>Algorithm</th><th>Classification Error</th><th>Additional features</th><th>Comments</th></tr></thead><tbody>
<tr><td>A</td><td>3%</td><td>Classifies image with some porn images</td><td>Good according to metric</td></tr>
<tr><td>B</td><td>5%</td><td>Removes porn images</td><td>Good according to you and users</td></tr>
</tbody></table>
If evaluation metric is not correctly rank ordering preferences between algorithms, it is a sign that you should change the evaluation metric and perhaps the dev/test sets
$$
\displaystyle{ Error = \frac{1}{m_{dev}} \sum_{i=1}^{m_{dev}} w^{(i)} \mathcal{I}\{ y_{prod}^{\{i\}} \neq y^{(i)} \} }
$$
where $$\mathcal{I}$$ counts the number of misclassified examples and the weight $$w^{(i)}$$ is defined as
$$
w^{(i)} = \begin{Bmatrix}
1, x^{(i)} \neq porn \\ 100, x^{(i)} = porn
\end{Bmatrix}
$$
Applying these weights, will increase the error term if the algorithm makes a mistake.
!! Orthogonalization for cat pictures
# place the target - define a metric to evaluate the classifier
# Aim shoot - worry separately about doing well on this metric
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[13 May 2021]],,
[[Bayes Error]] is the best possible mapping available to surpass human level performance
<img src ='http://www.thinkingondata.com/wp-content/uploads/2018/12/Screen-Shot-2018-12-21-at-9.56.42-PM.png' width = 400>
Generally, progress is quite rapid until you surpass human level performance, then the growth slows down.
So long as the [[Machine Learning]] algorithm is worse than human level performance, you can
* get labelled data from humans
* gain insight from manual error analysis. Why did a person get this right?
* Better analysis of [[Bias]] and [[Variance]]
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[13 May 2021]],,
!Other Regularization Methods
!! [[Data Augmentation]]
For [[Computer Vision]], data augmentation is an inexpensive may to give the [[Algorithm]] more data and perform [[Regularization]]
* flip image horizontally
:<img src='https://learnopencv.com/wp-content/uploads/2018/05/AlexNet-Data-Augmentation-Mirror-Image.jpg' width=400>
* random crops for image
:<img src='https://lh4.googleusercontent.com/LsJ4ckx-M2t-21f-d0gL0UxjvO7EWWuyrktRtwYhQd19naspFYHWF_uoYwYzWqfAkgM-isJpsYmyeVRiOGyyfKBq7X84_PL1qX5bc-dG6Tz4CbF-FIOFXa_562iunhnSWWNJkXGH' width=400>
For [[Optical Character Recognition]]
* Adding random distortions to the text in the training dataset can help algorithm perform better
!! Early Stopping
<img src='https://miro.medium.com/max/973/1*nhmPdWSGh3ziatQKOmVq0Q.png' width=400>
Stop iterations at red line because it gives the best dev set error
''Why does this work?''
<<<
Parameter close to 0 when starting to train. It gradually increases with every iteration until it becomes large and overfits. [[Early Stopping]] stops the training to give mid-sized parameters (w) and so it is similar to [[L2 regularization]], which picks the [[Neural Network]] with a smaller norm for parameters $$w$$ and is [[Overfitting]] less
<<<
''Downside''
<<<
It mixes two orthogonal steps of decreasing the [[Cost Function]] $$J$$ and reducing [[Overfitting]] in one parameter.
It is easier in [[Machine Learning]] to think about optimizing the [[Cost Function]] $$J$$ separately than [[Overfitting]] - which can be tackled separately. With [[Early Stopping]] you are not doing a great job of reducing the [[Cost Function]] $$J$$, and also simultaneously not trying to overfit. This makes set of things to try more complicated to think about.
<<<
''Upside''
<<<
Even though the search space is easier with parameters controlling different objectives, it is computationally expensive, because it requires trying lot of different values. [[Early Stopping]] decreases the number of values to try.
<<<
!! Normalizing Input
<img src='https://images2.programmersought.com/372/02/02d164f328595cad1ecad1b90cc836fc.png' width=600>
''Step 1: Subtract mean''
<<<
$$\mu = \frac{1}{m}\sum_{i=1}^{m} x^{(i)}$$
$$x := x - \mu$$
<<<
''Step 2: Normalize Variance''
<<<
$$\sigma^2 = \frac{1}{m}\sum_{i=1}^{m} x^{(i)} * * \ 2$$
$$ x /= \sigma$$
<<<
use the same mean and variance to normalize the test set
''Why Normalize?''
* Because [[Cost Function]] depends on the scale of input features
* Gradient descent can easily find the minimum when the cost function is more symmetric
* Learning algorithm runs faster
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[16 June 2021]],,
!Simple Convolutional Network Example
!! Deep [[CNN]]
<img src='https://cdn.analyticsvidhya.com/wp-content/uploads/2018/12/Screenshot-from-2018-12-10-12-29-20.png' width = 700>
A lot of work in designing a CNN is selecting [[Hyperparameter]]s like
* total network size
* [[Stride]]
* [[Padding]]
* # of filters
Takeaway is that, as you go deeper in NN, typically you start off with larger images but the size gradually shrinks and the number of channels increase.
!! Types of Layers in [[Convnet]]
# [[Convolution]] layers
# [[Pooling]] layers
# [[Fully Connected]] Layers
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[24 June 2021]],,
A [[RNN]] model requires memorizing long range dependencies to be able to perform better at predicting. For example,
* A : //That ''cat'', ate a lot of, ......., and ''was ''full//
* B : //That ''cats'', ate a lot of, ......., and ''were'' full//
''was'' and ''were'' in sentences A and B are affected by the cat and cats in the earlier part of the sentence. So, the model has to remember whether it saw cat or cats in the earlier part of sentence to give a higher probability to was/were respectively.
but, as we saw in training deep NNs, they suffer with [[Vanishing Gradients]] and [[Exploding Gradients]]. The vanishing gradient is much bigger problem and is also harder to solve
[[Recurrent Neural Network]]s also suffer from [[Exploding Gradients]], which can be easily solved with [[Gradient Clipping]]. i.e. if the gradients become large they show up as `NaN` and by applying gradient clipping, i.e. if the parameters become larger than certain threshold, you can rescale the parameters. [[GRU]]s also allows us to solve vanishing gradients problem in RNN
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
You know how well you want your algorithm to perform on the training set, given you know what the human level performance is. Given the following cases in the table below,
<table >
<thead><tr class="tableizer-firstrow"><th></th><th>Case 1</th><th>Case 2</th></tr></thead><tbody>
<tr><td>Humans</td><td>1%</td><td>7%</td></tr>
<tr><td>Train Error</td><td>8%</td><td>8%</td></tr>
<tr><td>Dev Error</td><td>10%</td><td>10%</td></tr>
</tbody></table>
''Case 1''
* There is a gap of 7% from human level performance to train error, this means that it is not fitting to the training set well
* So, Reduce bias
** by training a bigger [[Neural Network]]
** run [[Gradient Descent]] longer
''Case 2''
* Train error is reasonable, because, the gap between human level performance and train error is 1 %, however, the gap between train and dev set error is 2%, 2x more than the former. You should focus your energy in ''reducing variance''
** Regularization
Human error is a good proxy for Bayes error, at least in [[Computer Vision]]
More generally,
* ''Bayes Error - Train Error = Avoidable Bias''
* ''Train Error - Dev Error = Variance''
,,Tags: [[COURSE3: Structuring Machine Learning Projects]]|[[13 May 2021]],,
[[GRU]] is a modification to RNN hidden layer that makes it much better at capturing long range dependencies, and helps a lot with [[Vanishing Gradients]] problem.
<img src='https://miro.medium.com/max/1400/1*7Sz8CtoJlsCmHyFtvQaQqQ.png' width=400>
!! GRU Unit
<img src='http://media5.datahacker.rs/2020/09/69-1024x646.jpg' width=400>
c = memory cell for capturing long range dependencies
$$c^{\langle t \rangle} = a^{\langle t \rangle}$$
i.e. Memory cell output value is the same as the activation value for that time step. This value would be different for [[LSTM]]s
!!! Equations
At every time step, we consider overwriting the memory cell with value $$\tilde{c}^{\langle t \rangle}$$. In other words, $$\tilde{c}^{\langle t \rangle}$$ is a candidate for replacing $$c^{\langle t \rangle}$$
<<<
$$\tilde{c}^{\langle t \rangle} = \tanh (W_c[c^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_c) $$
$$\Gamma_u = sigmoid (W_u[c^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_u) $$
$$c^{\langle t \rangle} = \Gamma_u * \tilde{c}^{\langle t \rangle} + (1 - \Gamma_u)*c^{\langle t-1 \rangle} $$
<<<
!!! Update Gate
* where $$\Gamma_u \in [0,1]$$ is the ''update gate''.
* In practice, $$\Gamma_u$$ will either be 0 or 1 most of the time. Its job is to know when to update $$c^{\langle t \rangle}$$
* For example, in the sentence
: $$\begin{matrix} \Gamma_u = 0 & 0 & 0 & 0 & 0 & 0 & \Gamma_u = 1 & . \\ The & cat, & which & already & ate, & ..., & was & full \\ c^{\langle t \rangle}= 1 & . & . & . & . & . & c^{\langle t \rangle} = 1 & . \end{matrix} $$
: memorizes that cat is singular till the point it gets update at ''was''
!!! Implementation Detail
* The dimensions of $$c^{\langle t \rangle}, \tilde{c}^{\langle t \rangle}$$ and $$\Gamma_u$$ are same
* '$$*$$' in equation means element wise multiplication
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!Pooling Layers
<img src='https://miro.medium.com/max/847/1*FHPUtGrVP6fRmVHDn3A7Rw.png' width = 400>
''[[Hyperparameter]]s''
* Filter size = 2
* [[Stride]] = 2
''Intuition''
<<<
If $$4 \times 4$$ matrix contains features, large number may be detected for a particular feature. [[Max Pooling]] preserves features seen anywhere in the quadrant. So if a feature detected in top -left quadrant, preserve, else it will anyways be a lower number. This may not be the underlying reason.
People use max-pooling because it has been found in a lot of experiments to work well
<<<
''Interesting Property''
<<<
A set of [[Hyperparameter]]s but there is nothing for [[Gradient Descent]] to learn. It is just a fixed computation, and it does not change anything once $$f$$ is fixed.
<<<
''Computation''
<<<
Max Pooling computation is done independently on each of $$n_C$$ channels
$$4 \times 4 \times n_C \rightarrow \bigg\lfloor\frac{n+2p-f}{s} + 1\bigg\rfloor \times \bigg\lfloor\frac{n+2p-f}{s} + 1\bigg\rfloor \times n_C$$
<<<
''Average Pooling''
<<<
Instead of taking max, we can also take average of each quadrant on which the filter is applied.
''Max Pooling is used much more often than average pooling''. For a very deep CNN, you might use average pooling to collapse the representation for say $$ 7 \times 7 \times 1000$$ to $$ 1 \times 1 \times 1000$$
<<<
!! Summary of Pooling
''Hyperparameters''
* Filter size = $$f$$
* [[Stride]] = $$s$$
* Max or average Pooling
* Padding $$p$$ - very rarely used
* Input = $$n_H \times n_W \times n_C$$
* Output = $$\bigg\lfloor\frac{n_H -f}{s} + 1\bigg\rfloor \times \bigg\lfloor\frac{n_W -f}{s} + 1\bigg\rfloor \times n_C$$
* No parameters to learn from [[Backpropagation]]
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[24 June 2021]],,
!Vanishing/Exploding Gradients
<img src='https://lh3.googleusercontent.com/qtPdsN9KTgFLyGRiWzNDwY1Q_Up4i3yEbhFCrPmdC81KKiHw5xsTEJvQJ8Qip2E-3U5mnWnygBu3HTn59cUc7SPVQsZ45vgszWEvSmmpeZvdQwfc_3uBy7xQxF3srOyuZBzsOe0d5zg_59WcqMOF2aNlswxmG-lbDEfQOj4HRqI2mTR2tYY0p8USvtCP993C-lIBD_gIJJu1547shy7nVovDrWWyX0jgLr6G-3yo0PS0l2Qr-V_2ilRUn3mIZN-VAgsYmWD5bFaAQeghBFKDlAVm8aD59D4DSKYLT6gsg-fbrlBvbcKK4gd2EiG4RzacXF_LF_0hyoHRIvKP_wxmGN_wR8f-yBHNeplWUZ-16hljB7LCRN_zr-Y9qus-pRa0yNTjcPcIbmwVnpRof_UMJ2DLZRTrQyyYJ8joB1Rk0trYKr27DltyjzXSBfcQoVoDRxs5NdYgyKrzKSDEIsWHkGrPKRWhL94zJCsSYMWigtOa_OtHfRLshWpS2jccHKS_ZmijdwOriFTSWT5GoEjLFcF0IX6x94cmnT1wXn5iClzgOFenudMZ35h_bIK1411z4CBevbUL6znSBktDLPUWf3BQ_SXQPz3seGWdw3SZP2FY9k_sH3UMOoWfPBwttsTP0X0shmMukZ_TuJR9m-Ytf1nL6phwGCyfRdUP937xoQ5QgboA2yjQAc5yGyEWGljspI2ZEiP5IvS2pF2sH7NdqiVzlQ=w1725-h480-no?authuser=0' width=700>
Consider the NN shown above with $$L$$ layers and the [[Activation Function]] function being linear function $$g(z) = z$$ and bias $$b^{[l]} = 0$$, then $$\hat{y}$$ will be
$$\hat{y} = w^{[L]}w^{[L-1]}...w^{[3]}w^{[2]}w^{[1]}x$$
''Checking correctness''
<<<
$$z^{[1]} = w^{[1]}x + b^{[1]} = w^{[1]}x$$
$$a^{[1]} = g^{[1]}(z^{[1]}) = z^{[1]} = w^{[1]}x$$
$$z^{[2]} = w^{[2]}a^{[1]} + b^{[2]} = w^{[2]}[w^{[1]}x]$$
$$a^{[2]} = g^{[2]}(z^{[2]}) = z^{[2]} = w^{[2]}w^{[1]}x$$
$$...$$
$$a^{[L]} = g^{[L]}(z^{[L]}) = z^{[L]} = w^{[L]}...w^{[2]}w^{[1]}x$$
<<<
Consider the weight matrices are slightly larger than the identity matrix
$$w^{[l]} = \begin{bmatrix} 1.5 & 0 \\ 0 & 1.5\end{bmatrix}$$
This will lead to $$\hat{y}$$ being
$$\hat{y} = w^{[L]}\begin{bmatrix} 1.5 & 0 \\ 0 & 1.5\end{bmatrix}^{L-1}x = a^{[L]}$$
So the weights will ''explode ''$$1.5^{L-1}x$$ for a very deep [[Neural Network]].
Conversely, if,
$$w^{[l]} = \begin{bmatrix} 0.5 & 0 \\ 0 & 0.5\end{bmatrix}$$, then
$$\hat{y} = w^{[L]}\begin{bmatrix} 0.5 & 0 \\ 0 & 0.5\end{bmatrix}^{L-1}x = a^{[L]}$$
and, the weights will ''vanish ''$$0.5^{L-1}x$$ for a very deep [[Neural Network]].
Thus the derivates computed using these weights will also explode/vanish exponentially. ''This makes the training difficult. This can be partially solved using careful initialization of weights.''
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[16 June 2021]],,
!Full CNN Example
* The following network is inspired by [[LeNet-5]], but not exactly that network.
* [[Pooling]] layers are not counted as layers. CONV1 + POOL1 = LAYER1. Literature sometimes counts these layers as two layers. For simplicity, count only those layers which have parameters/weights associated with them.
<img src='http://media5.datahacker.rs/2018/11/leNet5_2.png' width=700>
* There are a lot of [[Hyperparameter]]s in this network. One common guideline is to not invent your own set of hyperparameters. But to look for what kind of hyperparameters work for others
* As you go deeper in NN, $$n_H, n_W$$ will gradually decrease and # channels will increase gradually.
* Another common pattern is that 1 or more [[Convolution]] layers are followed by [[Pooling]] layers and then in the end have a [[Fully Connected]] layer followed by [[Softmax]] layer.
:$$CONV \rightarrow POOL \rightarrow CONV \rightarrow POOL \rightarrow FC \rightarrow FC \rightarrow SOFTMAX$$
!! [[Activation]] Shape and Size
* [[Convolution]] layers have fewer parameters
* [[Fully Connected]] layers have a lot of parameters
* [[Activation]] size drops gradually as you go deeper in [[Neural Network]]. ''If it drops too quickly then it is not generally good for performance''
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Layer</th><th>Activation Shape</th><th>Activation Size</th><th># parameters</th></tr></thead><tbody>
<tr><td>Input</td><td>32, 32,3</td><td>3072</td><td>0</td></tr>
<tr><td>CONV1 (f=5, s=1)</td><td>28,28,8</td><td>6272</td><td>(5x5x3 + 1)x8 = 608</td></tr>
<tr><td>POOL1</td><td>14,14,8</td><td>1568</td><td>0</td></tr>
<tr><td>CONV2 (f=5, s=1)</td><td>10,10,16</td><td>1600</td><td>(5x5x8 + 1)x16 = 3216</td></tr>
<tr><td>POOL2</td><td>5,5,16</td><td>400</td><td>0</td></tr>
<tr><td>FC3</td><td>120,1</td><td>120</td><td>400x120 + 120 = 48120</td></tr>
<tr><td>FC4</td><td>84,1</td><td>84</td><td>120x84 + 84 = 10164</td></tr>
<tr><td>Softmax</td><td>10,1</td><td>10</td><td>84x10 + 10 = 850</td></tr>
</tbody></table>
[[COURSE4: Convolutional Neural Networks]]
<img src='http://media5.datahacker.rs/2020/09/70-1024x690.jpg' width=500>
* [[LSTM]] allows your to learn long-term dependencies
* More powerful and more general version of [[GRU]]s
** seminal paper, huge impact on sequence modelling
** Research paper is more difficult ones to read
''Memory Cell'' - Candidate
:$$\tilde{c}^{\langle t \rangle} = \tanh (W_c[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_c) $$
''Update Gate''
:$$\Gamma_u = \sigma (W_u[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_u) $$
''Forget Gate''
: $$\Gamma_f = \sigma (W_f[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_f) $$
''Output Gate''
:$$\Gamma_o = \sigma (W_o[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_o) $$
''Update value to memory cell''
:$$c^{\langle t \rangle} = \Gamma_u * \tilde{c}^{\langle t \rangle} + \Gamma_f*c^{\langle t-1 \rangle} $$
: Gives the memory cell the option of keeping the old value $$c^{\langle t-1 \rangle} $$ and add new value $$\tilde{c}^{\langle t \rangle} $$
''Update value to memory cell''
:$$a^{\langle t \rangle} = \Gamma_o * \tanh(c^{\langle t \rangle})$$
If these LSTMs unit are joined parallely, you can see the red line passing all the way through the connected units. This shows that so long as you set the forget and update gate regularly, it is relatively easy for the [[LSTM]] to have some value $$c^{\langle 0 \rangle} $$ and have that passed all the way through to the right where $$c^{\langle 3 \rangle} = c^{\langle 0 \rangle} $$. This is why LSTM as well as [[GRU]]s are good at memorizing certain values for long time
!!! LSTM Variation
* LSTM + ''Peephole connection''
* Here the values for update, forget and output gates are not only dependent on $$a^{\langle t - 1\rangle}$$ & $$ x^{\langle t \rangle}$$ but also on old candidate value $$ c^{\langle t-1 \rangle}$$
!!! Technical Detail
* If $$c^{\langle t \rangle}$$ is 100 dimensional, then 5th element in $$c^{\langle t \rangle}$$ can affect 5th element in all the gates
* There is no consensus on when to use GRU and when to use LSTM
* LSTMs arrived much earlier than GRU. GRU was derives a simplification to LSTMs
* On different problems, different algorithm wins. There is no one technically superior algorithm than the other. use LSTMs are the first default
* Advantage of GRUs is that its is much simpler model and can build network. It is also computationally faster to execute, scales well but LSTM is much more flexible and powerful
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
Consider medical image classification as an example, What should be considered as [[Bayes Error]]?
<table>
<tbody>
<tr><td>Human Error</td><td>3.0%</td></tr>
<tr><td>Typical Doctor Error</td><td>1.0%</td></tr>
<tr><td>Eperienced Doctor Error</td><td>0.7%</td></tr>
<tr><td>Expert team of Doctors error</td><td>0.5%</td></tr>
</tbody></table>
* Use ''0.5%'' as the estimate for [[Bayes Error]]
* Should be clear about the definition to use based on application
* Also note that the [[Bayes Error]] is non-zero
If the difference between human level performance and the train performance is large, the you should focus on ''bias reduction'' techniques. But if your dev performance vs the train performance gap is large then you should focus on ''variance reduction'' techniques.
It gets harder to achieve progress once you approach human level performance.
<table>
<tbody>
<tr><td>Human/Bayes Error</td><td>0.5%</td></tr>
<tr><td>Dev error</td><td>0.7%</td></tr>
<tr><td>Train Error</td><td>0.8%</td></tr>
</tbody></table>
The gap between human level performance and dev set is twice as large as gap between dev and test set performance. This means the bias problem is 2x as large as variance problem. Could have missed this if the estimate of Bayes error was wrong.
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[14 May 2021]],,
!Weight Initialization for Deep Networks
For a single neuron, taking inputs from multiple units
$$a = g(z), z$$ is a function of $$w,x$$
$$z = w_1x_1 +w_2x_2 + ... + w_nx_n + b (=0)$$
when setting $$w$$, ''we ideally want large $$n$$, which leads to smaller $$w_i$$''
setting $$Var(w_i) = 1/n$$
:$$w^{[l]} = $$ np.random.randn(shape)*np.sqrt($$\frac{1}{n^{l-1}}$$)
For ReLU [[Activation Function]]
:$$Var(w_i) = 2/n$$, works better
:Trying to set the weight matrices to $$w_i$$, small enough to not explode or vanish quickly.
For [[tanh]] [[Activation Function]] $$\rightarrow$$ [[Xavier Initialization]]
: ''Xavier Initialization'' = $$tanh \ \sqrt[]{\frac{1}{n^{l-1}}}$$
: ''[[Yoshua Benjio]]'' proposed $$tanh \ \sqrt[]{\frac{2}{n^{l-1} + n^{l}}}$$
[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[16 June 2021]]
[[BiRNN]]s lets you at a point in time, take information from both earlier and later part of the sequence. For example, take below sentences for [[Named Entity Recognition]]
* He said, 'Teddy bears are on sale!'
* He said, 'Teddy Roosevelt was a great President!'
In order to figure out whether Teddy is a name or an object, the information from the first part of the sequence with just two words is not enough. So RNNs need context from later part of the sentence to figure out Teddy stands for a name in the second sequence and stands for object in the first. BiRNNs help with just that
<img src='https://miro.medium.com/max/1400/1*LiEqAdkaXcMa7RADAdJWgQ.png' width=500>
$$\hat{y}^{\langle t \rangle} = g(W_y[\vec{a}^{\langle t \rangle}, \overleftarrow{a}^{\langle t \rangle}] + b_y)$$
In the network, while making predcitions, $$\hat{y}^{\langle 2 \rangle}$$, it can get inputs not only from $$\vec{a}^{\langle 2 \rangle}$$ but also from $$\overleftarrow{a}^{\langle 2 \rangle}$$. Thus this network gets infromation from past $$\vec{a}^{\langle 1 \rangle}$$, present $$x^{\langle 2 \rangle}$$ and future $$\overleftarrow{a}^{\langle 1 \rangle}$$.
This defines an ''acyclic graph''.
Given an input sequence $$x^{\langle 1 \rangle}, ..., x^{\langle 3 \rangle}$$, $$x^{\langle 1 \rangle}$$ is first used to compute $$\vec{a}^{\langle 1 \rangle}$$ and $$x^{\langle 3 \rangle}$$ is first used to compute $$\overleftarrow{a}^{\langle 3 \rangle}$$.
The forward and the backward blocks can either be [[GRU]] or [[LSTM]]. [[BiLSTM]]s are more commonly used and are a reasonable first thing to try
''Disadvantage'': You need to parse the entire sequence to make the prediction.
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! Numerical Approximation of Gradients
$$f(\theta) = \theta^3 \ ; f'(\theta) = 3\theta^2$$
!! 1. Gradient using function
: $$when \ \theta = 1 \rightarrow f(\theta) = 1 \ \rightarrow f'(\theta) = 3 $$
: $$when \ \theta = 1.01\rightarrow f(\theta) = 1.0303 \ \rightarrow f'(\theta) = 3.0603 $$
!! 2. nudging $$\theta$$ by some $$\varepsilon = 0.01$$
:<img src='https://lh3.googleusercontent.com/cdkIF0dcItTYTsbQHxYvP4vvtyvpdXCyyDGcV4VL-vjsxUCuwQMcY0dNCj46uB9U4PxfY3WxwLdac7uiIfQ2oWIOi-7xXsKxXsLdUkU9lQI8oa35tqn9tptlPZCq6eKig0hVPo2Xu2b0CZrE2pJqYm9wOITXzI6IWeeWurjJf5m3rsVwvln2YZ1XthfR7hgKzw3zMHp8Wvuz1jpBT0ypofJbCls8KFhgZtgMY1NbdNvTiP5fwAVAorOfTA3A-bg_hyj2LP_g7TCUnR7KsoktQwTy5uPvoebOY1v-iK2cQdn2byIY3U5XOq9lDrP3NwwPUZ2jbn6J1jzhqop0W8ncOdxC3zA77DFImy3eN9LXRfZrZV7V5S_KKXnbUBVM1BxKC2jXAyodoxOBQfFMDMbYyZ-TIvRfp6OQBcAIB9CM1eP3G6WtIdNQc1XYutO-1uKt_GH5H8DBIXaSK7Ke4opwhXbNcHNYGlg9nn-Nbrp-aAVlx_vIqsZDSArft1nOOiGx73OtiwKkYHko3FVamaTKUle42jOSm8urGEzATw49ESbbLGhXe8KSGeTupgRIuAtxcF2PwHvsVUp6BLLZe6jbSuOEXHF1mbD8pnYKBDDMwPAVWIGH3lpqmhrW1zxZOubzvydGwfon5djUVc61-67lxmzf-TvUa1cT7AcczacwP5s1MJErYPMFs0oKnOkVeJq1HMV8QPzmrr4IscUKy2QF_Nvavg=w1009-h927-no?authuser=0' width=400>
: $$
f'(\theta) =\frac{f(\theta + \varepsilon) - f(\theta)}{(\theta + \varepsilon) - \theta} = \frac{1.01^3 - 1^3}{1.01 - 1} = 3.0301$$
!! 3. nudging $$\theta$$ by some $$\varepsilon = 0.01$$ and $$-0.01$$, then
: <img src='https://lh3.googleusercontent.com/jb1X-IZMpQNDbsXqaiIsiWYsBBDxy-txqZKhs_ozyDJ5NzDUBi2rao4TVhZPOIdQvKrRFHHIfIYGRQA4bhZSxWiOerILi6zCVdDFkIL-U0ggZf1drCX6pXEQAjXAcLN04t93N9Lj_DKexxU6cNNXcylPNBXYP2PbCrlKvPuWJm4RaZISTAdsBnmFPfQqFqQYnQutFTbdyw_QWM2fQBcXN2tNso_mKsl8HEZ8VG6doHoInnuPmb81ok2e5_byQzjNFThUBnHpHrx1_jMwzwOlK8IQZX2LFWaysg6olUigoVgVVBNKLBP5NufbtYQOpE3oOMTmE2V3ZWTsIj0oip_XEXRlzQygunGpP_5DDOalelm4i663uAVv-Oe_W3qBfv46x4wAgcnAem4TXsMKqmAL4yPpGrdMkPFUuOTky90upQkEAtK_aVteIyYz3b15VarBE60piqtmlhCvuVQ4xqdVH_PIy8kfW05uoG0Nw0npxOD8qaV1nxeRoVBDAMkoFXVdVkOMBAfw5kDLhAJ3tJGhfq2PPQAzFKJQUiMRELw2KejyWTmm0YtUpACaUYkDCotKwlgIIV5fDC0cNuVOnTGgA-diFBiW_J0SzhoKmOgehP1-4v_lesIIfNY0KE1OHNkRhtHtDwMcZvDQIHj17U8S2tY89WvBjseAu9ua8p70eacvudDzvZ1XzWqOSDyJG8iBAhlFIy5dyRouFquRA55Aihajow=w997-h937-no?authuser=0' width=400>
: $$
f'(\theta) =\frac{f(\theta + \varepsilon) - f(\theta - \varepsilon)}{(\theta + \varepsilon) - (\theta - \varepsilon)} = \frac{1.01^3 - 0.99^3}{1.01 - 0.99} = 3.0001$$
Method 3 leads to a much better approximation to the gradient computed in method 1.
:Approximation Error between 3 & 2 = Gradient by Method 3 ~ Gradient by Method 2 = 3.0001 ~ 3.0301 = 0.03
# $$f'(\theta) = lim_{\varepsilon\to\ 0} \frac{f(\theta + \varepsilon) - f(\theta - \varepsilon)}{2\varepsilon}$$
#:error in the approximation is of the order $$O(\varepsilon^2)$$
# $$f'(\theta) = lim_{\varepsilon\to\ 0} \frac{f(\theta + \varepsilon) - f(\theta)}{\varepsilon}$$
#:error in the approximation is of the order $$O(\varepsilon)$$
''Hence 1. is better for numerical approximation of gradients than 2.''
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] \ [[16 June 2021]],,
<table>
<thead><tr><th></th><th>Case 1</th><th>Case 2</th></tr></thead><tbody>
<tr><td>Team of Humans</td><td>0.5%</td><td>0.5%</td></tr>
<tr><td>one Human</td><td>1.0%</td><td>1.0%</td></tr>
<tr><td>Train Error</td><td>0.6%</td><td>0.3%</td></tr>
<tr><td>Dev Error</td><td>0.8%</td><td>0.4%</td></tr>
</tbody></table>
If the [[Bayes Error]] estimate is not clear then we cannot rely on human intuition since both train and dev errors are lower than the [[Bayes Error]]. So there is not enough data to conclude there is bias or variance.
''Problems that surpass human level performance''
* [[Online Advertising]]
* Product Recommendation
* Logistics
* Loan Approvals
These are the problems that require large amount of structured data. Human perception problems require even larger data. Humans are very good at natural perception problems
* [[Speech Recognition]]
* [[Image Recognition]]
* Medical Image classification
Surpassing human level performance on these problems is harder
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[14 May 2021]],,
!Why Convolutions?
!! Why Convolutions are so useful when you include then [[CNN]]s?
Two Advantages:
''Parameter Sharing''
<<<
A feature detector (such as vertical edge detector) that's useful for one part of the image is probably useful for other part of the image
<img src='https://dummyimage.com/600x400/000/fff' width=250>
14.5 Million parameters using a [[Fully Connected]] layer whereas only 456 params using the [[Convolution]] layers with 6 filters.
Feature detectors learned in one part of the image can be applied to another part of image hence there is also no need to learn two sets of same features for different locations on the image.
<<<
''Sparsity of Connections''
<<<
In each layer, each output value depends only on a small number of inputs. It allows the [[CNN]] to be less prone to [[Overfitting]].
CNNs are also good at capturing ''transitional variance''. For example, a picture of a cat shifted a few pixels towards the left part of the image is still a cat
<<<
!! Training a CNN
<img src='https://miro.medium.com/max/827/1*nVr88C4Jl6xP02FQZU_ZSA.jpeg' width=700>
* Training Set $$(x^{(1)}, y^{(1)}),...,(x^{(m)}, y^{(m)})$$
* Cost $$J = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(\hat{y}^{(i)}, y^{(i)})$$
* Use [[Gradient Descent]] to optimize parameters to reduce $$J$$
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[25 June 2021]],,
Stacking multiple layers of RNNs together to learn more complex versions of the models allowing to learn complex functions
<img src='https://x-wei.github.io/images/Ng_DLMooc_c5wk1/pasted_image033.png' width=500>
* [[RNN]]s are not built to be too deep. Even 3 layers of [[RNN]]s are very complex and expensive to train on - so won't see too many RNN layers stacked
* These deep blocks can either be [[GRU]]s or [[LSTM]]s
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! Gradient Checking
''For implementation of [[Backpropagation]] correctness''
!!Step 1
is to reshape all parameters $$ W^{[1]}, b^{[1]},..., W^{[L]}, b^{[L]}$$ and concatenate into a giant vector $$\theta$$
!! Step 2
reshape all gradients $$ dW^{[1]}, db^{[1]},..., dW^{[L]}, db^{[L]}$$ into a giant vector $$d\theta$$, which is the same dimension as $$\theta$$
!! Step 3
for each $$i$$ nudge only $$i$$th element by $$\varepsilon$$ and compute:
<<<
$$
d\theta_{apprrox}^{[i]} = \frac{\mathcal{J}(\theta_1, \theta_2,..., \theta_i + \varepsilon,...) - \mathcal{J}(\theta_1, \theta_2,..., \theta_i -\varepsilon,...)}{2\varepsilon} \\ \ \\ d\theta_{apprrox}^{[i]} = \frac{\partial\mathcal{J}}{\partial\theta_i} \\ \ \\ Check \ \frac{||d\theta_{apprrox}^{[i]} - d\theta||_2}{||d\theta_{apprrox}^{[i]}||_2 + ||d\theta||_2} < 10^{-7}$$
<<<
where $$\frac{||d\theta_{apprrox} - d\theta||_2}{||d\theta_{apprrox}||_2 + ||d\theta||_2}$$ is the [[Euclidean Distance]]
If [[Euclidean Distance]]:
<<<
$$< 10^{-7} \rightarrow$$ good implementation
$$< 10^{-5} \rightarrow$$ careful
$$< 10^{-2} \rightarrow$$ bug somewhere; fix it
<<<
''How to fix the bug?''
: Look at the individual components tp see if there is a specific value of $$i$$ where $$d\theta_{approx}$$ is very different from $$d\theta_i$$ and track down the computations
!! Gradient Checking Implementation Notes
* Don't use [[Gradient Checking]] in training, but only to debug
** run only for a few iterations because the computation is very slow
* If [[Algorithm]] fails [[Gradient Checking]], look at the components to try to identify the bug
** if $$d\theta_{approx}^{[i]} \neq d\theta_i$$ and $$db^{[l]} \rightarrow $$ far-off and $$dw^{[l]}$$ is close, bug in computation of $$db$$
* Remember [[Regularization]]
** $$J(w^{[1]}, b^{[1]}, w^{[2]}, b^{[2]}, ...) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(\hat{y^{(i)}}, y^{(i)}) + \frac{\lambda}{2m} \sum_{i=1}^L ||w^{[l]}||_F^2$$
* [[Gradient Checking]] does not work with [[Dropout]]
** because of the randomness in dropout
* Run random initialization, perhaps again after some iterations
** It could be that grad check is working fine for low parameter values $$(w,b)$$, but it may fail for large values. So try doing the grad check after some iterations where w & b are sufficiently large to be evaluated
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[17 June 2021]],,
Two fundamental assumptions of supervised learning
# you can fit the training set well - achieve low unavoidable bias
# Generalized performance on dev set - achieve low variance
To reduce avoidable bias
* Train a bigger model
* Train Longer ( [[Gradient Descent]], [[RMSProp]]
* Explore a new architecture (RNN, CNN)
To reduce variance
* Get more data
* use regularization
* Use a suitable [[Neural Network]] Architecture
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[14 May 2021]],,
!![[Andrej Karpathy]]
<img src='https://avatars.githubusercontent.com/u/241138?v=4' width=250>
* [[Unsupervised learning]] is still not obvious on how it is going to be used
* AI two trajectories
** Applied AI
** [[Artificial General Intelligence]]
* Approaches to [[Artificial General Intelligence]]
** Accomplishing different functions independently and figuring out how to put them together
** Full agent - scaled up supervised learning hypothetical environment
* ''Advice to young minds''
** Implement the code from scratch for understanding. Get to the lowest detail and build yourself
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[15 May 2021]],,
!! The Basics of ConvNet
!! Question 1
What do you think applying this filter to a grayscale image will do?
$$
\begin{bmatrix}
0 & 1 & -1 & 0 \\
1 & 3 & -3 & -1 \\
1 & 3 & -3 & -1 \\
0 & 1 & -1 & 0 \\
\end{bmatrix}
$$
* Detect 45 degree edges
* ''Detect vertical edges''
* Detect horizontal edges
* Detect image contrast
!! Question 2
Suppose your input is a 300 by 300 color (RGB) image, and you are not using a convolutional network. If the first [[Hidden Layer]] has 100 [[Neurons]], each one fully connected to the input, how many parameters does this hidden layer have (including the bias parameters)?
* 9,000,100
* 27,000,001
* ''27,000,100''
* 9,000,001
<<<
''Solution''
= 3 x 300 x 300 x 100 + 100 = 27,000,100
<<<
!! Question 3
Suppose your input is a 300 by 300 color (RGB) image, and you use a convolutional layer with 100 filters that are each 5x5. How many parameters does this hidden layer have (including the bias parameters)?
* 7500
* 2600
* ''7600''
* 2501
<<<
Solution
= 5 (h) x 5 (w) x 3 (channel) x 100 (# filters) + 100 (bias for each filter)
= 7600
<<<
!! Question 4
You have an input volume that is 63x63x16, and convolve it with 32 filters that are each 7x7, using a stride of 2 and no padding. What is the output volume?
* 29x29x16
* 16x16x16
* ''29x29x32''
* 16x16x32
<<<
''Solution ''
The dimensions of output layer is given by the formula $$\left\lfloor\begin{matrix}\frac{n + 2p -f + 1}{s}\end{matrix}\right\rfloor= \frac{63 + 2\times0 -7}{2} = 29$$. Hence the output is ''29 x 29 x 32''
<<<
!! Question 5
You have an input volume that is 15x15x8, and pad it using “pad=2.” What is the dimension of the resulting volume (after padding)?
* 17x17x8
* ''19x19x8''
* 17x17x10
* 19x19x12
<<<
''Solution '' = padding increases the shape size by same unit on each size. so pad = 2 would increase 2 units to the left and right and the resulting dimension would be 19x19x8 (no effect on # channels)
<<<
!! Question 6
You have an input volume that is 63x63x16, and convolve it with 32 filters that are each 7x7, and stride of 1. You want to use a “same” convolution. What is the padding?
* 1
* 7
* ''3''
* 2
<<<
''Solution ''
The dimensions of output layer given by the formula $$\left\lfloor\begin{matrix}\frac{n + 2p -f + 1}{s}\end{matrix}\right\rfloor$$ has to be same before and after.
So, $$ \frac{63 + 2p - 7 + 1}{1} = 63$$. This gives ''p = 3''
<<<
!! Question 7
You have an input volume that is 32x32x16, and apply max pooling with a stride of 2 and a filter size of 2. What is the output volume?
* 32x32x8
* 16x16x8
* 15x15x16
* ''16x16x16''
!! Question 8
Because pooling layers do not have parameters, they do not affect the backpropagation (derivatives) calculation.
* True
* ''False''
!! Question 9
In lecture we talked about “parameter sharing” as a benefit of using convolutional networks. Which of the following statements about parameter sharing in [[ConvNet]] are true? (Check all that apply.)
* It allows gradient descent to set many of the parameters to zero, thus making the connections sparse.
* ''It allows a feature detector to be used in multiple locations throughout the whole input image/input volume''.
* ''It reduces the total number of parameters, thus reducing overfitting''.
* It allows parameters learned for one task to be shared even for a different task (transfer learning).
!! Question 10
In lecture we talked about “sparsity of connections” as a benefit of using convolutional layers. What does this mean?
* Regularization causes gradient descent to set many of the parameters to zero.
* ''Each activation in the next layer depends on only a small number of activations from the previous layer.''
* Each layer in a convolutional network is connected only to two other layers
* Each filter is connected to every channel in the previous layer.
,,
Tags: [[COURSE4: Convolutional Neural Networks]] | [[15 May 2015]],,
! Recurrent Neural Networks
!! Question 1
Suppose your training examples are sentences (sequences of words). Which of the following refers to the $$j^{th}$$ word in the $$i^{th}$$ training example?
# $$x^{(i)<j>}$$
# $$x^{<i>(j)}$$
# $$x^{<j>(i)}$$
# $$x^{(j)<i>}$$
''Answer : 1''
!! Question 2
Consider this RNN:
<img src='https://lh3.googleusercontent.com/DhKxh_qDesYeE7xVIeTH9qu69RyQCIMe9UZxiSjOfG0-2PRMLlP-4ZjuzpOGQ9ShqsfPdXOZVp4sJIO_sJcpoVIJWX8iimXUc0vbtzFpIXwli4iPo9dKYMsreAU2gYoUb_1nsX-QIbLcyRgWIrMz6o0uRaYGR7W3rfL4nUqsg2oE9XXXmrdszltZMDG65xS-QI22QuXVcnO9SQ4jemBGg9NOCOquZicBkIjlEDyYdrHk77U06qnXprgjb4Fi_Iv-6X-26eKgYkcL7hWtuN4PoCJdfF6qTiogzXgDJxC0sGdp7c8F31S0ArEvMjKuLckWL7EdeEbLsKsr6ufHLCFovx-2iTWpQdFb8i6aU5vRWE1PGAhALuxScG4yjv7f4EgO3s5PsMtuTW5vgKd7YETPP2cK_X09l3141tUuwQEWHxhxUMdOiXcio-oc8zMRqlOM7K1yxDhEHzWKRMaDv0hgfN-lyd7I6pE-9E0chIEeLSqZCIQnitTx5t-vtJEvVNX8UPPSM7tBztcE9WsmHpXbuIHjwiWaIthldJI93JYUAZ7g32Dxs6j5sih44DlWjTq0v0GFH4KjBYKNc9yELvyCC1DefQBDmv6B27TwJP7I-LfjHM5KA7ozVVQStxZQRc_KiS3X-qDk8J3wXjl1vgoazLA7x7X4ODgNraqYdpqDm3cP-2D6nan17W_hX3JY3-rbTYHqCCZ0Y7QQpuiu42awzEiVYA=w1324-h504-no?authuser=0' width=700>
This specific type of architecture is appropriate when:
# $$T_x > T_y$$
# $$T_x = 1$$
# $$T_x = T_y$$
# $$T_x < T_y$$
''Answer: 3''
!! Question 3
To which of these tasks would you apply a many-to-one RNN architecture? (Check all that apply).
<img src='https://lh3.googleusercontent.com/Sd-JYNdR1ZlirIoFRA6fetFcQ6ITuegMqzOeFcJOMV9GCaFespS_1y_v0HS6IlLnSmzeXU4Rxv_ISHJ8yXSJGen4CrhRDZ2fwa6x-Ei1_GoAzTFOpeKC_7HDz9_yJyUsA-w9458fM0i0R59NczETRuCgFMj1caGvuHbNLmtTX51Bds4qKvicauOOYqdTHMcVHPPdTxBKyfbUZUFs109nsEmSNU3YIvZanXga3DO_xqyd85sD2QPVYeF2Kv40w8aUeUjgsELPIQgcJqrGLctIU0ivUHEOVYGf9iiRU9vPaiQAAg-bdkgieasnJHvFQ6WjYYEhzWD2jEipuokDrhYndFSIoSix-ii5mPcz-FnIu1PFEcpho50gNVY5b0jpCV6dJ7b7ETiHmAyokg6wBgPl7WHYgyp5ClMjnxXRe9dq8YrcuIEKwKbFsMNc_B1e8KeOGXUjcrcvEC13QZoRHp-m5Wj4y-SiFdOVSBVCmk9VSOZWx3ncvXOFbSp5_LUNpUIiuyKrSoXns8Ym8i0KzhGMT2pQLuElwsTL7ob_H_rQVIGTsBPCa0z6Ai6xHoY_08nkfsMM196zBycvq-kkFh_wLvAF494mix5DV6mequ1mZ8p5SDuFx7E86rswbX2Xzpn9Ztk6RZQAx4t-K_yQXNSrmPy0uPDA_TrdQ0Vi6lTT4ycziTwk8BjMNHqYDyg3779EqxnojehnIWlsSOVI0WjTXOJcHg=w1000-h450-no?authuser=0' width=500>
* ''Sentiment classification (input a piece of text and output a 0/1 to denote positive or negative sentiment)''
* ''Gender recognition from speech (input an audio clip and output a label indicating the speaker’s gender) ''
* Speech recognition (input an audio clip and output a transcript)
* ''Image classification (input an image and output a label)''
!! Question 4
You are training this RNN language model.
<img src='https://lh3.googleusercontent.com/zIildt6wTyEOFuCRSvlaYwePA7WLkNiYDuqx1GfWDxA_sfOw1QWbbz_rYhp_dq2C7YelSVhgSKdWvG50vaBLb2PhHklmbQFWoC4RsMb1NMVuBGyAGPxS0traYXEgbxPAIi04kkUDAeqZjyQXh6d94OFhm5eaTjMsn8r6h5gR9Z8zDQBeKPJTVhhYVTu5go_W6GFe2pamOuqfWdkneTTBk9EuiRQWggDO6XqhsmREp9hI9Trc3PhloYvKiVmdUEpaLeMw8D7TY1iDjKOWZmT9lMe0yWt2D0TcNmCNHeFdgjhxna3GyyjNIDcQmShEJ25EtZA19AbkmjNPg8EPPqUlVId_elaqN3oHZJX6pXERbvsZxdUj9O1w1IqywyZheT5Ej8FUzp3Cfb5DOyGP4kQXVoRd3Qz8EtB3ayWShwNJllcowWYuvWyk48tK0UbZFpmf8PjF81QNxyjVGd5VgUQL077FoICAxZBXC1Lw5kxRBopnhUsG6I9HWbXi7xi5-WUIS9OQxEqHLF1R1QE98g_tB9vk1HNGuvDU0VLAESQfhZsMdS-pcjv8kioL0NwW1rB7cuFXfBafYCMqy4LYV6OTGvzLcciFmgp7ZtdsnPXefu6__-tnkC2JUxVwITYutNkD2V3aWr4dqNYgeaseed74qc9oAf_2_aMaVQOvYqm1bAbRK6rIvQDgiCL78Sl0vcnEY-qI2i2X4uBNBg7L7IlZpHwJjg=w904-h398-no?authuser=0' width=500>
At the $$t^{th}$$ time step, what is the RNN doing? Choose the best answer.
* Estimating $$P(y^{<1>}, y^{<2>}, …, y^{<t-1>})$$
* Estimating $$P(y^{<t>} \mid y^{<1>}, y^{<2>}, …, y^{<t>})$$
* Estimating $$P(y^{<t>})$$
* ''Estimating $$P(y^{<t>} \mid y^{<1>}, y^{<2>}, …, y^{<t-1>})$$''
!! Question 5
You have finished training a language model RNN and are using it to sample random sentences, as follows:
<img src='https://lh3.googleusercontent.com/_VELbO5f5m9pwfE7UVeZkQVx6FSXl7UL35gzIK1RsfSqx9V9ppInpatItbvamKNmGkv9MB4rE4O7XOX15oEZbPLmhMQhwXGjgjSVNNNmWzcd1A7N-NT3XkLXeS2hUoU93z9uAbMzHvOKDCofEv9ep-S5a25gHnL9BW9q9t0nt7Hdm6Y36v4w85Dr2pBymhKQ8PS2pKlDRbF3jgIxi4_QbSuFkfeGC6zznkc0WeDA2K0odN0C6Ipy5MJUg12Dm7AyQYboVxck8wvA3qyx7VTtRLmjSLBwPObAsFr_O7bVjeMz61l-txOmlDjhLMDK2E2AlEDYe5hvz75hqUWI5OvtIr1Kk5wk3xQnuCZS0BX-1DiPNceY-9XIwx-C4DN27APxT7ooKHcE9GAgZ194i4aHChyjW7lVb-4Sl46pZ_E8ebmG-Cc96lyYxXOGbqvX-yLP5xt87gkFWQwTB5OflqMvu0I9410Snk06Ir7TNh5L4-Ei8YsJlibHkRwWolVDweQKPI3YtHBc_8hn3AEVO4Ok9Zf0lx75Ix9l4_2ahwKOZ4SmOKx30sLVmhYULM-2EplX7QNeqVl46vSmm2Mc8QQ4zZcfm2Lu-ixg6ADbDOiIw7seb2NZOtm6Hc0wBaU0rBhh9CPlJ2Sl81p9YWzOuThsb2FzFMyA-rga7EKKLT1OOAvIP12In2vwv0z3TtB9Ts1hgyDGiUaanoLAAazCEPddDUKKIQ=w1186-h382-no?authuser=0' width=700>
What are you doing at each time step $$t$$?
* (i) Use the probabilities output by the RNN to randomly sample a chosen word for that time-step as $$\hat{y}^{<t>}$$.(ii) Then pass the ground-truth word from the training set to the next time-step.
* (i) Use the probabilities output by the RNN to pick the highest probability word for that time-step as $$\hat{y}^{<t>}$$. (ii) Then pass the ground-truth word from the training set to the next time-step.
* (i) Use the probabilities output by the RNN to pick the highest probability word for that time-step as $$\hat{y}^{<t>}$$. (ii) Then pass this selected word to the next time-step.
* ''(i) Use the probabilities output by the RNN to randomly sample a chosen word for that time-step as $$\hat{y}^{<t>}$$. (ii) Then pass this selected word to the next time-step.''
!! Question 6
You are training an RNN and find that your weights and activations are all taking on the value of N-a-N (“Not a Number”). Which of these is the most likely cause of this problem?
* Vanishing gradient problem.
* ReLU activation function g(.) used to compute g(z), where z is too large.
* Sigmoid activation function g(.) used to compute g(z), where z is too large.
* ''Exploding gradient problem''.
!! Question 7
Suppose you are training a LSTM. You have a 10000 word vocabulary, and are using an LSTM with 100-dimensional activations $$a^{<t>}$$. What is the dimension of $$\Gamma_u$$ at each time step?
* ''100''
* 1
* 10000
* 300
!! Question 8
Here’re the update equations for the GRU.
<img src='https://lh3.googleusercontent.com/jyldwKqKFhgzvYpN7b9UwmYOoDv0yMuJwAAtc3xLVOhiqjsosO2eIZynqC_VL5zbDcRSN1Z8XO3YWENXbz64YB8WF6UOsKSgMyHdpJKtRaJkiEjP7h03sKVtXreMQGJmMlMix3DQsTeYzZZuTpUHuSONiFj3xbRFsWxC40WAGLmVLhk1ucnK9lGXm-oPaP1u23Rha2tMxWITWK7enBvQvRlkVt6TBVNtnQl4yYFaW2nyH9CJxwcaQ7k8oySegWpnfFjvGyLffbnUJ3n4zD0AFc-cEgG1RQDwagD_V8pNjbsvd82ikoqUJi-BKKWeuoWrIO3xB0JsDza-pqawC2H62fXVpo9QbvsFBdn70ZscmDHem9rymMKmiGudTd81uM37wPgiK1PBABrN5iuCGcPhQWy6SV9O6MZFLxwKhutKoO_lV21jl98wr8RQ4PAbJLQCpIPnAnXm0feV-I7V6Dn6lYQje3qzUUI3vKbdRIirREVj72DPGi1G3OhimTFJGAfba5cgFsZe2w1tfWRRMZl3ho9bVp3pKWWUlOZhIVQCS2Ki8G-3zMuIsZ0IBj3FKBVhJWBYdAE0MF7NfKUTBlmRDSTpFnn2qt0McY6ZoLDbxOtJ1sWqhX5f4W505wQwU7i-5YNZlLsx0pt6em1kQ26qEiVhSjqBqqk1NGftJUWT6yqxeYvq2QtlvUIWimeWFwa1YVJoQ52s6WAADH4dCfi7X_K2Zg=w1140-h476-no?authuser=0' width=700>
Alice proposes to simplify the GRU by always removing the $$\Gamma_u$$
i.e., setting $$\Gamma_u = 1$$ Betty proposes to simplify the GRU by removing the $$\Gamma_r$$ .i.e., setting $$\Gamma_r = 1$$ always. Which of these models is more likely to work without vanishing gradient problems even when trained on very long input sequences?
* ''Betty’s model (removing $$\Gamma_r$$), because if $$\Gamma_u \approx 0$$ for a timestep, the gradient can propagate back through that timestep without much decay.''
* Betty’s model (removing $$\Gamma_r$$), because if $$\Gamma_u \approx 1$$ for a timestep, the gradient can propagate back through that timestep without much decay.
* Alice’s model (removing $$\Gamma_u$$), because if $$\Gamma_r \approx 1$$ for a timestep, the gradient can propagate back through that timestep without much decay.
* Alice’s model (removing $$\Gamma_u$$), because if $$\Gamma_r \approx 0$$ for a timestep, the gradient can propagate back through that timestep without much decay.
<<<
''Solution''
Solution 3 & 4 means that $$\Gamma_u = 1$$, will always get updated and the gradient won't propagate back. and $$\Gamma_r = 1$$ will make the previous candidate always relevant for computing the next candidate for update. Hence Solution 1
<<<
!! Question 9
Here are the equations for the GRU and the LSTM:
<img src='https://lh3.googleusercontent.com/VUYA2qljqrgHRerxjLQ0icK4KheCJkq_5jBYoYrCcHQK-8fbOA8vhZMz-ehiQVEoVHLQTiB_0BNznhhvvMSQhCItOiYQ8dcDL9Wd971ElThf2MSmV3h4foQtsvReFdIW9wccJmFQRrkX7D1PPfQ7YvLDN2w_VJ-teL9sI_uGeJj5FI-6aOGImDZPFmikzhoHAaacECrrdCuu8Bk2ahslVwnw7Vlagd0q0QcN0_TJ-Gr1TtLvDpguMb0S0phT5zv0N_9gEQG4_f9ok_rzBoznzP5eKOBrJKHgS9AF35Ooe6g8I1fTExcKVBhXyebq0T9xf6Od9faGgU2lsCnkDsIWhKDKwK3t3EtbBu7-fz8s5v6VwwCPLD4f4cKH6YBuY6T2i6aMf70VOc-xDthHeDi8VT_Rf7GjkXQvY6061dFnjqCfpp10hjtbGwn0Zc8_zDbXL8i2eUDm9pkQRmK06QOfjXi8SdltzOXmPeiTas-Jg-5rfuKEvnyGXeW1Y9HQfHdMzgfzkp4CzkG7KtiBWxVORHHqno3nSFXOuxwPrGHGwXcAMvIqoQCuvm2UrGgWDFh-StZccNITvjKqaIS9kkAEjhi5HJ_cri6Olc2BYg7ecQLN3HWlin4rh47-gGVWMU6jE0CmOmQ-M-hbO31lBdVEgb-N48LqQo3CestmI6FeqjUHHR_1anlkPIEPKn9jzGGnLre9bVwepoxX29sFSPTTPV3Y5A=w1420-h634-no?authuser=0' width =700>
From these, we can see that the Update Gate and Forget Gate in the LSTM play a role similar to $$_______$$ and $$______$$ in the GRU. What should go in the blanks?
# $$\Gamma_u$$ and $$\Gamma_r$$
# $$\Gamma_u$$ and $$1-\Gamma_u$$
# $$\Gamma_r$$ and $$\Gamma_u$$
# $$1-\Gamma_u$$ and $$\Gamma_u$$
''Answer:2''
!! Question 10
You have a pet dog whose mood is heavily dependent on the current and past few days’ weather. You’ve collected data for the past 365 days on the weather, which you represent as a sequence as $$x^{<1>}, …, x^{<365>}$$. You’ve also collected data on your dog’s mood, which you represent as $$ y^{<1>}, …, y^{<365>}$$. You’d like to build a model to map from x $$x \rightarrow y$$. Should you use a Unidirectional RNN or Bidirectional RNN for this problem?
* ''Unidirectional RNN, because the value of $$y^{<t>}$$ depends only on $$x^{<1>}, …, x^{<t>}$$, but not on $$x^{<t+1>}, …, x^{<365>}$$''
* Bidirectional RNN, because this allows the prediction of mood on day t to take into account more information.
* Unidirectional RNN, because the value of $$y^{<t>}$$ depends only on $$x^{<t>}$$, and not other days’ weather.
* Bidirectional RNN, because this allows backpropagation to compute more accurate gradients.
,,Tags: [[COURSE5: Sequence Models]] | [[29 May 2021]],,
! Bird Recognition in the City of Peacetopia (Case Study)
!! Question 1
This example is adapted from a real production application, but with details disguised to protect confidentiality.
<img src="https://i.ibb.co/5KmrVWx/course3-week1-q1.jpg" alt="course3-week1-q1" border="0">
You are a famous researcher in the City of Peacetopia. The people of Peacetopia have a common characteristic: they are afraid of birds. To save them, you have to build an algorithm that will detect any bird flying over Peacetopia and alert the population.
The City Council gives you a dataset of 10,000,000 images of the sky above Peacetopia, taken from the city’s security cameras. They are labelled:
* y = 0: There is no bird on the image
* y = 1: There is a bird on the image
Your goal is to build an algorithm able to classify new images taken by security cameras from Peacetopia.
There are a lot of decisions to make:
* What is the evaluation metric?
* How do you structure your data into train/dev/test sets?
''Metric of success''
The City Council tells you that they want an algorithm that
# Has high accuracy
# Runs quickly and takes only a short time to classify a new image.
# Can fit in a small amount of memory, so that it can run in a small processor that the city will attach to many different security cameras.
__Note__: Having three evaluation metrics makes it harder for you to quickly choose between two different algorithms, and will slow down the speed with which your team can iterate. True/False?
* ''True''
* False
!! Question 2
After further discussions, the city narrows down its criteria to:
* "We need an algorithm that can let us know a bird is flying over Peacetopia as accurately as possible."
* "We want the trained model to take no more than 10sec to classify a new image.”
* “We want the model to fit in 10MB of memory.”
If you had the three following models, which one would you choose?
* Test Accuracy Runtime Memory size - 97% 3 sec 2MB
* Test Accuracy Runtime Memory size - 97% 1 sec 3MB
* ''Test Accuracy Runtime Memory size - 98% 9 sec 9MB''
* Test Accuracy Runtime Memory size - 99% 13 sec 9MB
!! Question 3
Based on the city’s requests, which of the following would you say is true?
* Accuracy, running time and memory size are all satisficing metrics because you have to do sufficiently well on all three for your system to be acceptable.
* Accuracy is a satisficing metric; running time and memory size are an optimizing metric.
* Accuracy, running time and memory size are all optimizing metrics because you want to do well on all three.
* ''Accuracy is an optimizing metric; running time and memory size are a satisficing metrics''.
!! Question 4 - Structuring your data
Before implementing your algorithm, you need to split your data into train/dev/test sets. Which of these do you think is the best choice?
* ''Train Dev Test - 9,500,000 250,000 250,000''
* Train Dev Test - 3,333,334 3,333,333 3,333,333
* Train Dev Test - 6,000,000 3,000,000 1,000,000
* Train Dev Test - 6,000,000 1,000,000 3,000,000
!! Question 5
After setting up your train/dev/test sets, the City Council comes across another 1,000,000 images, called the “citizens’ data”. Apparently the citizens of Peacetopia are so scared of birds that they volunteered to take pictures of the sky and label them, thus contributing these additional 1,000,000 images. These images are different from the distribution of images the City Council had originally given you, but you think it could help your algorithm.
Notice that adding this additional data to the training set will make the distribution of the training set different from the distributions of the dev and test sets.
Is the following statement true or false?
"You should not add the citizens' data to the training set, because if the training distribution is different from the dev and test sets, then this will not allow the model to perform well on the test set."
* True
* ''False''
<<<
Solution: True is incorrect: Sometimes we'll need to train the model on the data that is available, and its distribution may not be the same as the data that will occur in production. Also, adding training data that differs from the dev set may still help the model improve performance on the dev set. What matters is that the dev and test set have the same distribution.
<<<
!! Question 6
One member of the City Council knows a little about machine learning, and thinks you should add the 1,000,000 citizens’ data images to the ''test set''. You object because:
* The 1,000,000 citizens’ data images do not have a consistent x-->y mapping as the rest of the data (similar to the New York City/Detroit housing prices example from lecture).
* ''This would cause the dev and test set distributions to become different. This is a bad idea because you’re not aiming where you want to hit.''
* A bigger test set will slow down the speed of iterating because of the computational expense of evaluating models on the test set.
* ''The test set no longer reflects the distribution of data (security cameras) you most care about''.
!! Question 7
You train a system, and its errors are as follows (error = 100%-Accuracy):
```
Training set error 4.0%
Dev set error 4.5%
```
This suggests that one good avenue for improving performance is to train a bigger network so as to drive down the 4.0% training error. Do you agree?
* ''No, because there is insufficient information to tell''.
* No, because this shows your variance is higher than your bias.
* Yes, because having 4.0% training error shows you have a high bias.
* Yes, because this shows your bias is higher than your variance.
!! Question 8
You ask a few people to label the dataset so as to find out what is human-level performance. You find the following levels of accuracy:
```
Bird watching expert #1 0.3% error
Bird watching expert #2 0.5% error
Normal person #1 (not a bird watching expert) 1.0% error
Normal person #2 (not a bird watching expert) 1.2% error
```
If your goal is to have “human-level performance” be a proxy (or estimate) for Bayes error, how would you define “human-level performance”?
* ''0.3% (accuracy of expert #1) ''
* 0.4% (average of 0.3 and 0.5)
* 0.75% (average of all four numbers above)
* 0.0% (because it is impossible to do better than this)
!! Question 9
Which of the following statements do you agree with?
* A learning algorithm’s performance can never be better than human-level performance nor better than Bayes error.
* A learning algorithm’s performance can never be better than human-level performance but it can be better than Bayes error.
* A learning algorithm’s performance can be better than human-level performance and better than Bayes error.
* ''A learning algorithm’s performance can be better than human-level performance but it can never be better than Bayes error''.
!! Question 10
You find that a team of ornithologists debating and discussing an image gets an even better 0.1% performance, so you define that as “human-level performance.” After working further on your algorithm, you end up with the following:
```
Human-level performance 0.1%
Training set error 2.0%
Dev set error 2.1%
```
Based on the evidence you have, which two of the following four options seem the most promising to try? (Check two options.)
* ''Train a bigger model to try to do better on the training set.''
* ''Try decreasing regularization''.
* Try increasing regularization.
* Get a bigger training set to reduce variance.
!! Question 11
You also evaluate your model on the test set, and find the following:
```
Human-level performance 0.1%
Training set error 2.0%
Dev set error 2.1%
Test set error 7.0%
```
What does this mean? (Check the two best options.)
* ''You should try to get a bigger dev set.''
* ''You have overfit to the dev set''.
* You have underfit to the dev set.
* You should get a bigger test set.
!! Question 12
After working on this project for a year, you finally achieve:
```
Human-level performance 0.10%
Training set error 0.05%
Dev set error 0.05%
```
What can you conclude? (Check all that apply.)
* This is a statistical anomaly (or must be the result of statistical noise) since it should not be possible to surpass human-level performance.
* ''It is now harder to measure avoidable bias, thus progress will be slower going forward''.
* ''If the test set is big enough for the 0.05% error estimate to be accurate, this implies Bayes error is $$\leq 0.05%≤0.05 $$''
* With only 0.09% further progress to make, you should quickly be able to close the remaining gap to 0%
!! Question 13
It turns out Peacetopia has hired one of your competitors to build a system as well. Your system and your competitor both deliver systems with about the same running time and memory size. However, your system has higher accuracy! However, when Peacetopia tries out your and your competitor’s systems, they conclude they actually like your competitor’s system better, because even though you have higher overall accuracy, you have more false negatives (failing to raise an alarm when a bird is in the air). What should you do?
* ''Rethink the appropriate metric for this task, and ask your team to tune to the new metric''.
* Look at all the models you’ve developed during the development process and find the one with the lowest false negative error rate.
* Ask your team to take into account both accuracy and false negative rate during development.
* Pick false negative rate as the new metric, and use this new metric to drive all further development.
!! Question 14
You’ve handily beaten your competitor, and your system is now deployed in Peacetopia and is protecting the citizens from birds! But over the last few months, a new species of bird has been slowly migrating into the area, so the performance of your system slowly degrades because your data is being tested on a new type of data.
<img src="https://i.ibb.co/SdrRVqb/course3-week1-q14.jpg" alt="course3-week1-q14" border="0">
You have only 1,000 images of the new species of bird. The city expects a better system from you within the next 3 months. ''Which of these should you do first?''
* ''Use the data you have to define a new evaluation metric (using a new dev/test set) taking into account the new species, and use that to drive further progress for your team.''
* Put the 1,000 images into the training set so as to try to do better on these birds.
* Add the 1,000 images into your dataset and reshuffle into a new train/dev/test split.
* Try data augmentation/data synthesis to get more images of the new type of bird.
!! Question 15
The City Council thinks that having more Cats in the city would help scare off birds. They are so happy with your work on the Bird detector that they also hire you to build a Cat detector. (Wow Cat detectors are just incredibly useful aren’t they.) Because of years of working on Cat detectors, you have such a huge dataset of 100,000,000 cat images that training on this data takes about two weeks. Which of the statements do you agree with? (Check all that agree.)
* Having built a good Bird detector, you should be able to take the same model and hyperparameters and just apply it to the Cat dataset, so there is no need to iterate.
* ''Needing two weeks to train will limit the speed at which you can iterate''.
* ''Buying faster computers could speed up your teams’ iteration speed and thus your team’s productivity''.
* ''If 100,000,000 examples is enough to build a good enough Cat detector, you might be better off training with just 10,000,000 examples to gain a $$\approx10x$$ improvement in how quickly you can run experiments, even if each model performs a bit worse because it’s trained on less data.''
,,Tags: [[COURSE3: Structuring Machine Learning Projects]],,
! Intro to Deep Learning
# What does the analogy “AI is the new electricity” refer to?
#* Through the “smart grid”, AI is delivering a new wave of electricity.
#* AI runs on computers and is thus powered by electricity, but it is letting computers do things not possible before.
#* ''Similar to electricity starting about 100 years ago, AI is transforming multiple industries.''
#* [[AI]] is powering personal devices in our homes and offices, similar to electricity.
# Which of these are reasons for [[Deep Learning]] recently taking off? (Check the three options that apply.)
#* ''We have access to a lot more computational power''.
#* ''Deep learning has resulted in significant improvements in important applications such as [[Online Advertising]], [[Speech Recognition]], and [[Image Recognition]]''.
#* [[Neural Network]]s are a brand new field.
#* ''We have access to a lot more data''.
# Recall this diagram of iterating over different ML ideas. Which of the statements below are true? (Check all that apply.) IDEA->CODE->EXPERIMENT
#:<img src='https://3.bp.blogspot.com/-yuuiK-ysDX8/XJTHY4TDE2I/AAAAAAAAZf8/8hgBnVYWQ_0iY8VcaLBK0qsXCTmB0wGmACLcBGAs/s1600/ML%2Bideas%2Bcycle-min.png' width=300>
#* ''Being able to try out ideas quickly allows deep learning engineers to iterate more quickly''.
#* ''Faster computation can help speed up how long a team takes to iterate to a good idea''.
#* It is faster to train on a big dataset than a small dataset.
#* ''Recent progress in deep learning [[Algorithm]]s has allowed us to train good models faster (even without changing the CPU/GPU hardware)''.
# When an experienced deep learning engineer works on a new problem, they can usually use insight from previous problems to train a good model on the first try, without needing to iterate multiple times through different models. True/False?
#* True
#* ''False''
# Which one of these plots represents a [[ReLU]]?
#:<img src='https://miro.medium.com/max/357/1*oePAhrm74RNnNEolprmTaQ.png' width=300>
# Images for cat recognition is an example of “structured” data, because it is represented as a structured array in a computer. True/False?
#* True
#* ''False''
# A demographic dataset with [[Statistics]] on different cities' population, GDP per capita, economic growth is an example of “unstructured” data because it contains data coming from different sources. True/False?
#* True
#* ''False''
# Why is an RNN ([[Recurrent Neural Network]]) used for [[Machine Translation]], say translating English to French? (Check all that apply.)
#* ''It can be trained as a [[Supervised Learning]] problem''.
#* It is strictly more powerful than a [[Convolutional Neural Network]] (CNN).
#* ''It is applicable when the input/output is a sequence (e.g., a sequence of words)''.
#* RNNs represent the recurrent process of Idea->Code->Experiment->Idea->....
# In this diagram which we hand-drew in lecture, what do the horizontal axis (x-axis) and vertical axis (y-axis) represent?
#:<img src='https://lh3.googleusercontent.com/He1kSMBJCTpyJtxEaTOfBH7c-wvV3HFUPoGDJhR-Zvo-pqdH_vlD_wGu9KvqP-vmKjzje2-5c6iszijhgFitMpFboQsJwuMcnavRBUqjuAuyzpb014XP7KRilYsXk60VBkBT3E1NjvEMwCWDz2R_4WoUNkvujsctGqwnGcChhBA5_Tu9ryZWkC-uWMlVUz9zlVUh7ORB8Dcmc-qZeeBUpr1dAJWPWs-NG03Z4XUXrfwIJrYSEVKX4zfC9PFj4zYwShf_pfMxUq2Rk7SWUJHA2iXG85Q1IwGYqXGLeKB3sf6w7TakJctujyLdfs4kAsyourT4a7QWmczlxdUNyRhg4LI4wvripD-XXDvlyVi0GXmP_eUocjG9RH4yQi9XT3ITlMeR8YGzWQc87fBu2DE57roW9Butdb2SrmXvN_sFSJWIa48zkOXWl8zw_wmWWfP90q4aqef1dRreE_R0YxGOR9q1JevHuWI3L2TkajHLHy3PjmIfh2Kkz-FtC_xVtcFWENkqfxsSV1yqaMfgeCv3C5p_kUMO5ttOqrVsB75FFd5ViS_yN5o3O7jZ1NYFP_Tlr1b5Y--hTyjoGR5VSQR7yUqsks8KQZIUkPki2cD3_dcE9T_8AjJqeZYlmOjH-Z8hePnC8a0fGW6UpJyjZRH9aHdveV-SYsBODjc1RtIPRS-in3XJ3L0xFX57fT8xyVWGPNmcEfmA_qKjfl9t3TUBVu2fvQ=w784-h512-no?authuser=0' width=700>
#* x-axis is the amount of data
#* y-axis is the size of the model you train.
#* ''x-axis is the amount of data''
#* ''y-axis (vertical axis) is the performance of the algorithm''.
#* x-axis is the performance of the algorithm
#* y-axis (vertical axis) is the amount of data.
#* x-axis is the input to the algorithm
#* y-axis is outputs.
# Assuming the trends described in the previous question's figure are accurate (and hoping you got the axis labels right), which of the following are true? (Check all that apply.)
#* Decreasing the size of a neural network generally does not hurt an algorithm’s performance, and it may help significantly.
#* ''Increasing the size of a neural network generally does not hurt an algorithm’s performance, and it may help significantly''.
#* ''Increasing the training set size generally does not hurt an algorithm’s performance, and it may help significantly.''
#* Decreasing the training set size generally does not hurt an algorithm’s performance, and it may help significantly.
,,Tags: [[COURSE1: Neural Networks & Deep Learning]]| [[17 April 2021]],,
! Practical aspects of Deep Learning
!! Question 1
If you have 10,000,000 examples, how would you split the train/dev/test set?
* 60% train . 20% dev . 20% test
* ''98% train . 1% dev . 1% test''
* 33% train . 33% dev . 33% test
!! Question 2
The dev and test set should:
* Have the same number of examples
* ''Come from the same distribution''
* Be identical to each other (same (x,y) pairs)
* Come from different distributions
!! Question 3
If your [[Neural Network]] model seems to have high bias, what of the following would be promising things to try? (Check all that apply.)
* Get more training data
* ''Increase the number of units in each hidden layer ''
* Get more test data
* ''Make the Neural Network deeper''
* Add [[Regularization]]
!! Question 4
You are working on an automated check-out kiosk for a supermarket, and are building a [[Classifier]] for apples, bananas and oranges. Suppose your classifier obtains a training set error of 0.5%, and a dev set error of 7%. Which of the following are promising things to try to improve your classifier? (Check all that apply.)
* ''Increase the regularization parameter lambda''
* Decrease the regularization parameter lambda
* ''Get more training data''
* Use a bigger neural network
!! Question 5
What is [[Weight Decay]]?
* Gradual corruption of the weights in the neural network if it is trained on noisy data.
* A technique to avoid [[Vanishing Gradients]] by imposing a ceiling on the values of the weights.
* The process of gradually decreasing the [[Learning Rate]] during training.
* ''A regularization technique (such as L2 regularization) that results in gradient descent shrinking the weights on every iteration.''
!! Question 6
What happens when you increase the [[Regularization]] [[Hyperparameter]] lambda?
* Doubling lambda should roughly result in doubling the weights
* Weights are pushed toward becoming bigger (further from 0)
* [[Gradient Descent]] taking bigger steps with each iteration (proportional to lambda)
* ''Weights are pushed toward becoming smaller (closer to 0)''
!! Question 7
With the [[Inverted Dropout]] technique, at test time:
* You apply dropout (randomly eliminating units) and do not keep the 1/keep_prob factor in the calculations used in training
* You do not apply dropout (do not randomly eliminate units), but keep the 1/keep_prob factor in the calculations used in training.
* ''You do not apply dropout (do not randomly eliminate units) and do not keep the 1/keep_prob factor in the calculations used in training''
* You apply dropout (randomly eliminating units) but keep the 1/keep_prob factor in the calculations used in training.
!! Question 8
Increasing the parameter keep_prob from (say) 0.5 to 0.6 will likely cause the following: (Check the two that apply)
* Increasing the regularization effect
* ''Reducing the regularization effect''
* Causing the neural network to end up with a higher training set error
* ''Causing the neural network to end up with a lower training set error''
!! Question 9
Which of these techniques are useful for reducing [[Variance]] (reducing [[Overfitting]])? (Check all that apply.)
# [[Dropout]]
# [[Exploding gradient]]
# [[Data Augmentation]]
# [[L2 regularization]]
# [[Gradient Checking]]
# [[Vanishing gradient]]
# [[Xavier initialization]]
''Answer: 1, 3, 4''
!! Question 10
Why do we normalize the inputs xx?
* Normalization is another word for regularization--It helps to reduce variance
* It makes the parameter initialization faster
* ''It makes the cost function faster to optimize''
* It makes it easier to visualize the data
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]],,
All of the resources cited in Course 1 Week 1, in one place. You are encouraged to explore these papers/sites if they interest you! They are listed in the order they appear in the lessons.
!! From the videos:
* Hyperspherical Variational Auto-Encoders (Davidson, Falorsi, De Cao, Kipf, and Tomczak, 2018): https://www.researchgate.net/figure/Latent-space-visualization-of-the-10-MNIST-digits-in-2-dimensions-of-both-N-VAE-left_fig2_324182043
* Analyzing and Improving the Image Quality of StyleGAN (Karras et al., 2020): https://arxiv.org/abs/1912.04958
* Semantic Image Synthesis with Spatially-Adaptive Normalization (Park, Liu, Wang, and Zhu, 2019): https://arxiv.org/abs/1903.07291
* Few-shot Adversarial Learning of Realistic Neural Talking Head Models (Zakharov, Shysheya, Burkov, and Lempitsky, 2019): https://arxiv.org/abs/1905.08233
* Learning a Probabilistic Latent Space of Object Shapes via 3D Generative-Adversarial Modeling (Wu, Zhang, Xue, Freeman, and Tenenbaum, 2017): https://arxiv.org/abs/1610.07584
* These Cats Do Not Exist (Glover and Mott, 2019): http://thesecatsdonotexist.com/
!! From the notebooks:
* Large Scale GAN Training for High Fidelity Natural Image Synthesis (Brock, Donahue, and Simonyan, 2019): https://arxiv.org/abs/1809.11096
* PyTorch Documentation: https://pytorch.org/docs/stable/index.html#pytorch-documentation
* MNIST Database: http://yann.lecun.com/exdb/mnist/
[[Course 1: Build Basic GANs]]
!! From the videos:
* StyleGAN - Official TensorFlow Implementation: https://github.com/NVlabs/stylegan
* Stanford Vision Lab: http://vision.stanford.edu/
* Review: Inception-v3 — 1st Runner Up (Image Classification) in ILSVRC 2015 (Tsang, 2018): https://medium.com/@sh.tsang/review-inception-v3-1st-runner-up-image-classification-in-ilsvrc-2015-17915421f77c
* HYPE: A Benchmark for Human eYe Perceptual Evaluation of Generative Models (Zhou et al., 2019): https://arxiv.org/abs/1904.01121
* Improved Precision and Recall Metric for Assessing Generative Models (Kynkäänniemi, Karras, Laine, Lehtinen, and Aila, 2019): https://arxiv.org/abs/1904.06991
* Large Scale GAN Training for High Fidelity Natural Image Synthesis (Brock, Donahue, and Simonyan, 2019): https://arxiv.org/abs/1809.11096
!! From the notebook:
* CelebFaces Attributes Dataset (CelebA): http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
* ImageNet: http://www.image-net.org/
* The Fréchet Distance between Multivariate Normal Distributions (Dowson and Landau, 1982): https://core.ac.uk/reader/82269844
[[Course 2: Build Better GANs]]
!! Optional
* Automated Data Augmentation
** Interested in mixing data augmentation techniques and automated augmentation policies? Take a look at the paper mentioned in the previous video!
** RandAugment: Practical automated data augmentation with a reduced search space (Cubuk, Zoph, Shlens, and Le, 2019): https://arxiv.org/abs/1909.13719
* Generative Teaching Networks
** Click on [[this link|https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C3W1_Generative_Teaching_Networks_(Optional).ipynb]] to access the optional Colab notebook.
**In this notebook, you'll be implementing a Generative Teaching Network (GTN), first introduced in [[Generative Teaching Networks: Accelerating Neural Architecture Search by Learning to Generate Synthetic Training Data (Such et al. 2019)|https://arxiv.org/abs/1912.07768]]. Essentially, a GTN is composed of a generator (i.e. teacher), which produces synthetic data, and a student, which is trained on this data for some task. The key difference between GTNs and GANs is that GTN models work cooperatively (as opposed to adversarially).
* Talking Heads
** Fascinated by how you can use GANs to create talking heads and deepfakes? Take a look at the paper!
**Few-Shot Adversarial Learning of Realistic Neural Talking Head Models (Zakharov, Shysheya, Burkov, and Lempitsky, 2019): https://arxiv.org/abs/1905.08233
* De-identification
**Curious to learn more about how you can de-identify (anonymize) a face while preserving essential facial attributes in order to conceal an identity? Check out this paper!
**De-identification without losing faces (Li and Lyu, 2019): https://arxiv.org/abs/1902.04202
* GAN Fingerprints
** Concerned about distinguishing between real images and fake GAN generated images? See how GANs leave fingerprints!
** Attributing Fake Images to GANs: Learning and Analyzing GAN Fingerprints (Yu, Davis, and Fritz, 2019): https://arxiv.org/abs/1811.08180
!! From the videos:
* Semantic Image Synthesis with Spatially-Adaptive Normalization (Park, Liu, Wang, and Zhu, 2019): https://arxiv.org/abs/1903.07291
* Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network (Ledig et al., 2017): https://arxiv.org/abs/1609.04802
* Multimodal Unsupervised Image-to-Image Translation (Huang et al., 2018): https://github.com/NVlabs/MUNIT
* StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks (Zhang et al., 2017): https://arxiv.org/abs/1612.03242
* Few-Shot Adversarial Learning of Realistic Neural Talking Head Models (Zakharov, Shysheya, Burkov, and Lempitsky, 2019): https://arxiv.org/abs/1905.08233
* Snapchat: https://www.snapchat.com
* MaskGAN: Towards Diverse and Interactive Facial Image Manipulation (Lee, Liu, Wu, and Luo, 2020): https://arxiv.org/abs/1907.11922
* When AI generated paintings dance to music... (2019): https://www.youtube.com/watch?v=85l961MmY8Y
* Data Augmentation Generative Adversarial Networks (Antoniou, Storkey, and Edwards, 2018): https://arxiv.org/abs/1711.04340
* Training progression of StyleGAN on H&E tissue fragments (Zhou, 2019): https://twitter.com/realSharonZhou/status/1182877446690852867
* Establishing an evaluation metric to quantify climate change image realism (Sharon Zhou, Luccioni, Cosne, Bernstein, and Bengio, 2020): https://iopscience.iop.org/article/10.1088/2632-2153/ab7657/meta
* Deepfake example (2019): https://en.wikipedia.org/wiki/File:Deepfake_example.gif
* Introduction to adversarial robustness (Kolter and Madry): https://adversarial-ml-tutorial.org/introduction/
* Large Scale GAN Training for High Fidelity Natural Image Synthesis (Brock, Donahue, and Simonyan, 2019): https://openreview.net/pdf?id=B1xsqj09Fm
* GazeGAN - Unpaired Adversarial Image Generation for Gaze Estimation (Sela, Xu, He, Navalpakkam, and Lagun, 2017): https://arxiv.org/abs/1711.09767
* Data Augmentation using GANs for Speech Emotion Recognition (Chatziagapi et al., 2019): https://pdfs.semanticscholar.org/395b/ea6f025e599db710893acb6321e2a1898a1f.pdf
* GAN-based Synthetic Medical Image Augmentation for increased CNN Performance in Liver Lesion Classification (Frid-Adar et al., 2018): https://arxiv.org/abs/1803.01229
* GANsfer Learning: Combining labelled and unlabelled data for GAN based data augmentation (Bowles, Gunn, Hammers, and Rueckert, 2018): https://arxiv.org/abs/1811.10669
* Data augmentation using generative adversarial networks (CycleGAN) to improve generalizability in CT segmentation tasks (Sandfort, Yan, Pickhardt, and Summers, 2019): https://www.nature.com/articles/s41598-019-52737-x/figures/3
* De-identification without losing faces (Li and Lyu, 2019): https://arxiv.org/abs/1902.04202
* Privacy-Preserving Generative Deep Neural Networks Support Clinical Data Sharing (Beaulieu-Jones et al., 2019): https://www.ahajournals.org/doi/epub/10.1161/CIRCOUTCOMES.118.005122
* DeepPrivacy: A Generative Adversarial Network for Face Anonymization (Hukkelås, Mester, and Lindseth, 2019): https://arxiv.org/abs/1909.04538
!! From the notebook:
* GAIN: Missing Data Imputation using Generative Adversarial Nets (Yoon, Jordon, and van der Schaar, 2018): https://arxiv.org/abs/1806.02920
* Conditional Infilling GANs for Data Augmentation in Mammogram Classification (E. Wu, K. Wu, Cox, and Lotter, 2018): https://link.springer.com/chapter/10.1007/978-3-030-00946-5_11
* The Effectiveness of Data Augmentation in Image Classification using Deep Learning (Perez and Wang, 2017): https://arxiv.org/abs/1712.04621
* CIFAR-10 and CIFAR-100 Dataset; Learning Multiple Layers of Features from Tiny Images (Krizhevsky, 2009): https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
[[Course 3: Apply GANs]]
[[Supervised Learning]] - student learning to play 'twinkle, twinkle' - know right/wrong notes hit
[[Unsupervised learning]] - Student trying to become a composer. Compare general patterns and melodies and features of them and those of great music
[[Course 2: Build Better GANs]]
!! Summary
* It is challenging to evaluate GANs because no global discriminator
* Two measures ''Fidelity'' (quality of generated images) and ''Diversity'' (variety of images) can be used for evaluation
<hr>
!! Challenges with GAN Evaluation
* For classifier - have sense of correctness, whether the input image s ia a dog or not a dog. For GANs the learned space by passing a noise vector to generate image, there is no concrete way of telling how realistic the generated images are (no clear goal)
* No clear goal of what image to generate given a noise vector
* The discriminator overfits the generator's outputs and there are no perfect or global discriminators that can be used to compare two generators
!! How do you evaluate GANs
By defining the properties of outputs
* [[Fidelity]]
** quality or crispiness of the images
** how realistic the image is?
** How far apart are 100 fakes from 100 reals, because you don't want one hit wonder GAN
* [[Diversity]]
**Range/variety of images generated
** 100 fake sample spreads vs 100 real ones
[[Course 2: Build Better GANs]]
!! Comparing Images using [[Pixel Distance]]
Computing the absolute distance between pixel from real image and fake image
$$
\begin{vmatrix}
\begin{bmatrix}
200 & 50 & 200 \\ 200 & 50 & 200 \\ 200 & 50 & 200
\end{bmatrix}
-
\begin{bmatrix}
200 & 50 & 200 \\ 200 & 50 & 200 \\ 200 & 50 & 200
\end{bmatrix}
\end{vmatrix} =
\begin{bmatrix}
0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0
\end{bmatrix}
$$
This is unreliable because the absolute distance number would increase if the pixel in the fake image is only shifted by one pixel to left/right - even it looks similar to the human eye
!! Feature Distance
* Higher level semantic information less sensitive to small shifts. For example, eyes above nose and mouth below nose
* Even if the background is different between real and generated image the pixel distance is will be absurdly large but it would not matter in feature distance.
[[Course 2: Build Better GANs]] | [[31 July 2021]]
!! Summary
* Generative models learn to produce realistic examples
* Discriminative models differentiates between real and fake
* Discriminative models can also be a sub-component of generative model. There are many generative models, but focus on [[GAN]]s for this specialization
<hr>
<style>td{max-width:50%} .tableizer-table {width:100%; table-layout:fixed}</style>
<table class="tableizer-table">
<thead width='50%'><tr class="tableizer-firstrow"><th>Generative Models</th><th>Discriminative Models</th></tr></thead><tbody>
<tr><td>Learn how to make realistic representation of some class</td><td>Typically used for classification in [[Machine Learning]]</td></tr>
<tr><td>Noise $$(\xi)$$, Class$$(Y)$$ $$\rightarrow$$ Features $$(X)$$</td><td>$$X \rightarrow Y$$ Mapping: $$P(Y|X)$$</td></tr>
<tr><td>Takes random # as noise and a class to generate image that looks like specified class. Noise ensures that the same image is not generated repeatedly</td><td>uses features to discriminate between classes</td></tr>
</tbody></table>
! Types of Generative Models
!! [[Variational Autoencoders (VAE)]]
* Works with two models - Encoder and Decoder. These are typically [[neural Network]]s
:<img src='https://dummyimage.com/600x400/000/fff' width=250>
* ''Autoencoder''
** They learn just by feeding in realistic images into the Encoder who finds a good way of representing the images in a [[Latent Space]]
** Assume a point in [[Latent Space]] is represented by a vector of numbers $$\begin{bmatrix}6.2\\-3\\2.1\end{bmatrix}$$, [[Variational Autoencoders (VAE)]] takes in these representations through a decoder whose goal is to reconstruct the image that the encoder saw before
** After training the encoder is removed and pick random points in the [[Latent Space]], and the decoder would have learned to produce a realistic image
* ''Variational'' part injects some noise into the whole model and training process. Instead of encoder having to encode the image into a single point in the [[Latent Space]], the encoder encodes the image onto a distribution and samples a point on that distribution to feed into the decoder to then produce a realistic image. This adds a little bit of a noise, since different points can be sampled on this distribution
!! [[GAN]]s
* composed tof two models
* Generator generates image without ever seeing the real examples by taking random noise as input and optional class
* Discriminator differentiates between real and fake examples
* Generator's role is similar to decode in [[Variational Autoencoders (VAE)]]. The difference is that there is no one guiding the encoder that determines what noise vector should look like as input to the Generator. Instead there is a discriminator taking fake and real images and discriminating between fakes and reals.
* These two models compete against each other - thus ''Adverserial'', until they reach a point where the discriminator cannot discriminate
* We then remove the generator and input random noise to generate a realistic image
[[Course 1: Build Basic GANs]]
!! Summary
* Pretrained classifiers can be used to extract features of an image by cutting network at earlier layers
* The last pooling layer is the most commonly used layer for feature extraction
* Best to use classifier trained on ImageNet dataset
<hr>
!! Feature Extraction
* Extract features from images to be used when computing feature distance for comparing images. The features can be extracted using a pre-trained classifier
* These classes maynoot be at the end of classifier (i.e. in the last layer), it could be in the reintermedialte layers also
* These classifiers are trained to detect a variety og images and their featurs.
* Extracted features are abstract and do not correspond to our notion of eyes, ears nose etc.
:<img src='https://media.springernature.com/lw685/springer-static/image/art%3A10.1186%2Fs40537-021-00444-8/MediaObjects/40537_2021_444_Fig7_HTML.png' width=500>
!! Using a pre-trained classifier
* remove the last [[Fully Connected]] layer and output
* Most common layer to get output features is the [[Pooling]] layer before the [[Fully Connected]] layer and that's used to classification - Contains most fine grained information
* using [[Pooling]] layer values - eg. 100 values for the input image size of 500 x 500
* Can also consider earlier layers because later layers are more prone to [[Overfitting]] the classification task at hand
!! ImageNet
* Classifier trained on ImageNet Dataset: >14M Images and 20,000 categories
* Feature extracted from classifier trained on this dataset are called ''[[ImageNet]] [[Embeddings]]'' - this is because they compress the info from the image into a smaller vector using the weights trained on this dataset.
* [[Embeddings]] are just vectors that exist in broadly known as ''feature space''
[[Course 2: Build Better GANs]] | [[31 July 2021]]
!! Summary
* GANs have achieved impressive performance rapidly
* Major companies are using them
* Can take many opportunities
<hr>
* [[GAN]]s have been around since 2014
* Achieved super-human performance in various tasks
* [[Ian Goodfellow]] tweeted 4.5 years of GAN progress on face generation.
: <img src='https://pbs.twimg.com/media/Dw6ZIOlX4AMKL9J?format=jpg&name=large', width=400>
* Can learn from whatever training data they are given.
** not every generated example will be perfect
* Use cases
** [[StyleGAN]]
** [[CycleGAN]] - [[GAN]]s for image translation - taking an image from one domain and transforming into other. For example, transforming a horse into a zebra
** [[GauGAN]] - GANs that help make photorealistic images from just a rough sketch
** Still life portrait animation - seen in [[Harry Potter]] movies having animate people in photoframes
** [[3D-GAN]] - Generating 3D objects for generative design, like furnitures for the house, and medicine for artificial medical imaging data for X-rays
!! Companies using GANs
* [[Adobe]] - next gen [[Photoshop]] - doodles to expert level
* [[Google]] - text generation
* [[IBM]] - GAN for [[Data Augmentation]]
* [[Snapchat]]/[[TikTok]] - creative filters
* [[Disney]] - [[Super Resolution]]
,,Tags: [[Course 1: Build Basic GANs]] | [[02 August 2021]],,
!! Summary
* Commonly used feature extractor - pretrained on ImageNet
* Extracted features are called [[Embeddings]] - usually constructed from last [[Pooling]] layer
* Compare embeddings to get feature distance
<hr>
* [[InceptionV3]] is a common [[CNN]] to extract features from the images for [[GAN]]s
*42 layers deep, computationally cost-efficient
$$
\begin{bmatrix}Inception \ Network\end{bmatrix} \rightarrow Output \ before \ FC \ layer \rightarrow \begin{bmatrix}8 \times 8 \times 2048\end{bmatrix} \xrightarrow[]{8\times8 \ Pool} \begin{bmatrix}2048\end{bmatrix} Embedding
$$
!! [[Embeddings]]
$$
\begin{bmatrix}Dog\end{bmatrix} \rightarrow \begin{bmatrix}InceptionV3\end{bmatrix} \rightarrow
\begin{bmatrix}2\ eyes \\ 2\ ears \\ 1\ nose \end{bmatrix} = \phi(x)
$$
where $$\phi$$ is the mapping function applied on the image $$x$$ (real/fake)
!!Comparing Embeddings
* SUbtracting the average of all fake from the average of all real [[Embeddings]] - similar to [[Pixel Distance]]
* [[Euclidean Distance]] or [[Cosine Distance]]
* Can consider reals and fakes are distributions and compare the distance between these two distributions
[[Course 2: Build Better GANs]] | [[31 July 2021]]
!!Summary
* Goal of the generator is to generate fakes that look real
*The goal of discriminator is to distinguish between real and fakes
* They learn from competing with each other
* At the end the fakes look like real
<hr>
!! Generator
* The generator learns to generate fakes that look like reals to fool the discriminator - like a painting forger. ''The Generator never actually gets to see the real image''
!! Discriminator
* Art inspector
* Takes in both real and fake images and tries to tell which ones are fake and real
!! How they work together?
* Need a collection of images, like, some famous paintings
* At the beginning of this game, generator is not very sophisticated and it is not allowed to see the real images. So, it does not know how the image should even look like
* The discriminator is also elementary. So at the beginning, even it does not know which is fake or real but it is allowed to look at real images mixed with fakes
* Train the discriminator using the real images and it knows which images are real. It means a prediction and then accuracy is measure by comparing with true labels
* The generator will know in which direction to move by using the feedback score recieved from the discriminator. As the generator improves, the discriminator also improves because it gets the difference between more realistic looking imgaes from the real ones.
* After many rounds, the generator produces paining sthat are harder to distinguish.
* The game stops when you are happy with the fake images that the generator is generating.
,,Tags:[[Course 1: Build Basic GANs]]|[[02 August 2021]],,
!! Summary
* Discriminator is a type of [[Classifier]]
* $$P(real/fake | X)$$
* Probs are feedback to the generator
<hr>
* Classifier to distinguish between real and fakes
* Can either take text, image or video as inputs
* Image $$\rightarrow$$ NN $$\rightarrow$$ probabilities vs true labels
* $$P(Y_{class} | X_{features})$$ - conditional probability distribution
: <img src='https://dummyimage.com/600x400/000/fff' width=250>
* $$P(Fake|X_{features})$$ = 0.84 is a sample of feedback that is used by the generator to improve
,,Tags: [[Course 1: Build Basic GANs]] | [[02 August 2021]],,
!! Summary
* FID computes the distance between reals and fakes
* FID requires babysitting the model for samples qualitatively since it captures only limited statistics
* Slow to run and sample sizes need to be large to work well
<hr>
!! [[Fréchet inception distance]]
* FID is the most popular metric for measuring distance between real and generated images
* Named after the mathematician - [[Maurice René Fréchet|https://en.wikipedia.org/wiki/Maurice_Ren%C3%A9_Fr%C3%A9chet]] - is a distance metric that is used to measure distance between curves and can be extended to comparing distributions as well
* The Dog Walker is a classic example to illustrate Fréchet Distance
*:<img src='https://omrit.filtser.com/lib/man-dog2.gif' width=500>
** Dog is on one curve
** Man is on the other curve
** Can move at different speeds, neither of them can go backwards
** ''Find out the min leash length to walk the curves from beginning to the end''. The least amount of leash that you can give to your dog without have to give more slack during the walk.
* Can also compute Fréchet Distance between the distributions
$$
d(X,Y) = (\mu_X - \mu_Y)^2 + (\sigma_X - \sigma_Y
)^2
$$
[[Multivariate Normal Distribution]]
[[Course 2: Build Better GANs]] | [[31 July 2021]]
!! Summary
* generator produces fake data that looks real
* learns to minimize the distribution of feature X from class of data
* takes random noise as input to generate different outputs
<hr>
! Generator
* The goal is to produce examples from a class
* Noise vector is input to the generator to produce a different image every time
<img src='https://dummyimage.com/600x400/000/fff' width=250>
* Once a good generator is created, save the params, load generator and sample from the generator to generate images
<img src='https://dummyimage.com/600x400/000/fff' width=250>
$$ P(X_{features} | Y_{class}) $$. If there is only 1 class, there there is no conditional probability
* Generating images of cats
** Less proportion of rare breeds getting sample, since less data available on the uncommon breeds
* Can control the sampling process
,,Tags: [[Course 1: Build Basic GANs]] | [[02 August 2021]],,
!! Summary
* BCE Function has two parts, each one relevant for each class
* Close to zero when labels and predictions are similar else approaches $$\infty$$
<hr>
! BCE Loss
* [[BinaryCrossentropy]] or BCE Loss is used to train [[GAN]]s
* Specially designed for classification tasks - 2 categories (real/fake)
$$
J(\theta) = - \frac{1}{m} \sum_{i=1}^m \bigg[ y^{(i)} \log h(x^{(i)}, \theta) + (1-y^{(i)})\log(1- h(x^{(i)},\theta)) \bigg]
$$
where
* $$h$$ - predictions by the model
* $$\theta$$ - parameters
* $$-1/m$$ = Averaging loss over the whole batch of training examples. where the '$$-$$' sign ensures $$J(\theta) \geq 0$$
* $$y^{(i)} \log h(x^{(i)}, \theta)$$ - Product of true label, with log of prediction parameterized by $$\theta$$. This is relevant when label = 1
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>$$y^{(i)}$$</th><th>$$\log h(x^{(i)}, \theta)$$</th><th>$$y^{(i)} \log h(x^{(i)}, \theta)$$</th><th>Comments</th></tr></thead><tbody>
<tr><td>0</td><td>any</td><td>0</td><td>when label is false</td></tr>
<tr><td>1</td><td>0.99</td><td>~0</td><td>When Prediction is good</td></tr>
<tr><td>1</td><td>~0</td><td>-inf</td><td>When prediction is bad</td></tr>
</tbody></table>
* $$(1-y^{(i)})\log(1- h(x^{(i)},\theta))$$ - This is relevant when the label is 0.
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>$$y^{(i)}$$</th><th>$$\log h(x^{(i)}, \theta)$$</th><th>$$(1-y^{(i)})\log(1- h(x^{(i)},\theta))$$</th><th>Comments</th></tr></thead><tbody>
<tr><td>1</td><td>any</td><td>0</td><td>When label is true</td></tr>
<tr><td>0</td><td>0.01</td><td>~0</td><td>When Prediction is good</td></tr>
<tr><td>0</td><td>~1</td><td>-inf</td><td>When prediction is bad</td></tr>
</tbody></table>
If either of the two components evaluate to really big negative estimates, the minus sign preceding the [[Cost Function]] will throw a large positive estimate of cost which NN can decrease.
<img src='https://dummyimage.com/600x400/000/fff' width=250>
,,Tags: [[Course 1: Build Basic GANs]] | [[02 August 2021]],,
!! [[GAN]] Model
<img src='https://sthalles.github.io/assets/dcgan/GANs.png' width=500>
!! Training [[Discriminator]]
$$
\begin{matrix}\xi & \longrightarrow & \square & \longrightarrow & \hat{X} \\
Noise & & Generator & & Features
\end{matrix}
$$
[[Course 1: Build Basic GANs]] | [[28 August 2021]]
!! Binary Classification
[[Logistic Regression]] is an [[Algorithm]] for [[Binary Classification]].
Suppose you want to make a cat-classifier using image as input. The color image can be broken down into 3 RGB matrices and can be reshaped into single column vector as follows:
$$ 64 \times 64\ Image \rightarrow RGB (64 \times 64 \times 3) \rightarrow \begin{bmatrix} R_{11} \\ R_{21} \\ .. \\ G_{11} \\ G_{21} \\ .. \\B_{11} \\ B_{21} \\ .. \\ \end{bmatrix} $$
!! Notation
Single Training Example: $$(x,y); x \in \mathbb{R}^{n_x}; y \ \epsilon \ \{0,1\}$$
$$m$$ training examples. eg: $$\{(x^{(1)},y^{(1)}),...(x^{(m)},y^{(m)})\}$$
samples in train : $$m_{train}$$
samples in test : $$m_{test}$$
$$X = \begin{bmatrix} | & | & & | \\ x^{(1)} & x^{(2)} & ... & x^{(m)} \\ | & | & & |\end{bmatrix}; where \ X \in \mathbb{R}^{(n_x, m)} $$
$$Y = \begin{bmatrix} y_{(1)} & y_{(2)} & ... & y_{(m)} \end{bmatrix}; where \ y \in \mathbb{R}^{(1,m)}$$
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[07 May 2021]],,
!! Get size estimate of error using case reviews
To get the [[Algorithm]] to perform at a human level, manually examining a few examples can give insights on what to do next using [[Error Analysis]]
For example,
For a cat classifier misclassifying dog images, should we try to make it perform better on dogs? This could be several months of work. Use [[Error Analysis]] to get the size estimate of the problem
# Get ~100 misclassified samples from dev set
# Count the # of dogs.
#* If 5, that means ~5% of the problem. If the classifier has 10% error and 5% of the problem is dogs then the max performance improvement could only by 9.5% error (upper bound or ceiling). So, ''not worth spending time''
#* If 50, that means dogs are 50% of the problem and with the error rate of 10%, trying to make the classifier work better on dogs will improve the performance by 5% error. ''So worth spend time''
!! Evaluate multiple ideas in parallel
''Ideas''
* fix the picture of dogs recognized as cats
* Fix great cats (lions, panthers) misrecognized
* Improve performance on blurry images
<table>
<thead><tr class=><th>Image</th><th>Dog</th><th>Great cats</th><th>blurry</th><th>Comments</th></tr></thead><tbody>
<tr><td>1</td><td>✓</td><td> </td><td> </td><td>...</td></tr>
<tr><td>2</td><td>✓</td><td>✓</td><td>✓</td><td>...</td></tr>
<tr><td>3</td><td>✓</td><td> </td><td>✓</td><td>...</td></tr>
<tr><td>.</td><td>.</td><td>.</td><td>.</td><td>...</td></tr>
<tr><td>.</td><td>.</td><td>.</td><td>.</td><td>...</td></tr>
<tr><td>.</td><td>.</td><td>.</td><td>.</td><td>...</td></tr>
<tr><td>100</td><td>.</td><td>.</td><td>.</td><td>...</td></tr>
<tr><td>% of Total</td><td>8%</td><td>43%</td><td>61%</td><td></td></tr>
</tbody></table>
During this process you may also end up generating new ideas as well
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[15 May 2021]],,
! [[Mini-batch gradient descent]]
[[Neural Network]] works in the realm of big data, but training on large datasets is slow $$\rightarrow$$ need good [[Optimization]] Algorithms.
[[Mini-batch]] is a subset of training data which allows you to make some progress on a smaller training without needing to process the [[Gradient Descent]] step on the entire data.
Training Examples $$m = 5,000,000$$ & [[Mini-batch]], say $$1000$$ examples
<<<
$$X = [x^{[1]}, x^{[2]},..., x^{[m]}]$$
$$X^{\{1\}} = [x^{[1]}, x^{[2]},..., x^{[1000]}] $$
$$ X^{\{2\}} = [x^{[1001]}, x^{[1002]},..., x^{[2000]}]$$
where $$X^{\{1\}}$$ is mini-batch number 1
Similarly,
$$Y = [y^{[1]}, y^{[2]},..., y^{[m]}]$$
$$Y^{\{1\}} = [y^{[1]}, y^{[2]},..., y^{[1000]}] $$
$$Y^{\{2\}} = [y^{[1001]}, y^{[1002]},..., y^{[2000]}]$$
So, mini-batch $$t : (X^{\{t\}},Y^{\{t\}})$$
and shape of mini-batch $$t : ((n_x, 1000), (1, 1000))$$
<<<
!! Gradient Descent on Mini-batch
!!!`for t in range(1,5000)`:
<<<
{one step of [[Gradient Descent]] processed on sample of 1000 observations}
''Forward Propagation'' - vectorized on 1000 samples
$$z^{[1]} = w^{[1]}X^{\{t\}} + b^{[1]}$$
$$A^{[1]} = g^{[1]}(z^{[1]})$$
...
$$A^{[L]} = g^{[L]}(z^{[L]})$$
''Compute Cost Function''
$$J = \frac{1}{1000}\sum_{i=1}^l \mathcal{L}(\hat{y}^{(i)}, y^{(i)}) + \frac{\lambda}{2.1000} \sum_l ||w||_F^2$$
''[[Backpropagation]] - Compute gradients''
$$w^{[l]} := w^{[l]}- \alpha dw^{[l]}$$
$$b^{[l]} := b^{[l]}- \alpha db^{[l]}$$
<<<
1EPOCH - 1 pass through the training set
[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]
!Why Look at case Studies?
* Look at effective [[CNN]]s
* Lot of past few years of [[Computer Vision]] research has been to put together basic building blocks ([[Convolution]] layers, [[Pooling]] layers, [[Fully Connected]] layers) to form effective [[CNN]]s
* One CV architecture that works well on one task often works well on other tasks
!! Network Architectures
* Classic Networks
** [[LeNet-5]]
** [[AlexNet]]
** [[VGG16]]
* [[ResNet]]
* [[Inception]]
[[COURSE4: Convolutional Neural Networks]]
So far, we have represented words as [[One-hot Encoding]] vectors of words from the vocabulary.
$$
\begin{matrix}
Man & Woman & King & Queen & Apple & Orange \\
\begin{bmatrix} . \\ . \\ . \\ . \\ 5391 \\ . \\ . \\ . \end{bmatrix} &
\begin{bmatrix} . \\ . \\ . \\ . \\ . \\ . \\ . \\ 9853 \end{bmatrix} &
\begin{bmatrix} . \\ . \\ . \\ . \\ 4914 \\ . \\ . \\ . \end{bmatrix} &
\begin{bmatrix} . \\ . \\ . \\ . \\ . \\ . \\ 7517 \\ . \end{bmatrix} &
\begin{bmatrix} . \\ 456 \\ . \\ . \\ . \\ . \\ . \\ . \end{bmatrix} &
\begin{bmatrix} . \\ . \\ . \\ . \\ . \\ 6257 \\ . \\ . \end{bmatrix} \\
O_{5391} & O_{9853} & O_{4914} & O_{7157} & O_{456} & O_{6257}
\end{matrix}
$$
One of the ''weaknesses '' of this representation is that it treats each word as a thing unto itself. ie. Apple & Oranges though are different words but are both fruits. This will lead to algorithm not being able to generalize across the words, because the algorithm sees apples and oranges as two separate entities as it sees king and orange.
$$
\begin{matrix}
Feature & | & Man & Woman & King & Queen & Apple & Orange \\
---- & + & ---- & ---- & ---- & ---- & ---- & ---- \\
Gender & | & -1 & 1 & -0.95 & 0.97 & 0.00 & 0.01 \\
Royal & | & 0.01 & 0.02 & 0.93 & 0.95 & -0.01 & 0.00 \\
Age & | & 0.03 & 0.02 & 0.7 & 0.69 & 0.03 & -0.02 \\
Food & | & 0.04 & 0.01 & 0.02 & 0.01 & 0.95 & 0.97 \\
... & | & ... & ... & ... & ... & ... & ... \\
... & | & ... & ... & ... & ... & ... & ... \\
---- & + & ---- & ---- & ---- & ---- & ---- & ---- \\
Embedding& | & e_{5391} & e_{9853} & e_{4914} & e_{7157} & e_{456} & e_{6257}
\end{matrix}
$$
Using a featurized word representation allows model to learn similarities and differences between words. If the extreme values belong to -1 to 1, then man can represented by -1 value and woman can be represented with 1 in the feature 'Gender', and so on. Using these features as vectors we can represent words as vectors of these features.
$$\begin{matrix} Man & \ & Man \\ O_{5391} & \equiv & e_{5391}\\ (10,000 \ dim) & \ & (300 \ dim) \end{matrix}$$
Notice that with new featurized representation apples and oranges are more similar than apples and king
!! Word Embeddings
Learn high dimensional vectors that gives a better representation than [[One-hot Encoding]]s of the words
!! Visualizing [[Word Embeddings]]
300D feature vectors $$\xrightarrow{embed}{}$$ 2D space for visualizing - [[t-SNE]] algorithm for visualizing
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!Classic Networks
!! [[LeNet-5]]
!! [[AlexNet]]
!! [[VGG16]]
,,Tags: [[COURSE4: Convolutional Neural Networks]]|[[25 June 2021]],,
!! Is it worth your while to fix these labels?
''Errors in Training set''
[[Deep Learning]] [[Algorithm]]s are quite robust to random errors in the training set. It is probably best to leave the errors as it is
* if they are a random mixup
* if the actual % of error is small and
* train data is huge
<<<
[[Deep Learning]] algorithms are not robust to ''Systematic errors''
<<<
For example, all white dogs were classified as cats in the train dataset then the algorithm could be in trouble.
''Errors in Dev set''
* During error analysis, add an extra column of incorrectly labelled data point and size the error. If it makes a significant difference to your ability to evaluate the algorithm, then go ahead and fix the error
!! Fixing mislabelled data points in dev/test sets
''Guidelines''
* Apply the same process to both dev(validation) and test sets, so that the test distribution $$\sim$$ dev distribution
* Consider the examples your algorithm got right as well as it got wrong. This is not easy to do, so not always done
,,Tags:[[COURSE3: Structuring Machine Learning Projects]] | [[15 May 2021]],,
!Logistic Regression
For a cat classifier, given an input feature vector $$x; x \in \mathbb{R}^{n_x}$$, we want $$\hat{y} = P(y=1|x)$$, a probability estimate that this is a cat picture. The parameters for logistic regression will be $$w \in \mathbb{R}^{n_x}; b \in \mathbb{R}$$. Since the predictions, $$\hat{y}$$ can be more or less than 1, we need to convert it into a probability using [[Sigmoid]] function $$(\sigma)$$. So the output will then be,
$$\hat{y} = \sigma(w^Tx + b)$$
!! Sigmoid Function
$$\displaystyle{\sigma(z) = \frac{1}{1+e^{-z}}}$$
<img src='https://i.stack.imgur.com/czEqL.png' width=400>
* if $$z$$ is very large $$\rightarrow e^{-z} \approx 0 \rightarrow \sigma(z) \approx 1$$
* if $$z$$ is very small $$\rightarrow e^{-z} \approx 1 \rightarrow \sigma(z) \approx 0$$
,,Tags: [[COURSE1: Neural Networks & Deep Learning]]| [[07 May 2021]],,
!Understanding Mini-batch Gradient Descent
<table>
<tr><td colspan=2><img src='https://miro.medium.com/max/2910/1*5mHkZw3FpuR2hBNFlRxZ-A.png' width=700></td></tr>
<tr>
<td>[[Cost Function]] will decrease with each iteration</td>
<td>[[Cost Function]] may not decrease with each iteration. Plot is generated on $$X^{\{t\}},Y^{\{t\}}$$, but the overall trend should be downward. Could be possible because $$X^{\{1\}},Y^{\{1\}}$$ was easier but $$X^{\{2\}},Y^{\{2\}}$$ is difficult</td>
</tr>
</table>
* If minibatch size = $$m \rightarrow$$ [[Batch Gradient Descent]]
* If minibatch size = $$1 \rightarrow$$ [[Stochastic Gradient Descent]]. Every examples is its own [[Mini-batch]].
[[Stochastic Gradient Descent]] does not converge to the min. It wanders around it because it is too noisy to train and update parameters using a single example. In practice, mini-batch size must be between 1 and m.
<table>
<tr>
<th>[[Stochastic Gradient Descent]]</th>
<th>[[Mini-batch gradient descent]]</th>
<th>[[Batch Gradient Descent]]</th>
</tr>
<tr>
<td>Lose speed from [[Vectorization]]</td>
<td>Fastest learning <ul>
<li> Utilized [[Vectorization]] </li>
<li> can make progress without waiting to pass through the entire training dataset </li>
</ul></td>
<td>Takes too long per iteration</td>
</tr>
</table>
!! Choosing [[Mini-batch]]: Guidelines
* If small training set $$(m \leq 2000)\rightarrow$$ use [[Batch Gradient Descent]]
* Otherwise, typical [[Mini-batch]] sizes range from $$64, 128, 256, 512$$ are most common. Can also use $$1024$$. Make sure that the mini-batch fits the memory requirements of [[CPU]]/[[GPU]]
,,Tags:[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[17 June 2021]],,
For [[Named Entity Recognition]] task, given the following example
$$
\begin{matrix}
Sally & Johnson & is & an & orange & Farmer \\
\downarrow & \downarrow &\downarrow &\downarrow & \downarrow & \downarrow \\
1 & 1 & 0 & 0 & 0 & 0
\end{matrix}
$$
Using this sentence to train a [[Word Embeddings]] based model where the model uses [[Word Embeddings]] as input, for a new sentence
$$
\begin{matrix}
Robert & Lin & is & an & apple & Farmer \\
\end{matrix}
$$
Knowing that apples are oranges are quite similar, it will make it easier for learning algorithm to generealize and figure out that //Robert Lin// is also a person's name.
What if in the test set, the algorithm saw
$$
\begin{matrix}
Robert & Lin & is & an & durian & cultivator \\
\end{matrix}
$$
without the [[Word Embeddings]], Using //durian// & //cultivator// as [[One-hot Encoding]] vectors for predicting names, the algo will not be able to recognize that durian is similar to orange and that cultivating is similar to farming.
Word embeddings can make the //durian// and //orange// similar because, they are trained on a large corpus of text, ~1 Billion to ~100 Billion words.
Using these word embeddings and applying it to a [[Named Entity Recognition]] task, for which you might have a smaller dataset allows you to carry out [[Transfer Learning]].
!! Transfer Learning using Word Embeddings
# Learn [[Word Embeddings]] for large text corpuses (1-100 B words) or download pre-trained word embeddings
# Transfer embedding to new task with smaller training set (~100k words) - this allows you to use lower dimension dense feature vector.
#Optimze - continue to finetune [[Word Embeddings]] with new data. generally done if training set for new task is also larger.
Word Embeddings make biggest difference when the task that you want to carry out has a smaller train set.
* ''More useful applications'' : [[Named Entity Recognition]], [[Text Summarization]], [[Co-reference Resolution]], parsing
* ''Less Useful applications'': [[Machine Translation]] and [[Language Modelling]]
''Similar to face encoding seen'' in [[CNN]]s for [[Face Verification]] using a [[Siamese Network]]
:<img src='http://media5.datahacker.rs/2018/12/siam_1.png' width=500>
encoding image $$\equiv$$ embedding word from vocabulary
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
If you are working a brand new [[Machine Learning]] porject
* First set up dev/test datasets and evaluation metric
* Build the first system quickly
* Use bias variance analysis/[[Error Analysis]] to prioritize next steps
It does not apply strongly to
* Application area where you have significant prior experience
* If there is a significant body of academic literature that you can draw on for pretty much exactly the same problem you are building
!!Mismatched training/dev/test sets
Suppose you are building a classifier for cats that uses data from two sources
# web pages : 200,000 images
# Uploaded by Mobile app users - 10,000 images
and you want to do best on user uploaded images, how should you generate train/test/dev sets?
''Option 1'':
* Full dataset = 200,000 + 10,000 and then split by 205,000 in train, 2500 in dev and 2500 in test. Using this setup would tell your team to optimize the performance on the web page like images which is not what you want. This option is not recommended
''Option 2''
* Keep dev and test sets with mobile app images all together
* Advantage is that you are optimizing on the dev/test distribution you care about
* Training distribution is now different from dev/test distribution - but this setup will give better performance over the long term
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[15 May 2021]],,
!Exponentially Weighted Moving Averages
Formula for [[Exponential Moving Average]]
$$V_t = \beta V_{t-1} + (1 - \beta )\theta_t$$
:when $$\beta = 0.9 \rightarrow$$ averaging over 10 days
:when $$\beta = 0.98 \rightarrow$$ averaging over 50 days
:when $$\beta = 0.5 \rightarrow$$ averaging over 2 days
More generally, $$V_t$$ is averaging over $$1/(1-\beta)$$ days
<img src='https://miro.medium.com/max/1566/1*DiaKVezC-VM6WCGyXQNVJQ.png'>
Larger $$\beta \rightarrow$$ slower to adapt since more weights to previous averages/values $$\rightarrow$$ averaging over more number of days $$\rightarrow$$ curve shifts towards right
''EMA is a key component for implement [[Optimization]] [[Algorithm]]s''
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[17 June 2021]],,
! Logistic Regression Cost Function
To train parameters $$w, b$$ for [[Logistic Regression]] model, we need to define a [[Cost Function]] given output $$\hat{y} = \sigma(w^Tx + b)$$ where $$\sigma(z) = \frac{1}{1+e^{-z}}$$
Given training examples $$\{(x^{(1)},y^{(1)}),...(x^{(m)},y^{(m)})\}$$, we want predictions to be as close to labels i.e. $$\hat{y}^{(i)} \approx y^{(i)} $$, where
$$\hat{y}^{(i)} = \sigma(w^Tx^{(i)} + b)$$
!! Loos (error) function
<<<
''Measures how well the algorithm is doing''
$$\mathscr{L}(\hat{y},y) = \frac{1}{2}(\hat{y}-y)^2$$
''Squared error'': People don't do this for logistic regression because the parameter learned during optimization, the problem is non-convex. So, you end up with optimization problem with multiple local optima. Instead the following loss function is used
$$
\mathscr{L}(\hat{y},y) = -\Big[y\log{\hat{y}} + (1-y)\log{(1-\hat{y})}\Big]
$$
*If $$y = 1; \mathscr{L}(\hat{y},y) = -1 \log{\hat{y}} $$
:For the loss to be small, $$\log{\hat{y}}$$ has to be as large as possible. Thus $$\hat{y}$$ has to be large, but it is limited by [[Sigmoid]] function with max = 1
*If $$y = 0; \mathscr{L}(\hat{y},y) = - \log{(1-\hat{y})} $$
:For the loss to be small, $$\log{(1-\hat{y})}$$ has to be as large as possible. i.e. (1-y) has to be large as possible and thus $$\hat{y}$$ has to be smallest, but it is limited by [[Sigmoid]] function with min = 0
<<<
!! Loss function vs Cost function
<<<
This ''loss function'' was to measure peformance at a single training example. ''Cost function '' measure the performance on the entire training set. So the cost function for logistic regression can be defined as
$$\displaystyle{J(w,b) = \frac{1}{m} \sum_{i=1}^{m} \mathscr{L}(\hat{y},y) }$$
which can be expanded to
$$
\displaystyle{J(w,b) = - \frac{1}{m} \sum_{i=1}^{m} \bigg[y^{(i)}\log{\hat{y}^{(i)}} + (1-y^{(i)})\log{(1-\hat{y}^{(i)})}\bigg] }
$$
Training to get $$w, b$$ such that the cost function $$J$$ is minimized.
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]]|[[07 May 2021]],,
[[Word Embeddings]] can also help with [[Analogy Reasoning]]
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th></th><th>Man</th><th>Woman</th><th>King </th><th>Queen</th></tr></thead><tbody>
<tr><td>Gender</td><td>-1</td><td>1</td><td>-0.95</td><td>0.97</td></tr>
<tr><td>Royal</td><td>0.02</td><td>0.02</td><td>0.93</td><td>0.95</td></tr>
<tr><td>Age</td><td>0.03</td><td>0.02</td><td>0.7</td><td>0.69</td></tr>
<tr><td>Food</td><td>0.09</td><td>0.01</td><td>0.02</td><td>0.01</td></tr>
</tbody></table>
Asking what is ''King : ___?___ when Man: Woman''. We know the answer is //queen//.
The algo can figure out using the word embedding as follows
Looking at all combinations of embeddings for different words
$$e_{man} - e_{woman} = \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \end{bmatrix}$$
$$e_{king} - e_{queen} = \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \end{bmatrix}$$
The difference between both these vectors is the gender. hence even the embedding figured out the answer is //queen//
!! Analogies using word vectors
$$e_{man} - e_{woman} = e_{king} - e_{?} $$
Find word w:
<<<
$$ \arg \max_w sim(e_w, e_{king} -e_{man} + e_{woman})$$
<<<
<img src='https://www.ed.ac.uk/files/styles/landscape_breakpoints_theme_uoe_mobile_1x/public/thumbnails/image/diagram-20190710.png?itok=9oAxK0yB' width=500>
This parallelogram kind of relationship can only be seem in the original 300D space. but if [[t-SNE]] is used for visualizing, it uses a non-linear mapping to visualize 300D to 2D plots and this kind of relationship will not be visible in the mapping
Most commonly used similarity is the [[Cosine Similarity]]. You can also use [[Euclidean Distance]], which will be a measure of dissimilarity than similarity. [[Cosine Similarity]] is used much more often, because it also normalizes for the length of the vectors.
,,[[COURSE5: Sequence Models]] | [[20 August 2021]],,
![[RESNET]]s
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[25 June 2021]],,
!!!Bias variance analysis changes when the train distribution differs from test/dev set distributions.
<<<
For the case below we can say 9% variance problem and should try variance reduction techniques. This no longer applies when distribution of train is different from dev/test sets. It may mean, that the train set was easy to learn was dev set was much more harder. So 10% error in that case, might be reasonable.
<table>
<tbody>
<tr><td>Human Error</td><td>~0%</td></tr>
<tr><td>Training Error</td><td>1.0%</td></tr>
<tr><td>Dev Error</td><td>10%</td></tr>
</tbody></table>
<<<
From training to dev set
* Algorithm saw some data not present in training but present in dev
* Distribution of dev is different, so it's difficult to isolate the variance out of 9%
''Training Dev Set '' - Carve out some data from training which will have same distribution as training but not used for training. Now compute the error rates on these datasets
<<<
<table>
<tbody>
<tr><th>Dataset</th><th>Case1</th><th>Case2</th><th>Case3</th></tr>
<tr><td>Human Error</td><td>~0%</td><td>~0%</td><td>~0%</td></tr>
<tr><td>Training Error</td><td>1%</td><td>1%</td><td>10%</td></tr>
<tr><td>Train-Dev Error</td><td>9%</td><td>1.5%</td><td>11%</td></tr>
<tr><td>Dev Error</td><td>10%</td><td>10%</td><td>12%</td></tr>
</tbody></table>
''CASE 1''
* 8% variance problem
* 1% data mismatch problem
''CASE 2''
* 0.5% bias problem
* 8.5% data mismatch problem
''CASE 3''
* 10% Avoidable bias problem
* 1% variance problem
* 1% data mismatch problem
<<<
!! General Principles
<table>
<tbody>
<tr><td>Human Error</td><td>4%</td><td></td></tr>
<tr><td>Training Error</td><td>7%</td><td>3% Avoidable Bias</td></tr>
<tr><td>Training-Dev Error</td><td>10%</td><td>3% Variance Problem</td></tr>
<tr><td>Dev Error</td><td>12%</td><td>2% Variance Problem</td></tr>
<tr><td>Test Error</td><td>12%</td><td>Degree of overfitting to dev (find a bigger dev set)</td></tr>
</tbody></table>
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[16 May 2021]],,
$$
\begin{bmatrix}
a & aaron & ... & orange & ... & Zulu & UNK \\
. & . & . & . & . &. & .\\
. & . & . & . & . &. & .\\
. & . & . & . & . &. & .\\
\end{bmatrix}^{300 \times 10000} \begin{bmatrix} 0 \\ . \\ . \\ 1 \leftarrow 6257 \\ . \\. \end{bmatrix}^{10000 \times 1}
$$
$$
\begin{matrix} E. O_{6257} & = & e_{6257} \\ (300 \times 10000) . (10000 \times 1) & = &(300 \times 1) \end{matrix}$$
More generally, embedding for the word $$j \Rightarrow E.O_j = e_j$$
Technically, while implementing word embedding extraction, it is not implemented as matrix multiplication. This is achieved by using a lookup that just pulls the column out, because matrix multiplication is inefficient with large dimensional vector vocabulary.
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! Gradient Descent
<<<
Repeat {
$$w:= w -\alpha\frac{dJ(w)}{dw}$$
}
where,
* $$\alpha$$ = learning rate,
* $$\frac{dJ(w)}{dw}$$ is the update to the parameter
* $$:=$$ stands for update
<<<
<img src='https://miro.medium.com/max/2124/1*WGHn1L4NveQ85nn3o7Dd2g.png' width = 600>
* When initialized towards the right of the curve, $$\frac{dJ(w)}{dw} > 0$$, during update $$\alpha \times \frac{dJ(w)}{dw}$$ is subtracted from the weight and the point moves to the left.
* Similarly, at when initialized at the left side in the curve, $$\frac{dJ(w)}{dw} < 0$$, during update $$\alpha \times \frac{dJ(w)}{dw}$$ gets added to $$w$$ and the point moves towards right.
In both cases, the movement of point is approaching minima, whether you initialize at point A or B.
The cost function $$\mathcal{J}$$ is a function of both $$w, b$$. So the gradient descent equations for parameter updates for $$w, b$$ will be
$$
w := w - \alpha\frac{\partial J(w,b)}{\partial w}
$$
$$
b := b - \alpha\frac{\partial J(w,b)}{\partial b}
$$
where $$\partial$$ is the partial derivative, similar to $$d$$ but it is used when there are derivates required to be computed for more than one variable.
Tags: [[COURSE1: Neural Networks & Deep Learning]]| [[04 June 2021]]
!Understanding Exponentially Weighted Averages
$$V_{100} = 0.1 \times \theta_{100} + 0.1 \times 0.9 \times \theta_{100} + 0.1 \times 0.9^2 \times \theta_{100} + ...$$
<img src=''>
The coefficients of $$\theta$$ adds up to $$\approx$$ 1
$$0.9^{10} \approx 0.35 \approx 1/e$$. So it takes ~10 days for $$\beta = 0.9$$ to decay exponentially
!! Implementing EMAs
<<<
$$V_\theta = 0 \leftarrow$$ initialize to ZERO
$$V_\theta := \beta V_\theta + (1-\beta)\theta_1$$
$$V_\theta := \beta V_\theta + (1-\beta)\theta_2$$
...
<<<
This is ''highly efficient'' since storing only one real number as it gets replaced - memory saved. This is noticed when computed for large number of units.
This is not an accurate average, but it is most efficient and widely used in [[Machine Learning]]. More accurate would be to take all values of $$\theta$$ and average over 10 days, but requires storing last 10 values
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[17 June 2021]],,
!Why Do Resnets work Well?
<img src='http://media5.datahacker.rs/2019/02/why_1_ispr.png' width=1000>
Consider a case where a Big NN takes input x and outputs a. The other network just adds a residual block at the end.
Let's say all the layers are using ReLU [[Activation Function]] which means $$a \geq 0$$
$$a^{[l+2]} = g(z^{[l+2]} + a^{[l]}) = g(W^{[l+2]}a^{[l+1]} + b^{[l+2]} + a^{[l]})$$
if $$W^{[l+2]} = b^{[l+2]} = 0$$ then $$^{[l+2]} = g(a^{[l]}) = a^{[l]}$$
This means for a [[Residual Block]], it is easy to learn the identity function and hence addition of two extra layers do not hurt performance.
Assumes $$z^{[l+2]}$$ and $$a^{[l]}$$ have the same dimensions, so in [[RESNETS]], [[Same Convolution]]s are used so that the dimensions are same to allow [[Skip Connection]]s.
If dimensions are not same, then $$W_s$$ weight matrix is used $$\rightarrow a^{[l+2]} = (W^{[l+2]}a^{[l+1]} + b^{[l+2]} + W_s a^{[l]})$$. if $$a^{[l]}$$ is $$128$$ dimensional and $$a^{[l+2]}$$ is $$256$$ dimensional then $$W_s = 256 \times 128 $$ dimensional, so that the addition operation can be performed
* $$W_s$$ can be a matrix of parameters we learned
* it could be a fixed matrix , that just implements ZERO [[Padding]]
!! Resnet from Images
<img src='https://miro.medium.com/max/1024/1*BnoNVpj7uCNMOFOj1DQBQA.png' width=1000>
,,Tags: [[RESNET]] | [[COURSE4: Convolutional Neural Networks]] | [[28 June 2021]],,
!Bias Correction in Exponentially Weighted Averages
* E = Expected Curve
* A = Actual Curve
<img src=''>
<<<
$$V_0 = 0 $$
$$V_1 = 0.98 \ V_0 + 0.02 \ \theta_1 = 0.02 \ \theta_1$$
$$V_2 = 0.98 \ V_1 + 0.02 \ \theta_2 = 0.98 \times 0.02 \ \theta_1 + 0.02 \ \theta_2$$
<<<
$$V_2$$ will be much lower than both $$\theta_1$$ and $$\theta_2$$. Hence it is not a good estimate. So modify the estimate and use $$V_t/(1-\beta^t)$$. When $$t = 2$$ then, $$1-\beta^t = 1 - 0.98^2 = 0.0396$$.
$$\frac{V_2}{0.0396} = \frac{0.0196 \ \theta_1 + 0.02 \ \theta_2}{0.0396}$$. Becomes the weighted average of both $$\theta_1$$ and $$\theta_2$$ and hence removes the bias.
So when $$t$$ is large, $$1-\beta^t \approx 0$$ and bias correction won't make any difference
[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]
! Derivatives
* derivative $$\approx$$ slope
* straight line - slope remains same
Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[04 June 2021]]
* [[Language Modelling]] is itself a good way to learn [[Word Embeddings]]. Using a NN to predict the next word in the sequence
!! Neural Language Model
$$\begin{matrix} I & Want & a & glass & of & orange & (? \leftarrow prediction) \\
4343 & 9665 & 1 & 3852 & 6163 & 6257 \end{matrix}$$
$$
\begin{matrix}
\begin{matrix} I \\ want \\ a \\glass \\ of \\ orange
\end{matrix}
\rightarrow
\begin{matrix} O_{4343} \\ O_{9665}\\ O_{1} \\O_{3852}\\ O_{6163} \\ O_{6257}
\end{matrix}
\begin{matrix} \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\
\end{matrix}
\begin{matrix} e_{4343} \\ e_{9665}\\ e_{1} \\ e_{3852}\\ e_{6163} \\ e_{6257}
\end{matrix}
\begin{matrix} \ \ \rightarrow \\ \ \ \rightarrow \\ \ \ \rightarrow \\ \ \ \rightarrow \\ \ \ \rightarrow \\ \ \ \rightarrow \\ \end{matrix}
\begin{bmatrix} \bigodot \\ \bigodot \\\bigodot \\\bigodot \\\bigodot \\\bigodot \\
\end{bmatrix}
\longrightarrow \bigodot (softmax)
\end{matrix}
$$
* If E is a 300 dim and vocabulary is 10,000 dim, then for this example the embdding layer is 6 x 300 = 1800 dimensional
* it is in the algorithm's incentive to learn [[Word Embeddings]] for orange similar to apple, because it allows to fit the training set better.
!! Other context/ target pairs
//I want a glass of orange juice to go along with my cereal//
Context - last 4 words (A glass of orange)
Target - next word (juice)
* If you want to build language model - it is natural to use last few words as context for target word
* but if, you are building a Word Embedding, you can try alternative contexts like
** [[Continuous Bag of Words (CBOW)]] - four words on the left and four on the right to predict the word in the middle
** Use the last one word
** Nearby 1 word - this works pretty well. Some word nearby. [[Skip Gram]] model
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!Networks in Networks and 1x1 Convolutions
* Network in Network = [[1x1 Convolution]]
* For a conv layer with multiple channels
:<img src='http://media5.datahacker.rs/2019/02/16_2_new.png' width=700>
: it takes each number across $$1\times1$$ block in the image across 32 channels. It multiplies the number in [[Convolution]] layer for each filter and applies non-linearity (ReLU)
* This acts like a [[Fully Connected]] applied to all 36 positions, that inputs 32 numbers and outputs # filters for all 36 positions
* Influenced [[Inception]] Network, but not widely used itself
* can be used to shrink the $ of channels ($$n_C$$) just like the pooling layer does for $$n_H, n_W$$.
* It adds non-linearity to learn a complex function if $$n_c^{[l]} = n_c^{[l+1]}$$
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[28 June 2021]],,
!!! Carry out error analysis to try to understand difference between training and dev/test sets.
* look only at the dev set to avoid overfitting to the test set
!!! Make training data more similar; or collect more data to dev/test sets
* For example, for a rear view speech recognition production, if your dev data has much more car noise, try overfitting data with more car noise and train
!! Artificial Data Synthesis
* Clean Audio (10,000 hours) + Car Noise (1 hour) = Synthesized in-car audio. Using only 1 hour of car noise, you are fitting to that car noise, which can only be a subset of all car noises.
* Another example, for a car recognition model, you can use images from a video game, but that game may only have 20 cars with different colors and your model may overfit to the set of those 20 cars even though it may look okay for the human eye.
* Artificial data synthesis can significantly boost the performance of systems that are already very good
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[16 May 2021]]
,,
! Computation Graph
!! Illustration
Assume a function $$J(a,b,c) = 3(a +bc)$$. The computation of $$J$$ can be broken down into 3 steps as follows:
* $$b.c = u$$
* $$u+a = v$$
* $$3v = J$$
The computation of J in these 3 steps is called a ''forward pass''. And, if we were to compute gradients with respect to a, b, c, then it would be called ''backward pass''.
<img src='https://lrscy.github.io/2018/10/22/DeepLearningNotes-NNandDL/Computing_Derivatives.png' width=700>
This comes in handy when some special variable is being optimized like [[Cost Function]]. In [[Logistic Regression]], we are trying to minimize the cost function $$\mathcal{J}$$ which would require us to compute derivates in the backward pass using computation graph.
Tags: [[COURSE1: Neural Networks & Deep Learning]]|[[04 June 2021]]
! [[Gradient Descent with Momentum]]
* almost always works faster than [[Gradient Descent]]
* Use [[Exponentially Weighted Averages]] to compute weighted average of gradients which are used to update the weights
<img src=''> USE IMAGE
[[Gradient Descent]] would take a lot of steps $$\rightarrow$$ slows down learning and finding optimum $$\rightarrow$$ prevents using much larger learning rate because the results may diverge
* Slower on vertical axis
* Faster learning on horizontal axis
!! On iteration $$t$$:
<<<
Compute $$dW, db$$ on current [[Mini-batch]]
$$V_{dw} = \beta V_{dw} + (1-\beta) dW$$
$$V_{db} = \beta V_{db} + (1-\beta) db$$
$$W := W - \alpha V_{dW}$$
$$b := b - \alpha V_{db}$$
where $$V_{dw}$$ & $$ V_{db} $$ smooths out [[Gradient Descent]]
<<<
because of this, in the vertical direction the oscillation becomes $$\approx 0 $$ . All derivatives will point towards the right in the horizontal direction and average will be big, which allows the [[Algorithm]] to take a straight-forward path and damp out the oscillations.
<img src='https://miro.medium.com/max/1684/0*TKxSMrG2xPLtcRVy.png' width=500>
''Intuition''
<<<
Minimizing a bowl shaped function. Derivative terms could be thought of as a ball rolling down a bowl and momentum terms represent the velocity and $$\beta$$ plays the role of friction
<<<
* $$\beta = 0.9 \leftarrow$$ most common value (last 10 iterations)
* Bias correction in EMA. People generally don't use this much since they only need to wait for 10 iterations to complete
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[17 June 2021]],,
!Inception Network Motivation
What an [[Inception]] layer says instead of choosing what filter size you want in a [[Convolution]] layer, let's do them all
!! Inception Module
* Instead of committing to one [[Convolution]]/[[Pooling]] layer one at a time, you can use them all and concatenate the output.
* The problem here is the computational cost
<img src='http://media5.datahacker.rs/2018/11/inc_1_ispravljeno.png' width = 700>
!! Computational Cost
$$28 \times 28 \times 192 \rightarrow \bigg[ 32$$ filters $$5\times5 $$ SAME CONV $$\bigg]\rightarrow 28 \times 28 \times 32$$
* Number of points to compute = output size = $$28 \times 28 \times 32$$
* Number of computations to perform to compute each point = filter size $$\times $$ input channels = $$5 \times 5 \times 192$$
* Total Computations to be performed = $$(5 \times 5 \times 192) \times (28 \times 28 \times 32) = 120,422,400 \approx 120$$ Million
!!Using [[1x1 Convolution]] to reduce computational cost
$$28 \times 28 \times 192 \rightarrow \bigg[ 16$$ filters $$1\times1 $$ CONV $$\bigg] \rightarrow 28 \times 28 \times 16 $$ ([[Bottleneck Layer]])$$\rightarrow \bigg[ 32$$ filters $$5\times5 $$ CONV $$\bigg]\rightarrow 28 \times 28 \times 32$$
* Computations to shrink volume using 1x1 conv filter$$= (28 \times 28 \times 16) \times (1 \times 1 \times 192) = 2,408,448 \approx 2.4$$ Million
* Computation from bottleneck layer to output layer $$ = (28 \times 28 \times 32) \times (5 \times 5 \times 16) = 10,035,200 \approx 10$$ Million
* Total Computations performed $$ = 2.4 + 10 = 12.4 $$ Million
This is 1/10th number of computations performed without using [[1x1 Convolution]] layer. And, so long as the [[Bottleneck Layer]] is implemented within reason, you can shrink down the representation size significantly and it doesn't hurt performance but saves a lot of computation
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[28 June 2021]],,
[[word2vec]] is simple and computationally efficient
[[Skip Gram Model]] - context target pairs
* context - random word
* target - random word within some window of context word
//I want a glass of orange juice to go along with my cereal//
<table>
<thead>
<tr>
<th>Context</th>
<th>Target</th>
<th>Distance</th>
</tr>
</thead>
<tbody>
<tr>
<td>Orange</td>
<td>Juice</td>
<td>1</td>
</tr>
<tr>
<td>Orange</td>
<td>Glass</td>
<td>-2</td>
</tr>
<tr>
<td>Orange</td>
<td>My</td>
<td>6</td>
</tr>
<tr>
<td>.</td>
<td>.</td>
<td>.</td>
</tr>
<tr>
<td>.</td>
<td>.</td>
<td>.</td>
</tr>
</tbody>
</table>
The goals is not to do well on the [[Supervised Learning]] problem, but to learn good [[Word Embeddings]]
!! Model - [[Skip Gram]]
* Vocab size - 10,000
* Context '$$c$$' (orange) $$\rightarrow$$ target '$$t$$' (juice)
* $$O_c$$ [[One-hot Encoding]] for c $$\rightarrow E \rightarrow e_c = E.O_c \rightarrow \bigodot \rightarrow \hat{y}$$
* Softmax: Probability of different target words given different context words
$$
P(t|c) = \frac{e^{\theta_t \mathsf{T} e_c}}{\sum_{j=1}^{10000}e^{\theta_j \mathsf{T} e_c}}
$$
:where $$\theta_t$$ is the parameter associated with the output $$t$$
: ''Loss''
$$
\mathscr{L}(\hat{y}, y)= -\sum_{i=1}^{10000} y_i\log {\hat{y}_i}
$$
: where both $$y$$ and $$\hat{y} \in 10000$$ dim
!!! Problems
''Primary'': computational speed.
* Need to carry out summation over 10,000 words in vocab every time the probability is evaluated
* Really slow if vocab is of the order of millions
* ''Solution'': Using Hierarchical [[Softmax]] [[Classifier]]. Instead of categorizing something into all 10,000 categories, use a classifier to separate whether the target words is in the first 5k or second 5k of the vocab.
** This can be a [[Binary Classification]], so we don't have to sum over all 10k categories.
** This need not be perfectly balanced. Can also classify common words vs rare words
!! How to sample context $$c$$?
* Sample Uniformly - but also end up picking [[Stopwords]] like //the, a, and, to// etc..
* Can use a different heuristic to sample less occuring words
,,Tags: [[COURSE5: Sequence Models]] | [[20 August
2021]],,
!! Computation Graph
In the equation $$J(a,b,c) = 3(a+b.c)$$, the steps involved in computation graph are
* b.c = u
* u + a = v
* 3v = J
!! Derivatives
* Derivative w.r.t $$v$$ - One step [[Backpropagation]] :
** $$v = 11 \rightarrow J = 33$$
** $$v = 11.001 \rightarrow J = 33.003 $$
** $$\frac{dJ}{dv} = 3$$, since the $$J$$ changes by 3 units for every unit change in v.
* Computing derivative w.r.t $$a$$
** $$a = 5 \rightarrow v = 11 \rightarrow J = 33$$
** $$a = 5.001 \rightarrow v = 11.001 \rightarrow J = 33.003$$
[[Chain Rule]] -
$$
\frac{dJ}{da} = \frac{dv}{da} . \frac{dJ}{dv}
$$
$$
\frac{dJ}{du} = \frac{dJ}{dv} . \frac{dJ}{du} = 3.1 = 3$$
$$
\frac{dJ}{db} = \frac{dJ}{du} . \frac{du}{db} = 3.c = 3.2 = 6$$
$$
\frac{dJ}{dc} = \frac{dJ}{du} . \frac{du}{dc} = 3.b = 3.3 = 9
$$
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[05 June 2021]],,
!Inception Network
!! Inception Module
<img src='http://media5.datahacker.rs/2018/11/inception_module.png' width=500>
* [[1x1 Convolution]] to [[Max Pooling]] is applied to reduce the number of channels in the output layer
* [[1x1 Convolution]] is used before $$3 \times 3, 5 \times 5$$ layers to reduce computational cost discussed in [[WEEK2:06 Inception Network Motivation]]
!! Network
<img src='https://cdn.analyticsvidhya.com/wp-content/uploads/2018/10/googlenet.png' width=1000>
INPUT $$\rightarrow$$ CONV $$\rightarrow$$ MAXPOOL $$\rightarrow$$ LRN $$\rightarrow$$ CONV $$\rightarrow$$ CONV $$\rightarrow$$ LRN $$\rightarrow$$ MAXPOOL $$\rightarrow$$ INCEPTION $$\rightarrow$$ INCEPTION $$\rightarrow$$ MAXPOOL $$\rightarrow$$ INCEPTION $$\times 5 \rightarrow$$ MAXPOOL $$\rightarrow$$ INCEPTION $$\times 2 \rightarrow$$ AVGPOOL $$\rightarrow$$ FC $$\rightarrow$$ SOFTMAX
* There are some sidebranches. These branches takes the hidden layers and makes a prediction using [[Softmax]]. This ensures that the features created in the hidden layers are not too bad for the cause that is predicted. This tends to have [[Regularization]] effect on the [[Inception]] network and helps prevent [[Overfitting]].
* Developed by the authors at [[Google]], [[GoogLeNet]]
!! Where does the word [[Inception]] comes from?
* The actual paper cites this meme
<img src='https://i.kym-cdn.com/photos/images/original/000/531/557/a88.jpg'>
!! References
<embed src="https://arxiv.org/pdf/1409.4842.pdf" width="500" height="200">
[[COURSE4: Convolutional Neural Networks]]
!! Negative Sampling
* Similar to [[Skip Gram]], but much more efficient
* Create a new [[Supervised Learning]] problem - ''Given a pair of words, predict it whether it is a (context, target) pair''
//I want a glass of juice to go along with my cereal//
<table>
<thead>
<tr>
<th>Context ($$c$$)</th>
<th>Target ($$t$$)</th>
<th>Label</th>
</tr>
</thead>
<tbody>
<tr>
<td>Orange</td>
<td>Juice</td>
<td>1</td>
</tr>
<tr>
<td>Orange</td>
<td>king</td>
<td>0</td>
</tr>
<tr>
<td>Orange</td>
<td>book</td>
<td>0</td>
</tr>
<tr>
<td>Orange</td>
<td>the</td>
<td>0</td>
</tr>
<tr>
<td>Orange</td>
<td>of</td>
<td>0</td>
</tr>
</tbody>
</table>
!! How do you chose $$k$$?
* k = 5 - 20 for smaller datasets
* k = 2 - 5 for larger datasets
* Larger value for smaller datasets and vice versa.
$$P(y=1|c,t) = \sigma(\theta_t^{\mathsf{T}} e_c)$$
where,
* $$e_c$$ = embedding for context word $$c$$
* $$\theta_t^{\mathsf{T}}$$ = parameter vector $$\theta$$ for possible target word $$t$$
* $$P(y=1|c,t) \Rightarrow$$ = 1, given ($$c,t$$) context-target pair
If k examples here, $$k:1$$ ratio where k negative sample for each positive sample
$$O_{6257} \rightarrow E \rightarrow e_{6257} \rightarrow \begin{bmatrix} \bigodot \\ \bigodot \\ ... \\ \bigodot \\ \end{bmatrix}$$
10,000 binary [[Logistic Regression]] classifier, of which only 5 of them are trained at a time. Thus converting 10,000 way softmax problem into 10,000 binary classification problems, each of which is quite cheap to compute (k+1) trained at a time. This technique is called [[Negative Sampling]], because with a positive sample you deliberately generated some negative samples.
!! how do you chose negative samples?
* sample according to emperical frequency of words.
** ''Problem'': very high repetition of [[Stopwords]]
* Extreme: 1/vocabsize
** ''Problem'': not very representative of distribution of words
* Authors identified a heuristic
:$$P(W_i) = \frac{W_i^{3/4}}{\sum_{j=1}^{10000}f(W_j)^{3/4}}
$$
:* where, $$f(W_i)$$ = observed frequency of word in english langugage on the training set
:* falls somewhere in between taking uniform distribution and the observed distribution on the training set
:* Not theoretically justified
:* Works decently well
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! RMSProp
* [[RMSProp]] - Root Mean Square Propogation
* Can also speed up [[Gradient Descent]]
!! On iteration $$t$$:
<<<
Compute $$dW, db$$ on current [[Mini-batch]]
$$S_{dw} = \beta_2 S_{dw} + (1-\beta_2) dW^2$$
$$S_{db} = \beta_2 S_{db} + (1-\beta_2) db^2$$
$$W := W - \alpha \frac{dW}{\sqrt{S_{dW} + \varepsilon}}$$
$$b := b - \alpha \frac{db}{\sqrt{S_{db} + \varepsilon}}$$
$$\varepsilon$$ is a small quantity $$=10^{-8}$$ (resonable default) to avoid division by $$0$$
<<<
the direction in which the oscillations are large, $$S_{dw}, S_{db}$$ will end up being large, so the update will be small. It intuitively works out in the similar fashion to [[Gradient Descent with Momentum]], damping out the oscillations and allowing the [[Gradient Descent]] to optimize much faster.
$$\beta^{Momentum} \neq \beta_2^{RMSProp}$$
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
Taking knowledge a [[Neural Network]] has learned on one task and apply it to separate task.
Let's say, trained a [[Neural Network]] to predict images for cats, can use the same network to adapt for radiology diagnosis.
$$ X \rightarrow \square \rightarrow \square \rightarrow \hat{y} $$
In this network, you can delete the last layer in the network and the weights in the last layer and create a new set of randomly initialized weights just for the last layer and have that output radiology diagnosis. The dataset can be swapped with the new data and retrain the NN
$$ X_{new} \rightarrow \square \rightarrow \blacksquare \rightarrow \hat{y} $$
!! Retraining Neural Network
* Small dataset - just retrain the last layer and freeze preceding layers
* Enough/Large data - train all the layers in the NN
''Pre trained network''
:$$ X_{audio} \rightarrow \square \rightarrow \square \rightarrow \square \rightarrow \square \rightarrow \hat{y}$$
''NN for transfer learning''
:$$ X_{audio} \rightarrow \square \rightarrow \square \rightarrow \square \rightarrow \blacksquare \rightarrow \blacksquare \rightarrow \hat{y}$$
!! When does transfer learning makes sense?
When you have lot of data from the problem you are transferring to the problem where you have less data. For example, Transfer learning from [[Image Recognition]] and [[Speech Recognition]] where you have data of the order 1,000,000 images and 10,000 hours respectively, to the problem of Radiology image classification (10,000 images) and Trigger word detection (1 hour of data)
If the opposite was true, low data on the problem transferring from and huge data on the problem transferring to, then it does not make sense to use [[Transfer Learning]]. Instead train a new model.
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[16 May 2021]],,
!Adam Optimization
* Adaptive Moment Estimation
* [[Adam]] = [[RMSProp]] + [[Gradient Descent with Momentum]]
!! Adam Implementation
Initialize $$V_{dw} =V_{db} = S_{dw} = S_{db} = 0$$
!! On iteration $$t$$:
<<<
Compute $$dW, db$$ on current [[Mini-batch]]
$$V_{dw} = \beta_1 V_{dw} + (1-\beta_1) dW$$
$$V_{db} = \beta_1 V_{db} + (1-\beta_1) db$$
$$S_{dw} = \beta_2 S_{dw} + (1-\beta_2) dW^2$$
$$S_{db} = \beta_2 S_{db} + (1-\beta_2) db^2$$
$$V_{dw}^{corrected} = V_{dw}/ (1-\beta_1^t)$$
$$V_{db}^{corrected} = V_{db}/ (1-\beta_1^t)$$
$$S_{dw}^{corrected} = S_{dw}/ (1-\beta_2^t)$$
$$S_{db}^{corrected} = S_{db}/ (1-\beta_2^t)$$
$$W := W - \alpha \Bigg[\frac{V_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected} + \varepsilon}}\Bigg]$$
$$b := b - \alpha \Bigg[\frac{V_{db}^{corrected}}{\sqrt{S_{db}^{corrected} + \varepsilon}}\Bigg]$$
$$\varepsilon$$ is a small quantity $$=10^{-8}$$ (resonable default) to avoid division by $$0$$
<<<
''Hyperparameters''
* $$\alpha$$ - [[Learning Rate]] - needs to be trained
* $$\beta_1 = 0.9$$
* $$\beta_2 = 0.999 \rightarrow$$ recommended by authors of Adam
* $$\varepsilon = 10^{-8}\rightarrow$$ recommended by authors of Adam
:can also tune $$\beta_1$$ & $$\beta_2$$ but not done often
,,Tags:[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
!! GloVe
* Not used as much as [[word2vec]] or [[Skip Gram]] Model
* Simple algorithm
* GloVe stands for Global Vectors for Word Representation
$$X_{i,j}:$$ number of times the word $$j/t$$ appears in the context of $$i/c$$
* $$X_{ij} = X_{ji}$$ - for some definition of context and target words
* $$X_{ij} \neq X_{ji}$$ - where context and target appear simultaneously next to each other
!! Model
$$
\sum_{i=1}^{10000} \sum_{j=1}^{10000} f(X_{ij}) (\theta_i^{\mathsf{T}}e_j + b_i + b_j' - \log X_{ij})^2
$$
* $$f(X_{ij}) = 0, if X_{ij} = 0 \Rightarrow $$ don't bother to compute if the target word $$t$$ does not appead in the context of word $$c (i)$$
* [[Stopwords]]: reduces the weight for frequent terms
* infrequent words: gives importance (not to little weight)
* $$\theta_i, e_i$$ are symmetric: some optimization objectives if the quantities are swapped
* ''Training'': Initialize $$\theta$$ and $$e$$ both uniformly and random and run [[Gradient Descent]] to minimize the objective and take average, because $$\theta$$ and $$e$$ are symmetric unlike [[Skip Gram]]
: $$e_w^{final} = (e_w + \theta_w) / 2$$
!! A note on featurization view of word embeddings
* Learning [[Word Embeddings]] using algorithm does not guarantee the individual components of the embeddings are interpretable
* parallelogram map still works
<img src='dummy'>
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! [[Logistic Regression]] [[Gradient Descent]]
!! Forward prop equations
$$
z = w^Tx + b \\ \hat{y} = a = \sigma(z) \\ \mathcal{L}(a,y) = -(ylog(a) + (1-y)log(1-a))
$$
If there are only two input variables $$x_1, x_2$$ with weights respectively as $$w_1, w_2$$ and bias as $$b$$, we can define the computation graph as follows
<img src='http://media5.datahacker.rs/2018/06/img_29_new.png' width=700>
!! Gradients
$$
da = \frac{d\mathcal{L}}{da} = -\frac{y}{a} + \frac{1-y}{1-a} \\
dz = \frac{d\mathcal{L}}{dz} = \frac{d\mathcal{L}}{da} . \frac{da}{dz} = (-\frac{y}{a} + \frac{1-y}{1-a}) . (a.(1-a)) = a -y \\
dw1 = \frac{d\mathcal{L}}{dw_1} = x_1 . \frac{d\mathcal{L}}{dz} \\
dw2 = \frac{d\mathcal{L}}{dw_2} = x_2.\frac{d\mathcal{L}}{dz} \\
db = \frac{d\mathcal{L}}{db} = \frac{d\mathcal{L}}{dz}
$$
!! Updating Parameters
$$ w_1 := w_1 - \alpha dw_1$$
$$ w_2 := w_2 - \alpha dw_2$$
$$ b := b - \alpha db$$
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[05 June 2021]],,
![[MobileNet]]
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[03 July 2021]],,
!! MobileNet
!! [[MobileNetV2]] - using bottleneck block
[[COURSE4: Convolutional Neural Networks]]
[[Transfer Learning]] is sequential. [[Multi-task learning]] is where you are trying to learn from multiple tasks simultaneously. It is unlike [[Softmax Regression]] where one image has multiple labels.
$$
X \rightarrow \square \rightarrow \square \rightarrow \begin{bmatrix} o \\ o \\ o \\ o\end{bmatrix}
$$
For example, in [[Self-Driving Car]], in a single image you are trying to detect a pedestrian, a car, a stop sign and traffic light.
For training this [[Neural Network]], you need to define the [[Loss Function]] as
$$
\mathscr{L} \hat{y}^{(i)} = \frac{1}{m} \sum_{i=1}^m \sum_{j=1}^4 \mathscr{L}(\hat{y}_j^{(i)}, y_j^{(i)})
$$
where,
* $$m$$ - number of training samples
* $$\mathscr{L}$$ - Logistic loss
* $$j$$ - for each objective
You could have also trained four separate Neural Networks, but since all the features are of the NN are shared by all the four objectives, this setup leads to better performance than training separate NN.
''This also works if only some of the images have some of the labels''
$$
Y = \begin{bmatrix} 0 & 1 & ? \\ 1 & 1 & ? \\ ? & 0 & 1 \\ ? & ? & 0 \end{bmatrix}
$$
where, $$?$$ stands for ''don't cares'' since the loss function won't get computed for objective 3 and 4 in training sample 1.
!! When does a multi-task learning makes sense?
* Training on a set of tasks that could benefit from having shared lower level features
* Usually (not always true) - amount of data you have is quite similar across all objectives
* Can train a big enough [[Neural Network]] to do well on all tasks
''It only hurts performance in multi-task learning vs training separate NN is when NN is not big enough''
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[22 May 2021]],,
! [[EfficientNet]]
How can you automatically scale up or down neural networks for a particular device. EfficientNet gives a way to do so
* You can train a baseline NN where
** Input image has resolution - r
** NN has certain depth - d
** Layers have certain width - w
Scaling up and down a NN is changing parameters r, d, w
''Questions''
* Given a particular computational budget, what is the good choice of r, d, w?
* How could you use compound solution (both scaling up and down simultaenously)
* What is the rate at which you should scale up or down?
* What is the tradeoff between r, d, w ?
,,Tags: [[COURSE4: Convolutional Neural Networks]]|[[03 July 2021]],,
There have been some data processing systems or learning systems that require multiple stages of processing, and end-to-end deep learning replaces those multiple stages of learning with a ''single [[Neural Network]]''
!! [[Speech Recognition]]
<<<
In Speech Recognition, there are 3 stages of preprocessing required to actually get the transcript from audio clip.
$$ Audio \rightarrow Features \rightarrow Phonemes \rightarrow Words \rightarrow Transcript $$
In End-to-End [[Deep Learning]] the pipeline will look like below, where in-between steps are being performed by a very large single neural network. ''It requires huge amount of data to perform E2EDL''
$$ Audio \rightarrow Transcript $$
<<<
!! [[Face Recognition]]
<<<
Consider the case where a turnstile is lined to a face detection app, that lets you access to the building by recognizing your face. For end-to-end Deep learning the pipeline will look like
$$ Turnstile \ Image \rightarrow Identity $$
whereas, normally this is a multi-step process
$$ Turnstile \ Image \rightarrow Detect \ Face \rightarrow Crop \ and \ Zoom \rightarrow Detect \ Identity $$
Currently, the 2nd approach works better because it breaks down the problem into two simple tasks
# Face Detection
# Face Recognition
for which we have lot of data to solve the problem separately
<<<
E2E works for [[Machine Translation]] because it has lots of data for $$ X \rightarrow Y$$ mapping
!! Whether to use End to End Deep Learning?
''Pros''
* that it lets the data speak and it does not rely on human preconceptions. For example, in speech recognition, phones are elemental forms of speech that becomes words, but it may not be required to learn from the perspective of an algorithm as it can find its own set of representation from the data.
* less hand designing of components needed thus simplifying the workflow
''Cons''
* Need a lot of data to successfully execute
* It excludes potentially useful hand-design components
** when there is less data, hand designing systems can inject a lot of knowledge about the problem in the algo
Before implementing End to End Deep Learning ask - ''Do you have enough data too learn a function of the complexity needed to map $$ X \rightarrow Y $$ ?''
,,Tags: [[COURSE3: Structuring Machine Learning Projects]] | [[22 May 2021]],,
! Gradient Descent on m examples
''Cost Function '': $$
J(w,b) = \frac{1}{m} \sum_{i=1}^m \mathcal{l}(a^{(i)},y)$$
''Activation'': $$
a^{(i)} = \hat{y}^{(i)} = \sigma(z^{(i)}) = \sigma(w^Tx^{(i)}+b) $$
''Gradient '': $$
\frac{\partial J(w,b)}{\partial w_1} = \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial w_1} \mathcal{L}(a^{(i)},y)$$
!! Psuedocode
Let's initialize $$ J = 0; dw_1 = dw_2 = db = 0 $$
Assuming n=2,
For i = 1 to m:
:$$ z^{(i)} = w^Tx^{(i)} + b $$
:$$ \sigma^{(i)} = \sigma(z^{(i)}) $$
:$$ J = J -\bigg[y^{(i)}log(a^{(i)}) + (1-y^{(i)})log(1-a^{(i)})\bigg] $$
:$$ dz^{(i)} = a^{(i)} - y^{(i)} $$
:$$ dw_1 = dw_1 + x_1^{(i)}dz^{(i)} $$
:$$ dw_2 = dw_2 + x_2^{(i)}dz^{(i)} $$
:$$ db = db + dz^{(i)} $$
:$$ J = J/m $$
:$$ dw_1 = dw_1/m $$
:$$ dw_2 = dw_2/m $$
:$$ db = db/m $$
:$$ w_1 = w_1 -\alpha dw_1 $$
:$$ w_2 = w_2 -\alpha dw_2 $$
:$$ b = b -\alpha db $$
!! Weakness in Implementation
* There are two ''for'' loops. One for all training examples and another for all features to compute $$dw$$ which makes the computation inefficient. [[Vectorization]] will help get rid of these explicit for-loops. As the dataset size gets bigger, it will be difficult to implement this with for-loops
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[05 June 2021]],,
!Learning Rate Decay
* Speed up learning by slowing down the [[Learning Rate]] over time - called [[Learning Rate Decay]]
* For a fixed value of $$\alpha$$, the optimum would wander around minimum, never actually converging. But with learning rate decay, $$\alpha$$ gets smaller overtime allowing the [[Algorithm]] to wander around tighter region of minima
<img src=''>
$$
\alpha = \frac{1}{1 - decay \ rate \times epoch} \alpha_0
$$
:where $$\alpha_0$$ is the initial value of $$\alpha$$
For $$\alpha_0 = 0.2 \ ; \ decay \ rate = 1$$
<<<
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Epoch</th><th>$$\alpha$$</th></tr></thead><tbody>
<tr><td>1</td><td>0.1</td></tr>
<tr><td>2</td><td>0.067</td></tr>
<tr><td>3</td><td>0.05</td></tr>
<tr><td>4</td><td>0.04</td></tr>
</tbody></table>
decay rate becomes a [[Hyperparameter]]
<<<
!! Other [[Learning Rate Decay]]s
*$$\alpha = 0.95^{epoch}\alpha_0$$
*$$\alpha = (k/\sqrt{epoch})\alpha_0$$
*$$\alpha = (k/\sqrt{t})\alpha_0$$ where t is the [[Mini-batch]] number
* staircase decay
:<img src='https://miro.medium.com/max/350/1*HCPpnapq5s_LpHHQD435KA.png' width=250>
* Manual Decay
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
* input piece of text $$\rightarrow$$ like/dislike
* Challenge
** Might not have good labelled dataset
** Using [[Word Embeddings]] + Modest sized labelled dataset $$\rightarrow$$ good [[Sentiment Classification]] model
** training set - 10k - 100k words
$$
\begin{matrix}
x (Text) & y (Sentiment)\\
-------- & -------- \\
The \ dessert \ is \ excellent & \bigstar \bigstar \bigstar \bigstar \bigstar \\
Service \ quite \ slow & \bigstar \bigstar \bigstar
\end{matrix}
$$
!! Simple Model
$$
\begin{matrix}
\begin{matrix} The \\ dessert \\ is \\ excellent
\end{matrix}
\rightarrow
\begin{matrix} O_{8928} \\ O_{2468}\\ O_{4694} \\ O_{3180} \end{matrix}
\begin{matrix} \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\ \ \ \rightarrow E \rightarrow \ \ \\
\end{matrix}
\begin{matrix} e_{8928} \\ e_{2468}\\ e_{4694} \\ e_{3180} \end{matrix}
\begin{matrix} \ \ \rightarrow \\ \ \ \rightarrow \\ \ \ \rightarrow \\ \ \ \rightarrow \\ \end{matrix}
\begin{bmatrix} \bigodot \\ \bigodot \\\bigodot \\\bigodot \\
\end{bmatrix}
\longrightarrow \bigodot (softmax) \rightarrow \hat{y}
\end{matrix}
$$
This algo works for reviews that are short or long, because sum/average all feature vectors/ meaning for all the words
!! [[RNN]] for [[Sentiment Classification]]
Many to One
<img src='https://miro.medium.com/max/900/1*0JO1NbxR-ueZZoGz9CFFEQ.png' width=500>
[[Word Embeddings]] can reflect gender, ethnicity, age, sexual orientation and other biases of the text used to train the model. Some examples for analogy reasoning can show biases, like
* Man : Woman as King : Queen
* Man : Computer Programmer as Woman : ''Homemaker''
* Father : Doctor as Mother : ''Nurse''
The letters in the bold reflect biases of the embeddings
!! Addressing Bias
!!! 1. Identifying Bias Direction
<img src='https://vagdevik.files.wordpress.com/2018/07/debias_n-e1531032268610.png' width=400>
!!! 2. Neutralize
For every word that is not definitional, project to get rid of the bias.
* girl/boy - captures gender and is intrinsic
* Doctor/Babysitter - has to be gender neutral, and also ethnicity neutral and also sexual orientation neutral. Blue line indicates projection of these embeddings to the on to the y-axis to remove bias
!!! 3. Equalize Pairs
<img src='https://vagdevik.files.wordpress.com/2018/07/debias_2.png?w=728&h=299' width=600>
* Grandmother or Grandfather
* Girl or Boy
The difference between grandmother and babysitter is smaller than grandfather and babysitter. Move the points belonging to grandmother and grandfather in pairs so that the distance from babysitter is exactly the same for both words. Do this for all relevant words
!! How do you decide which words should be neutralized?
* Doctor: should be neutralized
* Beard: should not be neutralized
''Train a classifier to find which words to neutralize''. Turns out most words in English are not definitional, meaning gender is not part of the definition and only a small part is definitional (grandmother/grandfather, boy/girl, sorority/fraternity etc.)
!! Which pairs to equalize?
* pairs are small
* handpick most of the pairs that you want to equalize
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!The Problem of Local Optima
* While traning in high dimensional space (say 20,000), you are unlikely to get stuck in local optima. More generally you will find saddle points. For 20,000 dimensions, the curve should look like $$ \bigcup $$ in all directions for it to be a local optima which is highly unlikely. Instead you would see curves that are $$ \bigcup \bigcap$$ which are more likely to be saddle points
:<img src='https://fiennyangeln.github.io/papers/img/local-optima-2.png' width=300>
* [[Saddle Point]] is where derivative is close to 0. This could slow down learning on account of getting stuck in a plateau.
* [[Adam]], [[RMSProp]], [[Gradient Descent with Momentum]] can speed up learning
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
! Using Open Source Implementation
A lot of the NNs discussed are difficult or finnicky to replicate because of a lot of details about tuning of [[Hyperparameter]]s, [[Learning Rate Decay]] and other things. This makes considerable difference to performance. Hence,
* Look for implementation
* Some of these networks take a long time to train and someone would have used multiple GPUs and very large datasets to pre-train these networks and this allows you to do [[Transfer Learning]] using these networks
[[COURSE4: Convolutional Neural Networks]]
!Interview with Yuanqing Lin
<img src='https://miro.medium.com/max/902/1*ejyZAnsez00hz3UQXGBfog.png' width=300>
* Head of [[Baidu Research]]
* PhD from UPenn - majored in [[Machine Learning]]
* [[ImageNet]] winner
* China's National Research Lab
** Building biggest deep learning platform
** datasets, code, computing power on single platform
** Trying to speed up [[Deep Learning]] experimentation
* ''Advice to new comers'': Start with open source frameworks, [[TensorFlow]],[[Caffe]]
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
! Transfer Learning
* Downloading weights for NN and applying them to your use-case
* Open source weights
** Used large training dataset
** Wen through hyperparameter search process
** Took weeks to train
** Trained using many many [[GPU]]s
<img src='https://dummyimage.com/600x400/000/fff' width=250>
Even with a small dataset, using open source weights, you might be able to get good performance on your objective.
''Trick''
* Because if all these early layers are frozen, this acts like fixed function that does not change because not being trained.
* This function can act as a layer and can speed up training by pre-computing that fixed function (final layer) and save them to disk. This acts as a feature vector and shallow NN using that feature vector. This allows you to keep activations handy and pre-computed instead of computing them on the fly
If you have a larger training dataset, freeze fewer layers. The idea is that, with sufficient data you are training more than a single [[Softmax]] unit
For even larger dataset, unfreeze everything and train. The downloaded weights can act as initial weights instead of randomly initializing the weights.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[03 July 2021]],,
Using vectorized implementation instead of an explicit for-loop for $$z = w^Tx +b $$ results in computation speed jumping over 300x. Vectorization takes advantage of [[Single Instruction Multiple Data (SIMD)]] computations to execute code faster
''Rule of thumb: avoid using explicit for-loops within reason''
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[05 June 2021]],,
! [[Data Augmentation]]
* techniques used to improve performance of [[Computer Vision]] tasks
* for almost all computer vision tasks, more data helps
!! Methods
* ''Mirroring ''
**on vertical or horizontal axes depending in use case. Image of a cat can be mirrored on vertical axes for cat detection problem by image of number 4 should not be mirrored vertically since 4 is never written that way for MNIST digits classifiation
:<img src='https://learnopencv.com/wp-content/uploads/2018/05/AlexNet-Data-Augmentation-Mirror-Image.jpg' width=500>
* [[Random Cropping]]
** Crops an image randomly. Idea is that cropped image is still a cat
:<img src='https://learnopencv.com/wp-content/uploads/2018/05/AlexNet-Data-Augmentation-Random-Crops.jpg' width=500>
* ''Rotation''
** Idea: Rotated image is still a cat
:<img src='https://i.stack.imgur.com/UKwFg.jpg' width=500>
* ''Shearing''
**
* ''Local Warping''
* ''Color Shifting''
** Idea - allows the model to be robust to the changes in colors
** R + 20, G + 20, B + 20 ; R + 20, G + 20, B - 20 where +20, -20 are drawn based on some distribution and is oftenly small
* Illumination does not change the contents of the image to be identified
* One of the ways to implement color distortion uses an algorithm called [[Principal Component Analysis]] details are in the [[AlexNet]] paper. The idea is that if the image is mainly purple(red and blue tints) and less green, then PCA color augmentation woulld add/subtract from red and blue more than from green keeping the overall color tint same
!! Implementing Distortions during training
<img src='https://dummyimage.com/600x400/000/fff' width=250>
Implement it as [[multi-threaded]] approach
# One thread will load constant stream of images from disk
# Another thread would run training. Implement it such that this happens in parallel
[[Data Augmentation]] aslo has some [[Hyperparameter]]s, like how much to [[Random Cropping]], color shifting. Often a good place to start is someone else's open source implementation
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[03 July 2021]],,
! Vectorizing Logistic Regression
!! Forward Propagation
''For one training example''
<<<
$$ z^{(i)} = w^T x^{(i)} + b$$
$$ a^{(i)} = \sigma(z^{(i)})$$
<<<
''For m training examples''
<<<
X is a matrix of m training examples with shape $$(n_x,m)$$
$$X = \begin{bmatrix}| & | & ...&|\\x^{(1)} & x^{(2)} & ... & x^{(m)} \\ | & | & ... & |\end{bmatrix}$$
W is a weight matrix associated with $$n_x$$
So, to create a vector of $$z$$,
$$Z = w^TX + \begin{bmatrix}b & b & ... & b\end{bmatrix}$$
which becomes
$$Z = \begin{bmatrix}w^Tx^{(1)} + b & w^Tx^{(2)} + b & ... & w^Tx^{(m)}\end{bmatrix}$$
$$Z = \begin{bmatrix}z^{(1)} & z^{(2)} & ... & z^{(m)}\end{bmatrix} $$
In python, this translates to
```python
z = np.dot(w.T, X) + b
```
where $$b$$ is a real number. While using [[NumPy]] library to add $$b$$ [[Python]] automatically broadcasts the real number into matrix form. Simiarly, for the activation
$$A = \sigma(Z) $$
$$ A = \sigma(\begin{bmatrix}z^{(1)} & z^{(2)} & ... & z^{(m)}\end{bmatrix}) $$.
$$A = \begin{bmatrix}\sigma(z^{(1)}) & \sigma(z^{(2)}) & ... & \sigma(z^{(m)})\end{bmatrix} $$
$$A = \begin{bmatrix}a^{(1)} & a^{(2)} & ... & a^{(m)}\end{bmatrix} $$
In python, this translates to,
```python
a = sigmoid(z)
```
<<<
!! Backward Propagation
''For one training example''
<<<
$$dz^{(1)} = a^{(1)} - y^{(1)}$$
<<<
''For m training examples''
<<<
$$dZ = \begin{bmatrix}dz^{(1)} & dz^{(2)} & ... & dz^{(m)}\end{bmatrix}$$
$$A = \begin{bmatrix}a^{(1)} & a^{(2)} & ... & a^{(m)}\end{bmatrix}$$
$$Y = \begin{bmatrix}y^{(1)} & y^{(2)} & ... & y^{(m)}\end{bmatrix}$$
$$dZ = A - Y = \begin{bmatrix}a^{(1)} - y^{(1)} & a^{(2)} - y^{(2)} & ... & a^{(m)} - y^{(m)}\end{bmatrix} $$
In [[Python]],
```python
dz = a - y
```
<<<
''For weights''
<<<
$$dw = 0$$
$$dw += x^{(1)}dZ^{(1)}$$
$$dw += x^{(2)}dZ^{(2)}$$
$$...$$
$$dw /= m$$
In Python
```python
dw = np.dot(x, dz.T)/m
```
<<<
''For biases''
<<<
$$db = 0$$
$$db += dZ^{(1)}$$
$$db += dZ^{(2)}$$
$$...$$
$$db /= m$$
In Python,
```python
db = np.sum(dz)/m
```
<<<
!! Implementing Logistic Regression - Vectorized
Looping over 1000 iterations of [[Gradient Descent]]
```python
for iter in range(1000):
z = np.dot(w.T, x) + b
a = sigmoid(z)
dz = a - y
dw = np.dot(x, dz.T)/m
db = np.sum(dz)/m
w = w - alpha * dw
b = b - alpha * db
```
,,tags: [[COURSE1: Neural Networks & Deep Learning]]|[[13 June 2021]],,
! Broadcasting
[[Broadcasting]] is a technique you can make use of to run python code faster
!! Handling Bugs
```python
a = np.random.randn(5)
a.shape # (5,) - Rank 1 array
```
The shape (5,) is called a rank 1 array, and this can cause un-intuitive problems when executing codes. Instead of relying on the shape that python delivers, commit to making the shape that you want.
```python
a = np.random.randn(5,1)
a.shape # (5,1)
assert (a.shape == (5,1))
```
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[13 June 2021]],,
!State of [[Computer Vision]]
Practical advice for using [[ConvNet]]s - Data vs hand-enginieering
<img src='https://dummyimage.com/600x400/000/fff' width=250>
When looking at a [[Machine Learning]] algorithm, the learning algorithm has two sources of knowlege.
* Labelled data - (X,Y) pairs
* Hand engineered features/ network architecture and other componenets
It feels like there is less data on [[Computer Vision]] - thus relies more on hand-engineering features (Skillful tasks require insight to get good performance out of network)
Even thought hand-engineering of features has to reduce due to availability of data, there is still requirement for hand-engineering network architecture and tus you see more choices of [[Hyperparameter Tuning]]
!! Tips for doing well on benchmarks and winning competitions
* If you do well on a benchmark, it is easier to get your paper published - lot of attention. It also helps the community to figure out most effective algorithms
* [[Ensembling]]
** Train several networks independently and average their outputs and not weights
** Almost never used in production because the computation increases by a factor of # of neural networks in the ensemble
* Multi Crop at test time
** [[Data Augmentation]] done to test iamges as well
** 10 Crops is the most often used. 1 central crop, 4 corner crops and mirrored images of those 5 crops
** run these 10 crops through your classifier and average their predictions
** Not usually used in production systems but can be used to do well on benchmarks
:<img src='https://www.researchgate.net/profile/Yong-Han-Ahn/publication/331730377/figure/fig1/AS:756404025556993@1557352181920/Examples-of-data-augmentation-a-random-cropping-and-b-horizontal-flipping.png' width=500>
!! use Open Source Code
* Used architecture of networks published in the literature
* Use open source implementations if possible - because they would have figured out all the finicky details like the [[Learning Rate Decay]] and other [[Hyperparameter]]s
* use pretrained model and finetune on your dataset
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[03 July 2021]],,
!! Question 1
Which of the following do you typically see in a ConvNet? (Check all that apply.)
* FC layers in the first few layers
* ''Multiple CONV layers followed by a POOL layer''
* ''FC layers in the last few layers''
* Multiple POOL layers followed by a CONV layer
!! Question 2
In order to be able to build very deep networks, we usually only use pooling layers to downsize the height/width of the activation volumes while convolutions are used with “valid” padding. Otherwise, we would downsize the input of the model too quickly.
* True
* ''False''
!! Question 3
Training a deeper network (for example, adding additional layers to the network) allows the network to fit more complex functions and thus almost always results in lower training error. For this question, assume we’re referring to “plain” networks.
* ''False''
* True
!! Question 4
The following equation captures the computation in a ResNet block. What goes into the two blanks above?
$$ a^{[l+2]} = g(W^{[l+2]}g(W^{[l+1]}a^{[l]} + b^{[l+1]}) + b^{[l+2]} + ........ ) + ........ $$
* $$0$$ and $$z^{[l+1]}$$, respectively
* $$z^{[l]}$$ and $$a^{[l]}$$, respectively
* $$0$$ and $$a^{[l]}$$, respectively
* ''$$a^{[l]}$$ and $$0$$, respectively''
!! Question 5
Which ones of the following statements on Residual Networks are true? (Check all that apply.)
* A ResNet with L layers would have on the order of $$L^2$$ skip connections in total.
* ''The skip-connection makes it easy for the network to learn an identity mapping between the input and the output within the ResNet block''.
* ''Using a skip-connection helps the gradient to backpropagate and thus helps you to train deeper networks''
* The skip-connections compute a complex non-linear function of the input to pass to a deeper layer in the network.
!! Question 6
Suppose you have an input volume of dimension $$n_H \times n_W \times n_C$$. Which of the following statements you agree with? (Assume that “1x1 convolutional layer” below always uses a stride of 1 and no padding.)
* You can use a 1x1 convolutional layer to reduce $$n_H, n_W$$ and $$n_C$$
* ''You can use a 1x1 convolutional layer to reduce $$n_C$$ but not $$n_H$$, $$n_W$$''
* ''You can use a 2D pooling layer to reduce $$n_H$$, $$n_W$$ but not $$n_C$$''
* You can use a 2D pooling layer to reduce $$n_H$$ $$n_W$$, and $$n_C$$
!! Question 7
Which ones of the following statements on Inception Networks are true? (Check all that apply.)
* Inception networks incorporate a variety of network architectures (similar to dropout, which randomly chooses a network architecture on each step) and thus has a similar regularizing effect as dropout.
* ''A single inception block allows the network to use a combination of 1x1, 3x3, 5x5 convolutions and pooling. ''
* ''Inception blocks usually use 1x1 convolutions to reduce the input data volume’s size before applying 3x3 and 5x5 convolutions.''
* Making an inception network deeper (by stacking more inception blocks together) might not hurt training set performance.
!! Question 8
Which of the following are common reasons for using open-source implementations of ConvNet (both the model and/or weights)? Check all that apply.
* ''Parameters trained for one computer vision task are often useful as pretraining for other computer vision tasks.
''
* The same techniques for winning computer vision competitions, such as using multiple crops at test time, are widely used in practical deployments (or production system deployments) of ConvNet.
* A model trained for one computer vision task can usually be used to perform data augmentation even for a different computer vision task.
* ''It is a convenient way to get working with an implementation of a complex ConvNet architecture''.
!! Question 9
In Depthwise Separable Convolution you:
* You convolve the input image with a filter of $$n_f \times n_f \times n_c$$ where $$n_c$$ acts as the depth of the filter ($$n_c$$ is the number of color channels of the input image).
* You convolve the input image with $$n_c$$ number of $$n_f \times n_f$$ filters ($$n_c$$ is the number of color channels of the input image).
* ''For the “Depthwise” computations each filter convolves with only one corresponding color channel of the input image.''
* ''Perform two steps of convolution''.
* ''The final output is of the dimension $$ n_{out} \times n_{out} \times n^{'}_{c}$$ (where $$n^{'}_{c}$$ is the number of filters used in the previous convolution step)''.
* The final output is of the dimension $$n_{out} \times n_{out} \times n_{c}$$ (where $$n_{c}$$ is the number of color channels of the input image).
* For the “Depthwise” computations each filter convolves with all of the color channels of the input image.
* Perform one step of convolution.
!! Question 10
Fill in the missing dimensions shown in the image below (marked W, Y, Z).
<img src='https://lh3.googleusercontent.com/9k4nf5yMwvG_hjvgZ3Ary_mEvt0NYiTIvxJETTlikNnKQgfo2IGOcT1hL7bN_pA3pfV-jOpJ3jnFfjjpx6U7vSNZYTIjoMQuGMCrfSkweVWI7bnInNI-cd-1GwxGAogLMCBpQpMgiPGUN4ELocAAhJ5V0qrusxpmf5mvocWKDOCFrcGBG0cNaTtYon11IsY9cs-AGDkJLTvQin1Im2zjwkOXmKuVf_xhZJv_nw--EpK7yQXrhkVs2JrBMdEZG67uzwfSWNDl9uOds8FOldI6XR7teRgpCTwIJvJ0ciaGLShCX5t14huwmwSLrBiP1XVGgw1VCB_zdtD0bEOLrG2BsCLKulLmfhhm6_YE0bPmeGH7-lNRziryrXN0p8lbXG3pSvmSWyQElAizLer8VH_ZfuAe_bnXrPZ85emScRa0Ut8tyIB9c3h1Exkq--EJ4UOBQhIOEe4GGFo3SRXbr7HA-5pq0tSifavD9hBa1PqCqPpupW8bZXm49qx_S2p8zRSFD03ttCPAHCoGtfbZsFZWzNNlkvDneVC8s9Yh1qXl6tYqdYplsb0wYPR24Xb94nqzRdQrz9XngMQ3Q_WUrs145eJfjHxf9Cix1pPqOWwlq7PnQ11LKR__t23Z8Dl98l5p04HDGdf6kCWebFZcL1lpNlW42o4Ze347m875iZFfzwuLGNjWjr522amfO39335nWTnolOKiC19uoXH97gjVelN2p4A=w1614-h832-no?authuser=0' width = 700>
* W = 5, Y = 20, Z = 5
* W = 30, Y = 30, Z = 5
* ''W = 5, Y = 30, Z = 20''
* W = 30, Y = 20, Z =20
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[15 May 2021]],,
!Autonomous Driving (Case Study)
!! Question 1
To help you practice strategies for machine learning, in this week we’ll present another scenario and ask how you would act. We think this “simulator” of working in a machine learning project will give a task of what leading a machine learning project could be like!
You are employed by a startup building self-driving cars. You are in charge of detecting road signs (stop sign, pedestrian crossing sign, construction ahead sign) and traffic signals (red and green lights) in images. The goal is to recognize which of these objects appear in each image. As an example, the above image contains a pedestrian crossing sign and red traffic lights
Your 100,000 labeled images are taken using the front-facing camera of your car. This is also the distribution of data you care most about doing well on. You think you might be able to get a much larger dataset off the internet, that could be helpful for training even if the distribution of internet data is not the same.
You are just getting started on this project. What is the first thing you do? Assume each of the steps below would take about an equal amount of time (a few days).
*Spend a few days getting the internet data, so that you understand better what data is available.
*Spend a few days collecting more data using the front-facing camera of your car, to better understand how much data per unit time you can collect.
*''Spend a few days training a basic model and see what mistakes it makes''.
*Spend a few days checking what is human-level performance for these tasks so that you can get an accurate estimate of Bayes error.
<<<
''Solution'': As discussed in lecture, applied ML is a highly iterative process. If you train a basic model and carry out error analysis (see what mistakes it makes) it will help point you in more promising directions.
<<<
!! Question 2
Your goal is to detect road signs (stop sign, pedestrian crossing sign, construction ahead sign) and traffic signals (red and green lights) in images. The goal is to recognize which of these objects appear in each image. You plan to use a deep neural network with ReLU units in the hidden layers.
For the output layer, a [[Softmax]] activation would be a good choice for the output layer because this is a multi-task learning problem. True/False?
* ''False''
* True
<<<
''Solution'': Softmax would be a good choice if one and only one of the possibilities (stop sign, speed bump, pedestrian crossing, green light and red light) was present in each image.
<<<
!! Question 3
You are carrying out error analysis and counting up what errors the algorithm makes. Which of these datasets do you think you should manually go through and carefully examine, one image at a time?
* 10,000 randomly chosen images
* ''500 images on which the algorithm made a mistake''
* 10,000 images on which the algorithm made a mistake
* 500 randomly chosen images
<<<
''Solution'': Focus on images that the algorithm got wrong. Also, 500 is enough to give you a good initial sense of the error statistics. There’s probably no need to look at 10,000, which will take a long time.
<<<
!! Question 4
After working on the data for several weeks, your team ends up with the following data:
100,000 labeled images taken using the front-facing camera of your car.
900,000 labeled images of roads downloaded from the internet.
Each image’s labels precisely indicate the presence of any specific road signs and traffic signals or combinations of them. For example, $$ y^{(i)}y $$ `[ 0 1 0 0 1]` means the image contains a stop sign and a red traffic light. Because this is a multi-task learning problem, you need to have all your $$ y^{(i)}y $$ vectors fully labeled. If one example is equal to ` [0 ? 1 0 0]` then the learning algorithm will not be able to use that example. True/False?
* ''False''
* True
<<<
Solution: As seen in the lecture on multi-task learning, you can compute the cost such that it is not influenced by the fact that some entries haven’t been labeled.
<<<
!! Question 5
The distribution of data you care about contains images from your car’s front-facing camera; which comes from a different distribution than the images you were able to find and download off the internet. How should you split the dataset into train/dev/test sets?
* Mix all the 100,000 images with the 900,000 images you found online. Shuffle everything. Split the 1,000,000 images dataset into 600,000 for the training set, 200,000 for the dev set and 200,000 for the test set.
* Mix all the 100,000 images with the 900,000 images you found online. Shuffle everything. Split the 1,000,000 images dataset into 980,000 for the training set, 10,000 for the dev set and 10,000 for the test set.
* ''Choose the training set to be the 900,000 images from the internet along with 80,000 images from your car’s front-facing camera. The 20,000 remaining images will be split equally in dev and test sets.
''
* Choose the training set to be the 900,000 images from the internet along with 20,000 images from your car’s front-facing camera. The 80,000 remaining images will be split equally in dev and test sets.
!! Question 6
Assume you’ve finally chosen the following split between of the data:
<table >
<thead><tr ><th>Dataset:</th><th>Contains:</th><th>Error of the algorithm:</th></tr></thead><tbody>
<tr><td>Training</td><td>940,000 images randomly picked from (900,000 internet images + 60,000 car's front-facing camera images)</td><td>8.80%</td></tr>
<tr><td>Training-Dev</td><td>20,000 images randomly picked from (900,000 internet images + 60,000 car's front-facing camera images)</td><td>9.10%</td></tr>
<tr><td>Dev</td><td>20,000 images from your car's front-facing camera</td><td>14.30%</td></tr>
<tr><td>Test</td><td>20,000 images from the car's front-facing camera</td><td>14.80%</td></tr>
</tbody></table>
You also know that human-level error on the road sign and traffic signals classification task is around 0.5%. Which of the following are True? (Check all that apply).
* You have a large variance problem because your training error is quite higher than the human-level error.
* ''You have a large data-mismatch problem because your model does a lot better on the training-dev set than on the dev set''
* ''You have a large avoidable-bias problem because your training error is quite a bit higher than the human-level error.''
* Your algorithm overfits the dev set because the error of the dev and test sets are very close.
* You have a large variance problem because your model is not generalizing well to data from the same training distribution but that it has never seen before.
!! Question 7
Based on the table from the previous question, a friend thinks that the training data distribution is much easier than the dev/test distribution. What do you think?
* ''There’s insufficient information to tell if your friend is right or wrong.''
* Your friend is right. (I.e., Bayes error for the training data distribution is probably lower than for the dev/test distribution.)
* Your friend is wrong. (I.e., Bayes error for the training data distribution is probably higher than for the dev/test distribution.)
<<<
''Solution'': The algorithm does better on the distribution of data it trained on. But you don’t know if it’s because it trained on that no distribution or if it really is easier. To get a better sense, measure human-level error separately on both distributions.
<<<
!! Question 8
You decide to focus on the dev set and check by hand what are the errors due to. Here is a table summarizing your discoveries:
<table>
<tbody>
<tr><td>Overall dev set error</td><td>15.30%</td></tr>
<tr><td>Errors due to incorrectly labeled data</td><td>4.10%</td></tr>
<tr><td>Errors due to foggy pictures</td><td>8.00%</td></tr>
<tr><td>Errors due to rain drops stuck on your car's front-facing camera</td><td>2.20%</td></tr>
<tr><td>Errors due to other causes</td><td>1.00%</td></tr>
</tbody></table>
In this table, 4.1%, 8.0%, etc. are a fraction of the total dev set (not just examples your algorithm mislabeled). For example, about 8.0/15.3 = 52% of your errors are due to foggy pictures.
The results from this analysis implies that the team’s highest priority should be to bring more foggy pictures into the training set so as to address the 8.0% of errors in that category. True/False?
Additional Note: there are subtle concepts to consider with this question, and you may find arguments for why some answers are also correct or incorrect. We recommend that you spend time reading the feedback for this quiz, to understand what issues that you will want to consider when you are building your own machine learning project.
* ''False because it depends on how easy it is to add foggy data. If foggy data is very hard and costly to collect, it might not be worth the team’s effort.''
* True because it is greater than the other error categories added together (8.0 > 4.1+2.2+1.0).
* First start with the sources of error that are least costly to fix.
* True because it is the largest category of errors. We should always prioritize the largest category of error as this will make the best use of the team's time.
<<<
''Solution'': Even though it is better to prioritize larger sources of error, all else being equal, that is not the only thing to consider. Another important consideration is how difficult and costly it would be to access the additional foggy data.
<<<
!! Question 9
You can buy a specially designed windshield wiper that help wipe off some of the raindrops on the front-facing camera. Based on the table from the previous question, which of the following statements do you agree with?
* 2.2% would be a reasonable estimate of the minimum amount this windshield wiper could improve performance.
* ''2.2% would be a reasonable estimate of the maximum amount this windshield wiper could improve performance''.
* 2.2% would be a reasonable estimate of how much this windshield wiper will improve performance.
* 2.2% would be a reasonable estimate of how much this windshield wiper could worsen performance in the worst case.
<<<
''Solution'': Yes. You will probably not improve performance by more than 2.2% by solving the raindrops problem. If your dataset was infinitely big, 2.2% would be a perfect estimate of the improvement you can achieve by purchasing a specially designed windshield wiper that removes the raindrops.
<<<
!! Question 10
You decide to use data augmentation to address foggy images. You find 1,000 pictures of fog off the internet, and “add” them to clean images to synthesize foggy days, like this:
Which of the following statements do you agree with?
<img src="https://i.ibb.co/JynCSPY/course3-week2-q12.png" alt="course3-week2-q12" border="0">
* ''Adding synthesized images that look like real foggy pictures taken from the front-facing camera of your car to training dataset won’t help the model improve because it will introduce avoidable-bias''.
* There is little risk of overfitting to the 1,000 pictures of fog so long as you are combining it with a much larger (>>1,000) of clean/non-foggy images.
* So long as the synthesized fog looks realistic to the human eye, you can be confident that the synthesized data is accurately capturing the distribution of real foggy images (or a subset of it), since human vision is very accurate for the problem you’re solving.
!! Question 11
After working further on the problem, you’ve decided to correct the incorrectly labeled data on the dev set. Which of these statements do you agree with? (Check all that apply).
* ''You do not necessarily need to fix the incorrectly labeled data in the training set, because it's okay for the training set distribution to differ from the dev and test sets. Note that it is important that the dev set and test set have the same distribution.''
* You should correct incorrectly labeled data in the training set as well so as to avoid your training set now being even more different from your dev set.
* You should not correct the incorrectly labeled data in the test set, so that the dev and test sets continue to come from the same distribution.
* ''You should also correct the incorrectly labeled data in the test set, so that the dev and test sets continue to come from the same distribution''.
!! Question 12
So far your algorithm only recognizes red and green traffic lights. One of your colleagues in the startup is starting to work on recognizing a yellow traffic light. (Some countries call it an orange light rather than a yellow light; we’ll use the US convention of calling it yellow.) Images containing yellow lights are quite rare, and she doesn’t have enough data to build a good model. She hopes you can help her out using transfer learning.
What do you tell your colleague?
* You cannot help her because the distribution of data you have is different from hers, and is also lacking the yellow label.
* ''She should try using weights pre-trained on your dataset, and fine-tuning further with the yellow-light dataset''.
* If she has (say) 10,000 images of yellow lights, randomly sample 10,000 images from your dataset and put your and her data together. This prevents your dataset from “swamping” the yellow lights dataset.
* Recommend that she try multi-task learning instead of transfer learning using all the data.
<<<
''Solution'': You have trained your model on a huge dataset, and she has a small dataset. Although your labels are different, the parameters of your model have been trained to recognize many characteristics of road and traffic images which will be useful for her problem. This is a perfect case for transfer learning, she can start with a model with the same architecture as yours, change what is after the last hidden layer and initialize it with your trained parameters.
<<<
!! Question 13
Another colleague wants to use microphones placed outside the car to better hear if there are other vehicles around you. For example, if there is a police vehicle behind you, you would be able to hear their siren. However, they don’t have much to train this audio system. How can you help?
* Transfer learning from your vision dataset could help your colleague get going faster. Multi-task learning seems significantly less promising.
* Multi-task learning from your vision dataset could help your colleague get going faster. Transfer learning seems significantly less promising.
* Either transfer learning or multi-task learning could help our colleague get going faster.
* ''Neither transfer learning nor multi-task learning seems promising''.
<<<
''Solution'': The problem he is trying to solve is quite different from yours. The different dataset structures make it probably impossible to use transfer learning or multi-task learning.
<<<
!! Question 14
To recognize red and green lights, you have been using this approach:
(A) Input an image (x) to a neural network and have it directly learn a mapping to make a prediction as to whether there’s a red light and/or green light (y).
A teammate proposes a different, two-step approach:
(B) In this two-step approach, you would first (i) detect the traffic light in the image (if any), then (ii) determine the color of the illuminated lamp in the traffic light.
Between these two, Approach B is more of an end-to-end approach because it has distinct steps for the input end and the output end. True/False?
* True
* ''False''
<<<
''Solution'': (A) is an end-to-end approach as it maps directly the input (x) to the output (y)
<<<
!! Question 15
Approach A (in the question above) tends to be more promising than approach B if you have a ________ (fill in the blank).
* Multi-task learning problem.
* Large bias problem.
* ''Large training set''
* Problem with a high Bayes error.
<<<
''Solution'': In many fields, it has been observed that end-to-end learning works better in practice, but requires a large amount of data.
<<<
,,Tags: [[COURSE3: Structuring Machine Learning Projects]],,
!! Question 1
What does a neuron compute?
* A neuron computes the mean of all features before applying the output to an activation function
* A neuron computes a function g that scales the input x linearly (Wx + b)
* ''A neuron computes a linear function (z = Wx + b) followed by an activation function''
* A neuron computes an activation function followed by a linear function (z = Wx + b)
!! Question 2
Which of these is the "Logistic Loss"?
# $$\mathcal{L}^{(i)}(\hat{y}^{(i)}, y^{(i)}) = \mid y^{(i)} -\hat{y}^{(i)} \mid^{2}$$
# $$\mathcal{L}^{(i)}(\hat{y}^{(i)}, y^{(i)}) = \mid y^{(i)} -\hat{y}^{(i)}|$$
# $$\mathcal{L}^{(i)}(\hat{y}^{(i)}, y^{(i)}) = -( y^{(i)}\log(\hat{y}^{(i)}) + (1- y^{(i)})\log(1-\hat{y}^{(i)})))$$
# $$\mathcal{L}^{(i)}(\hat{y}^{(i)}, y^{(i)}) = max(0, y^{(i)} - \hat{y}^{(i)})$$
''Answer: 3''
!! Question 3
Suppose img is a (32,32,3) array, representing a 32x32 image with 3 color channels red, green and blue. How do you reshape this into a column vector?
* `x = img.reshape((32*32,3))`
* `x = img.reshape((3,32*32))`
* ''`x = img.reshape((32*32*3,1))`''
* `x = img.reshape((1,32*32,*3))`
!! Question 4
Consider the two following random arrays "a" and "b":
```python
a = np.random.randn(2, 3) # a.shape = (2, 3)
b = np.random.randn(2, 1) # b.shape = (2, 1)
c = a + b
```
What will be the shape of "c"?
* ''c.shape = (2, 3)''
* c.shape = (2, 1)
* The computation cannot happen because the sizes don't match. It's going to be "Error"!
* c.shape = (3, 2)
!! Question 5
Consider the two following random arrays "a" and "b":
```python
a = np.random.randn(4, 3) # a.shape = (4, 3)
b = np.random.randn(3, 2) # b.shape = (3, 2)
c = a*b
```
What will be the shape of "c"?
* c.shape = (4, 3)
* ''The computation cannot happen because the sizes don't match. It's going to be "Error"!''
* c.shape = (3, 3)
* c.shape = (4, 2)
!! Question 6
Suppose you have $$n_x$$ input features per example. Recall that $$X = [x^{(1)} x^{(2)} ... x^{(m)}]$$. What is the dimension of $$X$$?
# $$(m,n_x)$$
# $$(1,m)$$
# $$(n_x, m)$$
# $$(m,1)$$
'' Answer = 3''
!! Question 7
Recall that `np.dot(a,b)` performs a matrix multiplication on a and b, whereas `a*b` performs an element-wise multiplication.
Consider the two following random arrays ''a'' and ''b'':
```python
a = np.random.randn(12288, 150) # a.shape = (12288, 150)
b = np.random.randn(150, 45) # b.shape = (150, 45)
c = np.dot(a,b)
```
What is the shape of c?
* ''c.shape = (12288, 45)''
* The computation cannot happen because the sizes don't match. It's going to be "Error"!
* c.shape = (150,150)
* c.shape = (12288, 150)
!! Question 8
Consider the following code snippet:
```python
# a.shape = (3,4)
# b.shape = (4,1)
for i in range(3):
for j in range(4):
c[i][j] = a[i][j] + b[j]
```
How do you vectorize this?
* `c = a.T + b`
* `c = a + b`
* ''`c = a + b.T`''
* `c = a.T + b.T`
!! Question 9
Consider the following code:
```python
a = np.random.randn(3, 3)
b = np.random.randn(3, 1)
c = a*b
```
What will be ''c''? (If you’re not sure, feel free to run this in python to find out).
* ''This will invoke broadcasting, so b is copied three times to become (3,3), and *∗ is an element-wise product so c.shape will be (3, 3)''
* This will invoke broadcasting, so b is copied three times to become (3, 3), and *∗ invokes a matrix multiplication operation of two 3x3 matrices so c.shape will be (3, 3)
* This will multiply a 3x3 matrix a with a 3x1 vector, thus resulting in a 3x1 vector. That is, c.shape = (3,1).
* It will lead to an error since you cannot use “*” to operate on these two matrices. You need to instead use np.dot(a,b)
!! Question 10
Consider the following computation graph.
<img src='https://d3c33hcgiwev3.cloudfront.net/imageAssetProxy.v1/CLczrXpHEeeA3RJRlG3Uqg_3c66355aff0ae7db9e27206f188267f0_Screen-Shot-2017-08-05-at-6.30.51-PM.png?expiry=1619395200000&hmac=lM74qzMcPMDN1fOiZh8a1A1eg0l1ScjE7FVhGhokLT0' width=700>
What is the output J?
* J = (c - 1)*(b + a)
* ''J = (a - 1) * (b + c)''
* J = a*b + b*c + a*c
* J = (b - 1) * (c + a)
,,Tags: [[COURSE1: Neural Networks & Deep Learning]],,
!Optimization Algorithms
!! Question 1
Which notation would you use to denote the 3rd layer’s activations when the input is the 7th example from the 8th minibatch?
# $$a^{[3]\{8\}(7)}$$
# $$a^{[8]\{7\}(3)}$$
# $$a^{[3]\{7\}(8)}$$
# $$a^{[8]\{3\}(7)}$$
''Answer: 1''
!! Question 2
Which of these statements about mini-batch gradient descent do you agree with?
* You should implement mini-batch gradient descent without an explicit for-loop over different mini-batches, so that the algorithm processes all mini-batches at the same time (vectorization).
* ''One iteration of mini-batch gradient descent (computing on a single mini-batch) is faster than one iteration of batch gradient descent''.
* Training one epoch (one pass through the training set) using mini-batch gradient descent is faster than training one epoch using batch gradient descent.
!! Question 3
Why is the best mini-batch size usually not $$1$$ and not $$m$$, but instead something in-between?
* ''If the mini-batch size is 1, you lose the benefits of vectorization across examples in the mini-batch''.
* If the mini-batch size is m, you end up with [[Stochastic gradient descent]], which is usually slower than mini-batch gradient descent.
* If the mini-batch size is 1, you end up having to process the entire training set before making any progress.
* ''If the mini-batch size is m, you end up with batch gradient descent, which has to process the whole training set before making progress''.
!! Question 4
Suppose your learning [[Algorithm]]’s cost $$J$$, plotted as a function of the number of iterations, looks like this:
<img src='https://lh3.googleusercontent.com/HPKZK07wfAjA6_hwYj0_zKIPgYwm-n4vrTqE-g0Ep1mAV2EM2KCIJzE3cFyxEHU-hXpqWY1JZ4F-ujLy1L9WYkoJRGZaRc57c6AYF_chXvC1ztodh7h-RRzBP4uunZwqa132WLYt9NqxeB5156GhhbJOoUr5pC9I5GZqE_eZB_UNRV9MF3OFl3VH2AncqrqTMUkzwt_-viTgF7SJ9oDOQaHhSiQEFUzMG6n60T0qgvHVtBrh2VBsKOyRrJdlUA6CdSL9x7L71WIiqSRaTBM0v7GgzZDd1-MtT8j07BoKziwBb4wt7OQw9iZfwWBH-dlqLVCOLVVLRWtHl2CiZH5uLtkIxQ4G5Yt0QtJ73hGtEpYUh9-O_S6qtWdpqpD6pcUoykscxhxyYnEofIyUk1YBcML7I6fasDbrtO_w_vuUZUcwZ-FHlgQbw8nDiNqgSU0qOWUgkxgjKCY2ZoupmKEtF2e-iqaqEH8UzbyJtT3OgXZUElym8WiUFfoH_u7f7iSqKloMhw-Hbqcqi9sedzeSsDqK5Dv84VAH8qvjifHrlKfsfogWrhDclVuF4cHnNXTnL3JmIvhFfYVins0TLkEdprI24queywQtgNQN96uwMe3Xoqb-2YmiSuAHriLGGOklNOl2zActk_Lj4XpHfs7vdoBjg5flSIR7oH3um4_BOZHTc_-ZIM3Sbg4XpbpEo-6FBAoP7qrLDU9g6QguOFAkQYBv5A=w545-h376-no?authuser=0' width=400>
Which of the following do you agree with?
* ''If you’re using [[Mini-batch gradient descent]], this looks acceptable. But if you’re using batch gradient descent, something is wrong''.
* Whether you’re using [[Batch Gradient Descent]] or mini-batch gradient descent, this looks acceptable.
* If you’re using [[Mini-batch gradient descent]], something is wrong. But if you’re using batch gradient descent, this looks acceptable.
* Whether you’re using [[Batch Gradient Descent]] or mini-batch gradient descent, something is wrong.
!! Question 5
Suppose the temperature in Casablanca over the first three days of January are the same:
Jan 1st: $$\theta_1 = 10^o C$$
Jan 2nd: $$\theta_2 = 10^o C$$
(We used Fahrenheit in lecture, so will use Celsius here in honor of the metric world.)
Say you use an [[Exponentially Weighted Average]] with $$\beta = 0.5$$ to track the temperature: $$v_0 = 0$$, $$v_t = \beta v_{t-1} +(1-\beta)\theta_t$$. If $$v_2$$ is the value computed after day 2 without bias correction, and $$v_2^{corrected}$$ is the value you compute with bias correction. What are these values? (You might be able to do this without a calculator, but you don't actually need one. Remember what bias correction is doing.)
# $$ v_2 = 7.5; v_2^{corrected} = 10$$
# $$ v_2 = 10; v_2^{corrected} = 7.5$$
# $$ v_2 = 10; v_2^{corrected} = 10$$
# $$ v_2 = 7.5; v_2^{corrected} = 7.5$$
''Answer: 1''
''Solution: ''
<<<
$$\theta_1 = \theta_2 = \theta_3 = 10^o$$
$$v_0 = 0$$
$$v_1 = \beta v_0 + (1-\beta)\theta_1 = 0.5\times0 + 0.5\times10 = 5$$
$$v_2 = \beta v_1 + (1-\beta)\theta_2 = 0.5\times5 + 0.5\times10 = 7.5$$
$$\displaystyle{ v_2^{corrected} = \frac{v_2}{1-\beta^t} = \frac{7.5}{1-0.5^2} = \frac{7.5}{0.75} = 10 }$$
<<<
!! Question 6
Which of these is NOT a good [[Learning Rate Decay]] scheme? Here, $$t$$ is the epoch number.
# $$\displaystyle{\alpha = e^t \alpha_0 }$$
# $$\displaystyle{\alpha = \frac{1}{\sqrt{t}} \alpha_0 }$$
# $$\displaystyle{\alpha = \frac{1}{1+2*t} \alpha_0 }$$
# $$\displaystyle{\alpha = 0.95^t \alpha_0 }$$
''Answer: 1''
''Solution:'' [[Learning Rate Decay]] scheme should decrease $$\alpha$$ after every epoch, which will exponentially increase in the case of $$e^t \alpha_0$$
!! Question 7
You use an exponentially weighted average on the London temperature dataset. You use the following to track the temperature: $$v_{t} = \beta v_{t-1} + (1-\beta)\theta_t$$. The red line below was computed using $$\beta = 0.9$$. What would happen to your red curve as you vary $$\beta$$? (Check the two that apply)
<img src='https://lh3.googleusercontent.com/TW-_kFMPpFFFh1o2QNHw4w8WKkjaBIBOf1ifLKPslEH329ggTvD2GPe6r7BDh3bYHYvDCGIDdMf_qCedSAASGlkoA2f3WvWmlrA1A4syZ0PA7rBRrjgESKiFX3wrj3_FBPLAcbeMiN04e6GVZZGrTVDclku7ZDl3PrUes21na20CJrP2xehho34J1NVe4O8xfTyiqcm10KYiCZBArPfaRuQA7jDtK7xeiaZuq8GqNisntGo4CDRQYOrDjuW1d2ui1p544lloPapY3Nz-3-3ah5GlY57iJSKUN_q7vYMuizmeJH_HDHr9FxYhRg6wVx-efW_StykbcI6YP8XJ6saKbvDP_f8mshpVM7E1ijFyRDL94-a3kIYRAb70Z2qsExK0MdkF-90OAtqE1XeQTOcf8jhavB3GejkMVYHeoQ1m5z4VK2r3xpSfk2V1NSYWmeXXPgfoW-iINnPtZ7UCDSeyruKoHeGXTFLfdiFj0prQiF0eiC0wWdOSqluJu68DJGZGzW1I6DBIuUzWJTc-hGlnJSKzEpTqv13__rmQGplhlulrBBgETmWdeXvdd27BlkzusZ7YF5_wCk6ZZjIvpyBpU1Lbki89efbOhW0rjs2VyJHzF-0t2L-ARcjoBD_sFZ780cHBnVjRxTgAKOJUXbBj4BSHBFCzjRW-jx3rNStx9YXFEH1b4NmN0DBfWMJXCzFv7Pb9_Xg9tOiioWS3I1iG7wgkJg=w1218-h682-no?authuser=0' width=500>
* Decreasing $$\beta$$ will shift the red line slightly to the right.
* ''Increasing $$\beta$$ will shift the red line slightly to the right.
''
* ''Decreasing $$\beta$$ will create more oscillation within the red line.''
* Increasing $$\beta$$ will create more oscillations within the red line.
''Solution''
<<<
Increasing $$\beta$$, that means averaging over more number of points and thus the curve will react later thereby shifting it towards right and also smoothening it out.
By lowering $$\beta$$, you average over less number of points and thus the average is more local and oscillates more
<<<
!! Question 8
Consider this figure:
<img src='https://lh3.googleusercontent.com/9HoDmorssyHQFAF0Eu9HYyUik-xyVZq3DDLeHrToTsI6eVIJ4ne7BdKmbOOZ7roFPEmltfWfcXZQ8jhNxeoBDQ8xDv_cJTH-8qVYxvqKb0iRmwntofcF7oJnm8PNikjgfxYp8eZKRLlDNwAvaLfBSpZrFcCrHD4OZwzDP9bhvltFQQ7F-sWsmJE3xcwIt-3P8YQfJAo0Kmtsikw9UhHjG_zdnGw1nOKhBGz52H4rB0iCpVqw6_HGva7kAjGlA1oc8AWJt6osNyeb888WXUcAgS6EanasW4M3gxDJL0Ee_NV_g-Fkf0_YOWdqoM7xV36loeYuLaFNYjI-iU29uK9Wstxz7aVSfzy_I5mLyDlObfV6Tt13l9tVawV-GWrYvvTOCmYescPpohag1VyTdKH_5WSMl6iyfq7XyafblRkKHs1pHWmB528MIcSeemkxHn5jLh6E5m6uJB_gWsaP_PCf3vgoWnosJ2uQI8I5NNu7GOcO3JKgMkNopC3X3RNQHL8Y59wuG89uG6tH3_X8tt1oo-floJxIiZk0W1jL2SDk1_3kFY4Vy878rajnRYODFWFGGF6VFWX87kZmjsdOwrM5lPUKknHcmjng0EEBEw4ozIsrwd7lsebnW5g42KQkUky8uM0W2fb-0vZCQwYsmjczRVvecONaHu36ZrIfnWQ1v6YwMmbRbtYfDoAotzSCykKbaGmwNldHZuGfwagNXTjkqEdeVQ=w1506-h592-no?authuser=0' width=500>
These plots were generated with gradient descent; with gradient descent with momentum ($$\beta$$ = 0.5) and gradient descent with momentum ($$\beta$$ = 0.9). Which curve corresponds to which algorithm?
* (1) is gradient descent with momentum (small β). (2) is gradient descent. (3) is gradient descent with momentum (large β)
* (1) is gradient descent with momentum (small β), (2) is gradient descent with momentum (small β), (3) is gradient descent
* (1) is gradient descent. (2) is gradient descent with momentum (large β) . (3) is gradient descent with momentum (small β)
* ''(1) is gradient descent. (2) is gradient descent with momentum (small β). (3) is gradient descent with momentum (large β)''
''Solution''
<<<
(2) is oscilating more than (3), which means (2) has low β than (3).
<<<
!! Question 9
Suppose batch gradient descent in a deep network is taking excessively long to find a value of the parameters that achieves a small value for the cost function $$\mathcal{J}(W^{[1]},b^{[1]},..., W^{[L]},b^{[L]})$$. Which of the following techniques could help find parameter values that attain a small value for$$\mathcal{J}$$? (Check all that apply)
* ''Try using [[Adam]]''
* ''Try tuning the learning rate α''
* ''Try better random initialization for the weights''
* ''Try mini-batch gradient descent''
* Try initializing all the weights to zero
!! Question 10
Which of the following statements about [[Adam]] is False?
* Adam combines the advantages of [[RMSProp]] and momentum
* The [[Learning Rate]] [[Hyperparameter]] $$α$$ in Adam usually needs to be tuned
* We usually use “default” values for the hyperparameters $$\beta_1, \beta_2$$ and $$\varepsilon$$ in Adam ($$ \beta_1 = 0.9, \beta_2 = 0.999, \varepsilon = 10^{-8}$$)
* ''Adam should be used with batch gradient computations, not with mini-batches''.
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]| [[08 May 2021]],,
All of the resources cited in Course 1 Week 2, in one place. You are encouraged to explore these papers/sites if they interest you—for this week, both papers have been included as optional readings! They are listed in the order they appear in the lessons.
!! From the videos:
* Deconvolution and Checkerboard Artifacts (Odena et al., 2016): http://doi.org/10.23915/distill.00003
!! From the notebook:
* Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (Radford, Metz, and Chintala, 2016): https://arxiv.org/abs/1511.06434
* MNIST Database: http://yann.lecun.com/exdb/mnist/
!! Optional
In this notebook, you're going to learn about TGAN, from the paper Temporal Generative Adversarial Nets with Singular Value Clipping (Saito, Matsumoto, & Saito, 2017), and its origins in image generation.
Notebook link: https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C1W2_Video_Generation_(Optional).ipynb
[[Course 1: Build Basic GANs]]
!! From the videos:
* Hyperspherical Variational Auto-Encoders (Davidson, Falorsi, De Cao, Kipf, and Tomczak, 2018): https://arxiv.org/abs/1804.00891
* Generating Diverse High-Fidelity Images with VQ-VAE-2 (Razavi, van den Oord, and Vinyals, 2019): https://arxiv.org/abs/1906.00446
* Conditional Image Generation with PixelCNN Decoders (van den Oord et al., 2016): https://arxiv.org/abs/1606.05328
* Glow: Better Reversible Generative Models (Dhariwal and Kingma, 2018): https://openai.com/blog/glow/
* Machine Bias (Angwin, Larson, Mattu, and Kirchner, 2016): https://www.propublica.org/article/machine-bias-risk-assessments-in-criminal-sentencing
* Fairness Definitions Explained (Verma and Rubin, 2018): https://fairware.cs.umass.edu/papers/Verma.pdf
* Does Object Recognition Work for Everyone? (DeVries, Misra, Wang, and van der Maaten, 2019): https://arxiv.org/abs/1906.02659
* PULSE: Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models (Menon, Damian, Hu, Ravi, and Rudin, 2020): https://arxiv.org/abs/2003.03808
* What a machine learning tool that turns Obama white can (and can't) tell us about AI bias (Vincent, 2020): https://www.theverge.com/21298762/face-depixelizer-ai-machine-learning-tool-pulse-stylegan-obama-bias
!! From the notebook:
* Mitigating Unwanted Biases with Adversarial Learning (Zhang, Lemoine, and Mitchell, 2018): https://m-mitchell.com/papers/Adversarial_Bias_Mitigation.pdf
* Tutorial on Fairness Accountability Transparency and Ethics in Computer Vision at CVPR 2020 (Gebru and Denton, 2020): https://sites.google.com/view/fatecv-tutorial/schedule?authuser=0
* Machine Learning Glossary: Fairness (2020): https://developers.google.com/machine-learning/glossary/fairness
* CelebFaces Attributes Dataset (CelebA): http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
!! Optional
* ''Variational Autoencoders (VAEs)'' -
* ''GAN Debiasing'' - Notebook link: https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C2W2_GAN_Debiasing_(Optional).ipynb
** Fair Attribute Classification through Latent Space De-biasing. Vikram V. Ramaswamy, Sunnie S. Y. Kim, Olga Russakovsky. CVPR 2021.
** Fairness in visual recognition is becoming a prominent and critical topic of discussion as recognition systems are deployed at scale in the real world. Models trained from data in which target labels are correlated with protected attributes (i.e. gender, race) are known to learn and perpetuate those correlations.
** In this notebook, you will learn about Fair Attribute Classification through Latent Space De-biasing (Ramaswamy et al. 2020) that introduces a method for training accurate target classifiers while mitigating biases that stem from these correlations. Specifically, this work uses GANs to generate realistic-looking images and perturb these images in the underlying latent space to generate training data that is balanced for each protected attribute. They augment the original dataset with this perturbed generated data, and empirically demonstrate that target classifiers trained on the augmented dataset exhibit a number of both quantitative and qualitative benefits.
[[Course 2: Build Better GANs]]
!! From the videos:
* DeOldify... (Antic, 2019): https://twitter.com/citnaj/status/1124904251128406016
* pix2pixHD (Wang et al., 2018): https://github.com/NVIDIA/pix2pixHD
* [4k, 60 fps] Arrival of a Train at La Ciotat (The Lumière Brothers, 1896) (Shiryaev, 2020): https://youtu.be/3RYNThid23g
* Image-to-Image Translation with Conditional Adversarial Networks (Isola, Zhu, Zhou, and Efros, 2018): https://arxiv.org/abs/1611.07004
* Pose Guided Person Image Generation (Ma et al., 2018): https://arxiv.org/abs/1705.09368
* AttnGAN: Fine-Grained Text to Image Generation with Attentional Generative Adversarial Networks (Xu et al., 2017): https://arxiv.org/abs/1711.10485
* Few-Shot Adversarial Learning of Realistic Neural Talking Head Models (Zakharov, Shysheya, Burkov, and Lempitsky, 2019): https://arxiv.org/abs/1905.08233
* Patch-Based Image Inpainting with Generative Adversarial Networks (Demir and Unal, 2018): https://arxiv.org/abs/1803.07422
* Image Segmentation Using DIGITS 5 (Heinrich, 2016): https://developer.nvidia.com/blog/image-segmentation-using-digits-5/
* Stroke of Genius: GauGAN Turns Doodles into Stunning, Photorealistic Landscapes (Salian, 2019): https://blogs.nvidia.com/blog/2019/03/18/gaugan-photorealistic-landscapes-nvidia-research/
!! From the notebooks:
* Crowdsourcing the creation of image segmentation algorithms for connectomics (Arganda-Carreras et al., 2015): https://www.frontiersin.org/articles/10.3389/fnana.2015.00142/full
* U-Net: Convolutional Networks for Biomedical Image Segmentation (Ronneberger, Fischer, and Brox, 2015): https://arxiv.org/abs/1505.04597
!! Optional
* The Pix2Pix Paper
** Want to know more about image-to-image translation and the research behind the components of Pix2Pix? Take a look at the original paper!
** Image-to-Image Translation with Conditional Adversarial Networks (Isola, Zhu, Zhou, and Efros, 2018): https://arxiv.org/abs/1611.07004
* Pix2PixHD
** https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C3W2_Pix2PixHD_(Optional).ipynb
** Please note that this is an optional notebook, meant to introduce more advanced concepts if you're up for a challenge, so don't worry if you don't completely follow!
** In this notebook, you will learn about Pix2PixHD, which synthesizes high-resolution images from semantic label maps. Proposed in [[High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs (Wang et al. 2018)|https://arxiv.org/abs/1711.11585]], Pix2PixHD improves upon Pix2Pix via multiscale architecture, improved adversarial loss, and instance maps.
* Super-resolution GAN (SRGAN)
** https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C3W2_SRGAN_(Optional).ipynb
** In this notebook, you will learn about Super-Resolution GAN (SRGAN), a GAN that enhances the resolution of images by 4x, proposed in [[Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network (Ledig et al. 2017)|https://arxiv.org/abs/1609.04802]]. You will also implement the architecture and training in full and be able to train it on the CIFAR dataset.
* GauGAN
** https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C3W2_GauGAN_(Optional).ipynb
** In this notebook, you will learn about GauGAN, which synthesizes high-resolution images from semantic label maps, which you implement and train. GauGAN is based around a special denormalization technique proposed in [[Semantic Image Synthesis with Spatially-Adaptive Normalization (Park et al. 2019)|https://arxiv.org/abs/1903.07291]]
[[Course 3: Apply GANs]]
* Applies to [[Machine Translation]] & [[Speech Recognition]]
* French to English Translation
!! Machine Translation
$$
\begin{matrix}
x^{\langle 1 \rangle} & x^{\langle 2 \rangle} & x^{\langle 3 \rangle} & x^{\langle 4 \rangle} & x^{\langle 5 \rangle} & \ & y^{\langle 1 \rangle} & y^{\langle 2 \rangle} & y^{\langle 3 \rangle} & y^{\langle 4 \rangle} & y^{\langle 5 \rangle} & y^{\langle 6 \rangle} \\
Jane & visite & l'Afrique & en & Septembre & \longrightarrow & Jane & is & visiting & Africa & in & September
\end{matrix}
$$
<img src='https://miro.medium.com/max/900/1*CjaID6XEki7hH8oQ-RGqvA.png' width=700>
This setup works really well for enough number of French to English sentence pairs are available for training
!! [[Image Captioning]]
* Outputs a caption for the input image
* Works well if the caption to be generated is not too long
<img src='https://raw.githubusercontent.com/yunjey/pytorch-tutorial/master/tutorials/03-advanced/image_captioning/png/model.png' width=700>
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
! Neural Networks Overview
!! Notation
* $$[1], [2]$$ - Refers to layers in [[Neural Network]]
* $$(1), (2)$$ - Refers to training examples
For [[Logistic Regression]], we compute $$z = w^Tx + b$$ followed by activation $$ a = \sigma(z) $$. In [[Neural Network]]s, we do the same thing multiple times.
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="250" style="cursor: move;"><g transform="translate(-700,-300) scale(1)"><path class="link" marker-end="url(#arrow)" d="M785.5,358, 904.5,410" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,358, 904.5,462" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,410, 904.5,410" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,410, 904.5,462" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,462, 904.5,410" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,462, 904.5,462" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M904.5,358, 1023.5,410" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M904.5,410, 1023.5,410" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M904.5,462, 1023.5,410" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,358, 904.5,358" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,410, 904.5,358" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><path class="link" marker-end="url(#arrow)" d="M785.5,462, 904.5,358" style="stroke-width: 0.52; stroke-opacity: 1; stroke: rgb(80, 80, 80);"></path><circle r="16" class="node" id="0_0" cx="785.5" cy="358" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><circle r="16" class="node" id="0_1" cx="785.5" cy="410" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><circle r="16" class="node" id="0_2" cx="785.5" cy="462" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><circle r="16" class="node" id="1_0" cx="904.5" cy="358" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><circle r="16" class="node" id="1_1" cx="904.5" cy="410" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><circle r="16" class="node" id="1_2" cx="904.5" cy="462" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><circle r="16" class="node" id="2_0" cx="1023.5" cy="410" style="fill: rgb(255, 255, 255); stroke: rgb(51, 51, 51);"></circle><text class="text" dy=".35em" x="750.5" y="514" style="font-size: 12px;">Input Layer</text><text class="text" dy=".35em" x="869.5" y="514" style="font-size: 12px;">Hidden Layer [1]</text><text class="text" dy=".35em" x="988.5" y="514" style="font-size: 12px;">Output Layer [2]</text></g><defs><marker id="arrow" viewBox="0 -5 10 10" markerWidth="7" markerHeight="7" orient="auto" refX="56.8"><path d="M0,-5L10,0L0,5" style="stroke: rgb(80, 80, 80); fill: rgb(80, 80, 80);"></path></marker></defs></svg>
!! Computation
''Forward Propagation''
<<<
$$\begin{matrix}x\\w^{[1]} \\ b^{[1]}\end{matrix} \rightarrow z^{[1]} = w^{[1]}x + b^{[1]} \rightarrow a^{[1]} = \sigma(z^{[1]}) \rightarrow z^{[2]} = w^{[2]}x+b^{[2]} \rightarrow a^{[2]} = \sigma(z^{[2]}) \rightarrow \mathcal{L}(a^{[2]},y)$$
<<<
''Backward Propagation''
<<<
$$da^{[2]} \rightarrow dz^{[2]} \rightarrow da^{[1]} \rightarrow dz^{[1]}$$
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[13 June 2021]],,
! Object Detection
!! Object Localization
<img src='http://media5.datahacker.rs/2018/11/slika1-1.png' width=500>
!! Classification with Localization
<img src='https://dummyimage.com/600x400/000/fff' width=250>
Using [[ConvNet]] to predict the image from multiple classes \
* pedestrian - 1
* car - 2
* Motocrycle - 3
* Background - 4
Aslo, the [[ConvNet]] will output 4 things for the bounding box
* Midpoint - $$b_x, b_y$$
* Height - $$b_h$$
* Width - $$b_w$$
So if your training data has the output label (1/2/3/4) along with the 4 numbers of bounding box then the [[Supervised Learning]] could be used to get output and bounding box
''Target Label y''
$$y = \begin{bmatrix} p_c \\ b_x \\\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2\\ c_3 \end{bmatrix}$$
where $$p_c$$ is the probability that there is an object ($$1$$ - Yes, $$0$$ - No). $$c_1, c_2, c_3$$ are only available when $$p_c$$ set to $$1$$.
$$y_{image1} = \begin{bmatrix} 0\\ b_x \\\ b_y \\ b_h \\ b_w \\ 0 \\ 1 \\ 0 \end{bmatrix}; y_{image2} = \begin{bmatrix} 0 \\ ?\\ ?\\ ?\\ ?\\ ?\\ ?\\ ? \end{bmatrix}$$ where $$?$$ stands for don't cares
!! [[Loss Function]]
$$\mathcal{L}(\hat{y}, y) \\ = (\hat{y_1} - y_1)^2 + (\hat{y_2} - y_2)^2 + ... + (\hat{y_8} - y_8)^2 ;$$ if $$y_1 = 1$$
$$= (\hat{y_1} - y_1)^2 = if y_1 = 0$$
So, the [[Loss Function]] can be computed on all 8 components of $$y$$. If, $$p_c = 1$$, else the squared error of just $$p_c$$ if $$p_c \neq 1$$. Different losses for different components can be used.
* $$c_1, c_2, c_3$$ - Logistic Loss
* $$p_c$$ - [[Logistic Regression]] loss
* $$b_x, b_y, b_h, b_w$$ - [[Squared Error]]
,,tags: [[COURSE4: Convolutional Neural Networks]] | [[03 July 2021]],,
!Tuning Process
How do you go about finding a good setting for these hyperparameters? _ Let's look at some guidelines
*''Priority 1'':
** $$\alpha$$ - [[Learning Rate]]
* ''Priority 2''
** # of hidden units
** [[Mini-batch]] size
** $$\beta$$ - Momentum term
* ''Priority 3''
** # of layers
** [[Learning Rate Decay]]
** $$\beta_1, \beta_2, \varepsilon$$ - [[Adam]] terms (almost never required to tune)
!! Once you chose a [[Hyperparameter]] to tune, how to select a set of values to explore?
''Method 1: Grid Search''
<<<
[[Grid Search]] works okay when the number of [[Hyperparameter]]s to tune are small
<<<
''Method 2: Random points''
<<<
Choose the points at random - 25 Random. same number as in the [[Grid Search]] matrix. It is difficult to know in advance, which hyperparameters are going to be most important for your problem
With random points, you can try out much more number of distinct values of hyperparameter than grid search which searches for only 5 distinct values of points in a 5x5 matrix of hyperparameters.
<<<
''Method 3: Coarse to Fine''
<<<
<img src='https://www.andreaperlato.com/img/coarsegrid.png' width=200>
* search for random points take coarsely
* refine search in the smaller area where performance was better for most points
<<<
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]]|[[18 June 2021]],,
!Landmark Detection
<img src='http://media5.datahacker.rs/2018/11/sl2.png' width=500>
* Detect a face
* Detect important landmarks on the face like
** left corner of left eye (Landmark 1)
** Right corner of left eye (Landmark 2)
* target label for two landmarks = $$\begin{bmatrix} face? \\ l_{1x} \\ l _{1y} \\ l_{2x} \\ l_{2y} \end{bmatrix}$$
* $$l_{1x} , l _{1y} , l_{2x} , l_{2y}$$ are only defined where there is a face
* can be used to detect [[Emotion]]s
* Important points on the face
* [[Pose Detection]]
* Requires labelling a large amount of data laboriously to train a NN to detect feature landmarks
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[04 July 2021]],,
<img src="https://i.ibb.co/MhDCDjX/C1W302F1.png" alt="C1W302F1" width="500">
* This is a two-layer [[Neural Network]]. Counting only hidden and output layer
* True values for hidden layers are not observed
* The ''input layer'' can be termed as activation at time = 0. $$X = a^{[0]}$$
* In the ''hidden layer'' $$[1]$$, activations $$a^{[1]} = \begin{bmatrix} a_1^{[1]} \\ a_2^{[1]} \\ ... \\ a_4^{[1]} \end{bmatrix}$$ are computed. The parameters associated with this hidden layer $$[1]$$ are $$w^{[1]}, b^{[1]}$$
* In the output layer $$\hat{y} = a^{[2]}$$. The parameters associated with this layer are $$w^{[2]}, b^{[2]}$$
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[03 June 2021]],,
You can think for [[Machine Translation]] as conditional [[Language Modelling]]
!! [[Language Modelling]] and [[Machine Translation]]
<img src='https://cdn.analyticsvidhya.com/wp-content/uploads/2019/01/Screenshot-from-2019-01-19-12-42-36.png'>
* decoder network in machine translation is similar to language model
* Instead of starting off with vector of zeros in the language model in machine translation you have encoded a vector representation of words - hence Conditional Language Model
* Machine translation can output lot of different translations, but the objective here is to not sample from translation, but find the best translation
$$
Algo \rightarrow y \rightarrow \arg \max_{y^{\langle 1 \rangle}, ... ,y^{\langle T_y \rangle}} P(y^{\langle 1 \rangle}, ..., y^{\langle T_y \rangle} | x)
$$
!!! Greedy Search
* Pick the most likely first word, then pick the most likely second word and so on..
* This doesn't work really well because looking for best sentence and not the best word, and need an algo that can find $$ \max P(y^{\langle 1 \rangle}, ..., y^{\langle T_y \rangle} | x)$$ to find the best combination of words that fits the input
* For example, given two sentences
*: //Jane is visiting Africa in September//
*: //Jane is going to be visiting Africa in September//
: The greedy search will likely prioritize second sentence over first since going is more frequently used word than visiting
* Also if you are looking for best sentence out of 10,000 vocab, that is 10 words long, there will be $$10000^{10}$$ combinations to rank, hence need to approximate the search which will not always succeed, but does a good enough job
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!Using Appropriate Scale to pick Hyperparameters
''Sampling at random doesn't mean sampling uniformly'' across range of values. It is important to pick the appropriate scale on which to explore hyperparameters
''Case1''
<<<
Let's say you want to tune # of hidden units in a layer $$n^{[l]} = 50,...,100 $$ (range), then it makes sense to sample on a linear range.
<<<
''Case 2''
<<<
if you are tuning the [[Learning Rate]] $$\alpha$$, and the values range from $$ \{ 0.0001, ...., 1\}$$. Since 90% of the values belong to the range $$0.1 - 1$$ and only 10% belong to $$0.0001 - 0.1$$, using only 10% of resources to search points in the region of 0.0001 to 0.1. So it is better to use log scale here.
* The scale becomes $$\{0.0001, 0.001, 0.01, 0.1, 1\}$$
*`r = -4 * np.random.rand()` where $$r \in [-4,0]$$ and $$\alpha \in [10^{-4}, 10^0]$$. So sample $$r$$ linearly from [-4,0] and take alpha as $$10^r$$
<<<
''Case 3: Sampling values for [[Exponentially Weighted Average]]''
<<<
$$\beta = 0.9,...,0.999$$
$$1 - \beta = 0.1,...,0.001$$
Sample $$\beta = 1 - 10^{r}$$ where $$r$$ is randomly sampled between $$[-3,-1]$$
When $$\beta \approx 1$$, it is sensitive
* $$\beta: 0.9 \rightarrow 0.9005$$ - still averaging over 10 days
* $$\beta: 0.999 \rightarrow 0.9995$$ - averaging over 1000 days earlier to 2000 days now
<<<
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
!! [[Beam Search]] Algorithm
* Most widely used
* Parameter: ''Beam Width''. If beam width = 3, i.e. track 3 most likely choices
** instantiates 3 copies of the network
** select the next best 3 possibilities out of 30,000 (10,000 x 3)
* Heuristic search algorithm, approximate search
!!! Step 1: Select the best 3 options for the first word
<img src='https://player.slideplayer.com/96/16450517/slides/slide_12.jpg' width=500>
!!! Step 2: For each of 3 choices, consider 2nd word choice
<img src='https://player.slideplayer.com/96/16450517/slides/slide_14.jpg' width =500>
* If 3 most likely pairs of words in step 2 are //in september//, //jane is// and //jane visits//, it is rejecting //september// as the likely possibility for the first word
* In step 2, since the beam width = 3, 3 copies of the network are instantiated, and 3 pairs of words are selected for the next step, and these 3 networks can be used to evaluate all 30,000 possibilities efficiently
* Step 3 is similar to step 2, where now the 3 words/ pairs of words will be evaluated in this step again using 3 copies of the network to find out the best next word so that overall conditional probability is maximized
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
[[Neural Network]] is like [[Logistic Regression]], only repeated a lot of times. Each unit in the neural network computes two values.
!! 1. Computation for a unit
* $$ z = w^Tx + b$$
* $$ a = \sigma(z)$$
<img src="https://i.ibb.co/gTxDGQz/Slide2.png" alt="Slide2" border="0">
For each node in the hidden layer $$z_i^{[l]} $$ are computed where $$i$$ is the node and $$l$$ denotes the layer.
!! 2. Computation for a layer
<img src="https://i.ibb.co/KhkkJwM/Slide3.png" alt="Slide3" border="0">
Representing all equations of the network in matrix form for the first layer
<<<
$$z^{[1]} = \begin{bmatrix} - & w_1^{[1]T} & - \\ - & w_2^{[1]T} & - \\ - & w_3^{[1]T} & - \\ - & w_4^{[1]T} & - \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} + \begin{bmatrix} b_1^{[1]}\\ b_2^{[1]}\\ b_3^{[1]}\\ b_4^{[1]}\end{bmatrix} = \begin{bmatrix} w_1^{[1]T} x + b_1^{[1]}\\ w_2^{[1]T}x + b_2^{[1]}\\ w_3^{[1]T}x + b_3^{[1]}\\ w_4^{[1]T}x + b_4^{[1]}\end{bmatrix} = \begin{bmatrix} z_1^{[1]}\\ z_2^{[1]}\\ z_3^{[1]}\\ z_4^{[1]}\end{bmatrix} $$
$$a^{[1]} = \begin{bmatrix} \sigma(z_1^{[1]})\\ \sigma(z_2^{[1]})\\ \sigma(z_3^{[1]})\\ \sigma(z_4^{[1]})\end{bmatrix} = \begin{bmatrix} a_1^{[1]}\\ a_2^{[1]}\\ a_3^{[1]}\\ a_4^{[1]}\end{bmatrix} $$
<<<
!! 3. Computation for entire NN
For a given input x, to make a prediction, the network needs to compute the following equations
<<<
$$a^{[0]} =x$$
$$z^{[1]} = w^{[1]}x + b^{[1]}$$
$$a^{[1]} = \sigma(z^{[1]})$$
$$z^{[2]} = w^{[2]}x + b^{[2]}$$
$$a^{[2]} = \sigma(z^{[2]}) = \hat{y}$$
<<<
,,tags: [[COURSE1: Neural Networks & Deep Learning]] | [[03 June 2021]],,
!Hyperparameter tuning in Practice
!! How to organize the [[Hyperparameter]] search process?
* Hyperparameter settings from one application area may or may not be transferable to another
* Intuition to get stale. Reevaluate occasionally, at least once every several months
!! Pandas vs Caviar Approach
''Pandas''
<img src='https://livecodestream.dev/post/how-to-work-with-pandas-in-python/featured.jpg' width=250>
* ''Babysit one model''
* used when not a lot of computation resources at disposal.
* Called 'Pandas Approach' because Pandas usually have one or two kids max and they make efforts to survive their offspring
''Caviar''
<img src='https://www.caviaronline.ae/wp-content/uploads/2018/12/Gallery-04.jpg' width=250>
* ''Train a lot of models parallely''
* used when lot of computational resources are available
* Caviar fish lays millions of eggs in the season and doesn't pay too much attention to each egg.
,,Tags:[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
! Object Detection
!! [[Sliding Window Detection Algorithm]]
* use a bounding box of specific size and lay it over the image to detect car in the image. Then slide the bounding box with some stride to detect the object in that region till all regions are covered.
<img src='https://dummyimage.com/600x400/000/fff' width=250>
''Downside''
* huge computational cost
* Using a coarser granurality may hurt performance
* Earlier, before [[ConvNet]]s, [[Sliding Windows]] method usually computed outputs with linear classifiers over hand engineered features which ran fast, but it is slow for a convnet
* Sliding window method can be implemented convolutionally
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[04 July 2021]],,
!Convolutional Implementation of Sliding Windows
Turning [[Fully Connected]] layers into [[Convolution]]al layers
<img src='https://miro.medium.com/max/1800/1*B1bu-K9owmN_3jFebCsuvQ.png' width=600>
Let's say the train image was $$14 \times 14 \times 3$$ but the test image is $$16 \times 16\times 3$$, Running [[Sliding Windows]] convolutionally tells us that, a lot of computation is shared.
For a $$16 \times 16\times 3$$ image, there are 4 windows with a stride of 2.
<img src='http://media5.datahacker.rs/2018/11/sl4.png'>
Using [[Max Pooling]] of $$ 2 \times 2$$ corresponds to running [[Neural Network]] with the stride of two in the original image.
''Drawback''
* The [[Bounding Box]] location will not be too accurate
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[04 July 2021]],,
!Normalizing activations in a network
[[Batch Normalization]] makes your [[Hyperparameter]] search easier and makes [[Neural Network]] more robust. This also enables you to train a very deep NN.
We looked at input feature normalization, where doing so makes the [[Cost Function]] to search the minima easily.
<<<
$$\mu = \frac{1}{m}\sum_ix^{(i)}$$
$$x -= \mu$$
$$\sigma^2 = \frac{1}{m}\sum_ix^{(i)^2} \leftarrow$$ element wise multiplication
$$X /= \sigma$$
<<<
doing the same at activation function level for hidden layers can speed up the process of training. Normalize $$z^{[2]}$$ to train $$W^{[3]}, b^{[3]}$$ faster. There is also a debate on whether, the norm should happen before or after the applicatino of [[Activation Function]]. ''The default way to do it is before applying the Activation Function i.e. applying [[Batch Normalization]] to $$z$$ rather than $$a$$''
!! Implementing Batch Norm
Given some intermediate values in NN for a layer $$l$$
<<<
$$z^{[l](1)}, z^{[l](2)}, ..., z^{[l](m)}$$
$$\mu = \frac{1}{m}\sum_iz^{[l](i)}$$
$$\sigma^2 = \frac{1}{m}\sum_i(z^{[l](i)} - \mu) $$
$$z_{norm}^{[l](i)} = \frac{z^{[l](i)} - \mu}{\sqrt{\sigma^2 + \varepsilon}}$$
<<<
While normalizing the hidden inputs , you don;t always want the mean and variances to be 1 and 0 respectively. You also want to take advantage of non-linearity offered by the activation function, so you can chose to set it whatever you want.
$$\tilde{z}^{[l](i)} = \gamma z_{norm}^{[l](i)} + \beta$$
Where $$\gamma$$ & $$\beta$$ are learnable parameters of the model, just like $$W,b$$. And so, in later computations the layer you need to use is $$\tilde{z}^{[l](i)}$$ instead of $$z^{[l](i)}$$.
if $$\gamma = \sqrt{\sigma^2 + \varepsilon} $$ and $$\beta = \mu$$ then $$ \tilde{z}^{[l](i)} = z^{[l](i)}$$.
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
!! Refinements to [[Beam Search]]
!!! Objective Function
$$
\arg \max_y \prod_{t=1}^{T_y} P(y^{\langle t \rangle} | x, y^{\langle 1 \rangle}, ..., y^{\langle t-1 \rangle})
$$
This objective function is prone to numerical underflow, that the precision of numbers as a result of multiplied probabilities of larger sentences has to be very high. Storing such numbers in memory becomes a huge challenge. A more stable approach is to take log of probabilities and sum them up
$$
\arg \max_y \sum_{t=1}^{T_y} \log P(y^{\langle t \rangle} | x, y^{\langle 1 \rangle}, ..., y^{\langle t-1 \rangle})
$$
This objective function has one problem - it inherently prefers short sentences. Because as the numbers get multiplied with smaller numbers, the probability goes down which penalizes larger sentences. Using length normalization can overcome this problem
!!! Length Normalization
$$
\arg \max_y \frac{1}{T_y^{\alpha}} \sum_{t=1}^{T_y} \log P(y^{\langle t \rangle} | x, y^{\langle 1 \rangle}, ..., y^{\langle t-1 \rangle})
$$
This quantity is called normalized log likelihood. Using $$\frac{1}{T_y^{\alpha}}$$ for length normalization.
* $$\alpha$$ = parameter for normalization - tuneable
* $$\alpha$$ (default) = 0.7
* $$\alpha$$ = 1 (normalize by length directly)
* $$\alpha$$ = 0 (No normalization)
!! How do you chose the beam width B?
Larger B $$\rightarrow$$ more possibilities considered $$\rightarrow$$ better sentence but more computationally expensive. Often has diminishing returns
* 10 - Small (production systems)
* 100 - large
* 1000 - research
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!Vectorizing Across Multiple Training Examples
!! Notation $$a^{[l](i)}$$
* $$i$$ stands for training example
* $$l$$ stands for hidden/output layer
!! Computing NN output on multiple training examples
for $$i$$ in range($$m$$):
<<<
$$z^{[1](i)} = w^{[1]}x^{(i)} + b^{[1]}$$
$$a^{[1](i)} = \sigma(z^{[1](i)})$$
$$z^{[2](i)} = w^{[2]}x^{(i)} + b^{[2]}$$
$$a^{[2](i)} = \sigma(z^{[2](i)}) = \hat{y}^{(i)}$$
<<<
!! [[Vectorization]] across training examples
The training examples are stacked vertically. with hidden units in rows and training examples as columns
$$X = \begin{bmatrix} | & | & ... & | \\ x^{(1)} & x^{(2)} & ... & x^{(m)} \\ | & | & ... & |\end{bmatrix} $$
The linear output matrix Z for layer [1]
$$Z^{[1]} = W^{[1]}\begin{bmatrix} | & | & ... & | \\ x^{[1](1)} & x^{[1](2)} & ... & x^{[1](m)} \\ | & | & ... & |\end{bmatrix} + b^{[1]}=\begin{bmatrix} | & | & ... & | \\ W^{[1]}x^{[1](1)} + b^{[1]} & W^{[1]}x^{[1](2)}+ b^{[1]} & ... & W^{[1]}x^{[1](m)}+ b^{[1]} \\ | & | & ... & |\end{bmatrix} = \begin{bmatrix} | & | & ... & | \\ z^{[1](1)} & z^{[1](2)} & ... & z^{[1](m)} \\ | & | & ... & |\end{bmatrix} $$
Similarly, the activation matrix A for layer [1]
$$A^{[1]} = \begin{bmatrix} | & | & ... & | \\ \sigma(z^{[1](1)}) & \sigma(z^{[1](2)}) & ... & \sigma(z^{[1](m)}) \\ | & | & ... & |\end{bmatrix} = \begin{bmatrix} | & | & ... & | \\ a^{[1](1)} & a^{[1](2)} & ... & a^{[1](m)} \\ | & | & ... & |\end{bmatrix} $$
''Vectorized form''
<<<
$$Z^{[1]} = W^{[1]}X + b^{[1]}$$
$$A^{[1]} = \sigma(Z^{[1]})$$
$$Z^{[2]} = W^{[2]}X + b^{[2]}$$
$$A^{[2]} = \sigma(Z^{[2]})$$
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] |
[[03 June 2021]],,
A good way to get the output of [[Bounding Box]] location is using the [[YOLO]] algorithm - ''You Only Look Once''
!! How does it work?
Place a grid on the image, usually $$19 \times 19$$, and apply [[Image Classification]] and Localization on each cell
<img src='https://cdn.analyticsvidhya.com/wp-content/uploads/2018/12/Screenshot-from-2018-11-15-17-46-32.png' width=300>
On this image, a 3x3 grid is applied for illustration. The output of the label will be same for each grid cell in top and bottom rows and for the center one. The YOLO algo, will take the midpoint of each of the two objects and assign it to the grid that grid cell. For each grid cell, 8 dim output vector will be generated, and for 3x3 grid the output vector is 3 x 3 x 8.
$$
y = \begin{bmatrix}
p_c \\ b_x \\ b_y \\ b_h \\ b_w \\ c1 \\ c2 \\ c3
\end{bmatrix} =
\begin{bmatrix}
0\\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ?
\end{bmatrix} or
\begin{bmatrix}
1 \\ b_x \\ b_y \\ b_h \\ b_w \\ 0 \\ 1 \\ 0
\end{bmatrix}
$$
!! Advantages
* outputs precise bounding boxes when using fine 19 x 19 grid cells. This will also reduce the chance of multiple objects being assigned to the same grid cell.
* This is [[Convolution]]al operation and you are not running computation for each 3 x 3 or 19 x 19 grid cell. So, it is computationally efficient even for real time detection
!! How do you encode $$b_x, b_y, b_w, b_h$$?
These are specified relative to grid cell
* $$b_h, b_w$$ can be greater than 1
* $$b_y, b_x$$ between 0 and 1
,,[[COURSE4: Convolutional Neural Networks]] | [[26 July 2021]],,
Because [[Beam Search]] is approximate heuristic search algorithm, it will be important to identify if the results are not reasonable, whether it is due to the beam search algorithm or caused by [[RNN]]
* X : Jane visite l'Afrique en Septembre
* Human : Jane visits Africa in September ($$y^*$$)
* Algo: Jane visited Africa last September ($$\hat{y}$$)
Use the network to compute probabilities $$P(y^*|x)$$ & $$ P(\hat{y}|x)$$. There will be two cases
!!! Case 1: $$P(y^*|x) > P(\hat{y}|x)$$
* Beam search chose $$\hat{y}$$ instead of $$y^*$$ even when the probability of more accurate translation is high.
* ''Conclusion: beam search is at fault''
!!! Case 2: $$P(y^*|x) \leq P(\hat{y}|x)$$
* Given $$y^*$$ is more accurate, RNN predicted a lower probability for it than $$\hat{y}$$ sentence
* ''Conclusion: RNN is at fault''
!!! Error Analysis Process
<img src='https://miro.medium.com/max/1400/1*GdEPJOlkhPl4v9wJkgm91g.png' width=600>
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!Fitting Batch Normalization into a Neural Network
<img src='https://dummyimage.com/600x400/000/fff' width=250>
[[Batch Normalization]] is applied between the computation of $$z$$ and application of [[Activation Function]]
$$X \rightarrow \big[W^{[1]}, b^{[1]}\big] \rightarrow Z^{[1]} \rightarrow \big[\gamma^{[1]}, \beta^{[1]}\big] \rightarrow \tilde{Z}^{[1]} \rightarrow a^{[1]} = g^{[1]}(\tilde{Z}^{[1]})$$
and parameters for NN become
<<<
$$w^{[1]}, b^{[1]}, w^{[2]}, b^{[2]},...,w^{[L]}, b^{[L]}$$
$$\gamma^{[1]}, \beta^{[1]}, \gamma^{[2]}, \beta^{[2]},...,\gamma^{[L]}, \beta^{[L]}$$
<<<
''Note'': $$\beta \neq \beta_1, \beta_2$$ from [[Adam]] or from Momentum terms
While training the NN, [[Batch Normalization]] will be applied to [[Mini-batch]]es
$$X^{\{1\}} \rightarrow \big[W^{[1]}, b^{[1]}\big] \rightarrow Z^{[1]} \rightarrow \big[\gamma^{[1]}, \beta^{[1]}\big] \rightarrow \tilde{Z}^{[1]} \rightarrow a^{[1]} = g^{[1]}(\tilde{Z}^{[1]})$$
!! Detail to parameterization
<<<
Parameters : $$w^{[l]}, b^{[l]}, \gamma^{[l]}, \beta^{[l]}$$
$$z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$$
First computed $$\mu$$. When you subtract $$\mu$$ from $$z$$, the $$b$$ paramter gets subtracted out. So you can get rid of $$b$$ while using [[Batch Normalization]].
$$z^{[l]} = w^{[l]}a^{[l-1]} $$
$$\tilde{z}_{norm}^{[l]} = \gamma^{[l]} z_{norm}^{[l]} + \beta^{[l]} $$
<<<
''Dimensions''
<<<
$$z^{[l]} = \beta^{[l]} = \gamma^{[l]} \rightarrow (n^{[l]}, 1)$$
<<<
!! Implementing [[Gradient Descent]] using [[Batch Normalization]]
!!!for t =1 to minibatch
<<<
Compute forward prop on $$X^{\{t\}}$$
: In each hidden layer, use [[Batch Normalization]] to replace $$ z^{[l]}$$ with $$\tilde{z}^{[l]}$$
use backprop to compute $$dW^{[l]}, d\beta^{[l]}, d\gamma^{[l]}$$
''Update parameters'':
: $$ w^{[l]} := w^{[l]} - \alpha dw^{[l]}$$
: $$ \beta^{[l]} := \beta^{[l]} - \alpha d\beta^{[l]}$$
: $$ \gamma^{[l]} := \gamma^{[l]} - \alpha d\gamma^{[l]}$$
<<<
This also works with [[Adam]], [[RMSProp]] and [[Gradient Descent with Momentum]].
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
! Activation Functions
$$Z^{[1]} = W^{[1]}X + b^{[1]}$$
$$A^{[1]} = g(Z^{[1]})$$
here $$g(.)$$ is more general case of activation function, since it may not be always [[Sigmoid]] activation.
<img src='https://www.researchgate.net/profile/Junxi-Feng/publication/335845675/figure/fig3/AS:804124836765699@1568729709680/Commonly-used-activation-functions-a-Sigmoid-b-Tanh-c-ReLU-and-d-LReLU.ppm' width = 600>
!! 1. [[Sigmoid]] activation Function
* Value always between $$0$$ and $$-1$$
* $$\sigma(z) = \frac{1}{1 + e^{-z}}$$
!! 2. [[tanh]] activation function
* Shifted version of sigmoid activation function
* ''Almost always better than sigmoid'' because the values between $$-1$$ and $$1$$, the mean of activations lie close to $$0$$ which ''centers the data. This makes learning next layer faster.''
* One exception where sigmoid would be required is output layer for binary classification where the number required is between $$0$$ and $$1$$
* Drawback of both sigmoid and tanh is that slope or gradient of $$z$$ becomes very small if $$z$$ is very large or very small, which can slow down gradient descent. Option is to use ReLU (Rectified Linear Unit) activation function
!! 3. [[ReLU]] activation function
* $$ a = max(0,z) $$
* The activation function is not differentiable. ''Default'' choice of activation
* One disadvantage is that the derivative is $$0$$, when $$z < 0$$, which works practically fine.
!! 4. [[Leaky-ReLU]] activation function
* $$ a = max(0.01, z)$$
* Slightly better than ReLU, the derivative is not zero as in the case of ReLU
* Using ReLU, the training is faster when compared to using tanh or sigmoid
* Leakly ReLU can be parameterized $$ a = max(k,z) $$ where k is the parameter than being a constant.
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[13 June 2021]],,
!! [[BLEU Score]]
How do you evaluate [[Machine Translation]] system if there are mutiple equally good answers. Conventional way is evaluate using [[BLEU Score]]
* BLEU - Bilingual Evaluation [[Understudy]]
* Bleu score us an [[Understudy]] - substitute for humans - to evaluate every output of Machine translation system
There are reference sentences. If the output of algo is close to any of the reference sentences, then it would get a high BLEU score. The human generated references will be provided as part of the dev/test set
: French: //Le chat est sur le tapis//
: Reference 1: //That cat is on the mat//
: Reference 2: //There is a cat on the mat//
: Machine Translation Output: //the the the the the//
''Precision'': One way to measure the machine translatio output : lookup each word in the output and check if each of the word appear in the reference sentence. For the above output precision = 7/7 - 100 percent. This measure is not enough
$$Precision = \frac{num \ of \ words \ appearing \ in \ ref \ 1 \& \ 2}{num \ of \ words \ in \ output}$$
!!! Modified Precision
We give repetition of appearing a word credit only when the number of times in the output <= max number of times the word appears any of reference sentences
Modified precision = 2/7
!! Bleu Score on Bigrams (pairs of words appearing together)
Let's say Machine translation outputs: //That cat sat on the mat//
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Possible Bigrams</th><th>Count</th><th>Countclip</th></tr></thead><tbody>
<tr><td>the cat</td><td>2</td><td>1</td></tr>
<tr><td>cat the</td><td>1</td><td>0</td></tr>
<tr><td>cat on</td><td>1</td><td>1</td></tr>
<tr><td>on the</td><td>1</td><td>1</td></tr>
<tr><td>the mat</td><td>1</td><td>1</td></tr>
</tbody></table>
Modified precision = 4/6
Clip Count = number of times the bigram appears in at least one of the references
!! Bleu score on unigrams
$$
P = \frac{\sum_{unigram \in \hat{y}} Count_{Clip} (unigram)}{\sum_{unigram \in \hat{y}} Count (unigram)}
$$
!! Bleu score on n-grams
$$
P = \frac{\sum_{unigram \in \hat{y}} Count_{Clip} (n-gram)}{\sum_{unigram \in \hat{y}} Count (n-gram)}
$$
IF machine translation output = either Ref 1 or Ref 2 then P1, P2 = 1.0
!!! Bleu Details
* $$P_n$$ = Bleu score computed on n-grams only
* Combined Bleu Score: $$BP \exp (\frac{1}{4} \sum_{i=1}^4P_i)$$
** BP - Brevity Penalty. Very short translations can have very high precision, thus easy to get high bleu score
$$
BP =
\begin{bmatrix}
1 & if MT \ output \ length > Reference \ Output \ length \\
\exp(1 - Ref Out Len / MT Out Len) & otherwise
\end{bmatrix}
$$
,,Tags: [[COURSE5: Sequence Models]] | [[20 August 2021]],,
!! Object Detection Evaluation
Using [[Intersection Over Union]] function
<img src='https://www.researchgate.net/publication/346512249/figure/fig5/AS:963793576292352@1606797703167/Illustration-of-intersection-over-union-IOU.png' width=300>
* IOU $$\geq$$ 0.5 - means correct by convention
* Higher IOU - more accurate [[Bounding Box]]
* Can use value > 0.5 to be more sringent
,,Tags :[[COURSE4: Convolutional Neural Networks]] | [[26 July 2021]],,
!Why does batch norm work?
# It does a similar thing to hidden layers as normalizing the input features, which brings them upto scale which speeds up training
# It makes the later/deeper layers in NN more robust to changes than earlier layers in the network
!! Main Reason - [[Covariate Shift]]
<img src='https://dummyimage.com/600x400/000/fff' width=250>
If $$X \rightarrow Y$$ mapping is learned on some data and if the distribution changes then you might need to retrain you learning algorithm. Applied to Deep NN, ''covariate shift'' explains why [[Batch Normalization]] work
<img src='https://dummyimage.com/600x400/000/fff' width=250>
From the perspective of layer 3, it is receiving some values just like the input features buyt as opposeed to input features, these values $$a_1^{[2]}, a_2^{[2]}, a_3^{[2]},a_4^{[2]}$$ are constantly changing due to change in $$w,b$$. So, batch norm maintains the distribution of these values even though the values may be changing constantly.
<img src='https://dummyimage.com/600x400/000/fff' width=250>
So BN limits the amount to which updating the parameters in the earlier layers can affect the distribution of values that the next hidden layer now sees.
!! Batch Norm as [[Regularization]]
One non-intuitive thing about batch-norm is that each [[Mini-batch]] $$X^{\{t\}}$$ has values $$z^{\{L\}}$$ scaled using the mean and variance on just that mini-batch, which is noisy compared to $$\mu, \sigma$$ on entire train set.
The scaling process $$z^{[l]} \rightarrow \tilde{z}^{[l]}$$ is also noisy as well because it is computer using sligtly noisy mean adn variance. So, similar to [[Dropout]], it adds noise to each hidden layer [[Activation]]s
* the way [[Dropout]] adds noise is, it takes a hidden unit and multiplies with 0 or 1, with some probability and so dropout adds ''multiplicative noise''
* Batch norm adds both ''multiplicative'' and ''additive noise''. Multiplicative on account of multiplying by [[Standard Deviation]] and additive because subtracting by mean. Here the estimates of $$\mu, \sigma$$ are noisy
And similar to dropout, batch-norm has a regularizing effect because by adding noise to the hidden units it is forcing the downstream hidden units to not rely too much on any one hidden unit.
Because the noise added is quire small, it does not have huge regularizing effect and you might choost to use batch-norm with Dropout.
By training on a larger mini-batch you also reduce noise.
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
* One of the most influential ideas in Deep Learning
* The problem of Long sequences
** hard to memorize
** Bleu score decreases for longer sentences compared to shorter sentences
<img src='https://images1.programmersought.com/0/7d/7d9252237bb231b723a4caa128054d50.png' width=500>
[[Attention Model]] basically looks at part of sentence at a time and generates some output instead of memorizing a very long sentence and predicting the output
!! Attention model Intuition
Given a sentence in French,
: Jane visite l'Afrique en Septembre
The translation would be
: Jane is visiting Africa in September
To generate the output translation, 'Jane' which part of the sentence or what specific words in the input sentence should the model be looking at? - Using attention weights
* $$\alpha^{\langle 1, 1 \rangle}$$ - attention to be paid to the first word to generate the first output
*$$\alpha^{\langle 1, 2 \rangle}$$ - attention to be paid to the second word to generate the first output
<img src='https://miro.medium.com/max/1400/1*NIxhlMqHFyhllBm4v1j2-A.png' width=500>
where,
* $$c$$ is the context
* $$\alpha^{\langle 3, t \rangle}$$ depends on $$s^{\langle 2 \rangle}, \vec{a}^{\langle t \rangle}, \overleftarrow{a}^{\langle t \rangle}$$
,,Tags: [[COURSE5: Sequence Models]] | [[21 August 2021]],,
!Batch Norm at Test time
[[Batch Normalization]] processes your data one [[Mini-batch]] at a time. But at test time you need to process examples one at a time. So, during test time, following equations are computed.
<<<
$$m$$ - training examples in [[Mini-batch]]
$$\mu = \frac{1}{m}\sum_iz^{(i)}$$
$$\sigma^2 = \frac{1}{m}\sum_i(z^{(i)} - \mu)^2 $$
$$z_{norm}^{(i)} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \varepsilon}}$$
$$\tilde{z}_{norm}^{(i)} = \gamma z_{norm}^{(i)} + \beta $$
<<<
At test time, taking mean and variance of one single example does not makes sense. So, you need to come up with different estimates of $$\mu, \sigma^2$$ and that is [[Exponentially Weighted Average]] (across mini-batches)
<<<
$$X^{\{1\}} \rightarrow \mu^{\{1\}}, \sigma^{2\{1\}}$$
$$X^{\{2\}} \rightarrow \mu^{\{2\}}, \sigma^{2\{2\}}$$
$$X^{\{3\}} \rightarrow \mu^{\{3\}}, \sigma^{2\{3\}}$$
<<<
$$\mu = $$ EWA $$(\mu^{\{1\}}, \mu^{\{2\}}, ...)$$
$$\sigma^2 = $$ EWA $$(\sigma^{2\{1\}}, \sigma^{2\{2\}}, ...)$$
then compute
<<<
$$z_{norm} = \frac{z - \mu}{\sqrt{\sigma^2 + \varepsilon}}$$
$$\tilde{z}_{norm} = \gamma z_{norm} + \beta $$
<<<
''Takeaway''
* $$\mu, \sigma^2$$ computed on mini-batch at train time but it should be available for single example at test time
,,Tags:[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
!! Problem with Object Detection
It may find multiple detections of the same object, so need to use [[Non-max suppression]] to make the algo detect only one object once
<img src='https://cdn.analyticsvidhya.com/wp-content/uploads/2020/07/graphic4.jpg' width=500>
In the above image, multiple bounding boxes are detected at multiple locations. Non Max Suppression looks at the probabilities for each object separately and suppresses the ones that are not the largest keeping only the bounding box with high IOU
''Output the prob with max value and suppress the ones with non-maximal prob values''
!! Steps Followed
For car detection algo,
* Multiple [[Bounding Box]]es detected
* While there are remaining boxes
** Repeatedly pick the box with highest prob
** Discard IOU > 0.5 with the box output in previous step
For multiple objects within a single image, the output has additional components and so the right thing to do is to carry out [[Non-max suppression]] n times for n different objects detected
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[26 July 2021]],,
Using a non-linear activation function is better than a linear or identity activation function to learn patterns, because, the output with linear inputs is a linear output. It will become difficult for the model to learn interesting patterns.
Also if your model uses hidden layers with linear activation and output layers with [[Sigmoid]], if it will function as standard [[Logistic Regression]].
$$z^{[1]} = w^{[1]}x + b^{[1]}$$
If $$g$$ is linear function
<<<
$$a^{[1]} = g^{[1]}(z^{[1]}) = z^{[1]}$$
$$a^{[1]} = z^{[1]} = w^{[1]}x + b^{[1]}$$
$$a^{[1]} = z^{[2]} \\= w^{[2]}a^{[1]} + b^{[2]} \\ = w^{[2]}(w^{[1]}x + b^{[1]}) + b^{[2]} \\ = w^{[2]}w^{[1]}x + (w^{[2]}b^{[1]} + b^{[2]}) \\ = w'x + b'$$
<<<
then output is also linear mapping.
So, a linear hidden layer is more or less useless because of a combination of two linear function is itself a linear function. One place when we might use a linear function is on a [[Regression Problem]]. If $$y \in \mathbb{R}; \hat{y} \in \mathbb{R} $$, but hidden layers have to use a non-linear activation function. Even with real output prediction with non-zero output, you can use ReLU instead of linear e.g. house price prediction.
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[13 June 2021]],,
!! problem with [[Object Detection]]
each of the grid cell can only detect one object. What if the grid cell, has multiple objects in them, you can use the idea of anchor boxes to detect more than one object
For example, in an image containing both car and pedestrian, Since the mid point for both car and pedestrian lies in the same grid cell, only one detection can be an output.
<img src='http://media5.datahacker.rs/2018/11/anchor2.png'>
By using [[Anchor Boxes]] - predefined box shapes - we can allow the algo to associate predictions with them. Because the shape of pedestrian is similar to the anchor box 1 and for the car it is similar to anchor box 2, we can now output both predictions stacked in the same vector for each Anchor box.
!! Observations
* If there are three objects within the image and there are two anchor boxes, this case is not handled very well - a default tie breaker is implemented
* If two objects share the same anchor box and a grid cell, this is also not handled very well
* In practice, 19 x 19 grid - a fine grid - is to used to detect mid points of the objects and the outcome of multiple objects sharing the mid point in the same grid cell is minimized
* Anchor boxes allows you to specialize better in detecting wide objects like cars and tall skinny objects like pedestrian
!! How do you chose Anchor boxes?
* People use to chose them by hand
* Group shapes into [[k-means algorithm]] and select the shapes stereotypically representative of multiple objects
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[26 July 2021]],,
* [[GRU]] and [[LSTM]] are commonly used - LSTM more common than GRU
* $$a^{\langle t' \rangle} = (\vec{a}^{\langle t \rangle}, \overleftarrow{a}^{\langle t \rangle})$$ : feature vector for time step $$t$$, concatenates forward and backward activations for simplicity
* $$\alpha^{\langle t, t' \rangle}$$ : amount of attention that $$y^{\langle t \rangle}$$ should pay to $$\alpha^{\langle t'\rangle}$$ where $$a^{\langle t'\rangle} = (\vec{a}^{\langle t \rangle}, \overleftarrow{a}^{\langle t \rangle})$$
** $$t$$ - English Words
** $$t'$$ - French Words
* Attention weights : Non Negative and sum to 1
!!! Equations
$$
\sum_{t'} \alpha^{\langle 1, t' \rangle} =1 $$
$$
c^{\langle 1 \rangle} = \sum_{t'} \alpha^{\langle 1, t' \rangle}\alpha^{\langle t' \rangle} $$
$$
\alpha^{\langle t, t' \rangle} = \frac{\exp (e^{\langle t, t' \rangle})}{\sum_{t'=1}^{T_x} \exp (e^{\langle t, t' \rangle})}
$$
$$
\begin{matrix}
s^{\langle t-1 \rangle} & \longrightarrow \\
a^{\langle t' \rangle} & \longrightarrow
\end{matrix}
\begin{bmatrix} \bigodot \\ \bigodot \end{bmatrix}
\longrightarrow
e^{\langle t, t' \rangle}
$$
* Compute $$e^{\langle t, t' \rangle}$$ and use [[Softmax]] to make sure $$\alpha$$s sub upto 1.
* where $$e^{\langle t, t' \rangle}$$ can be computed using a small Neural Network, because we don't know what the function might be, so turning to [[Gradient Descent]] to find the right function
* ''Downside'': It takes quadratic cost to run this algorithm. If $$T_x$$ are the # of inputs and $$T_y$$ are # of outputs then total number of attention parameters are going to be $$T_x \times T_y$$. This is however acceptable since the sentences in [[Machine Translation]] are not that lang
* Same idea can be applied to [[Image Captioning]] as well. While captioning the image the model looks only at a part of the picture at a time
<img src='https://miro.medium.com/max/1400/1*NIxhlMqHFyhllBm4v1j2-A.png' width=500>
!! Attention Examples
* Date Normalization Problem
** July 20th, 1969 $$\longrightarrow$$ 1969-07-20
** 23 April, 1564 $$\longrightarrow$$ 1564-04-23
* Visualization of different attention weights. 2 x 2 matrix of words and attention value to denote which words were to generate which outputs
,,Tags: [[COURSE5: Sequence Models]] | [[21 August 2021]],,
!Derivatives of activation functions
!! [[Sigmoid]] activation function
<img src='https://miro.medium.com/max/970/1*Xu7B5y9gp0iL5ooBj7LtWw.png' width=300>
$$
g(z) = \frac{1}{1 + e^{-z}}$$
$$
g'(z) = (\frac{1}{1 + e^{-z}})(1 - \frac{1}{1 + e^{-z}}) = g(z)(1-g(z))$$
''Cases''
* If $$z=10$$ (very large) then $$g(z) = 1$$ and $$g'(z) = 1 \times (1 - 1) = 0$$
* If $$z = -10$$ (very small) then $$ g(z) = 0$$ and $$g'(z) = 0\times(1-0) = 0$$
* If $$z=0$$ then $$g(z) = 0.5$$ and $$g'(z) = 0.5 \times (1-0.5) = 0.25$$
!! [[tanh]] activation function
<img src='https://paperswithcode.com/media/methods/Screen_Shot_2020-05-27_at_4.23.22_PM_dcuMBJl.png' width=300>
$$
g(z) = tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}
$$
$$
g'(z) = tanh(z) = 1-tanh(z)^2
$$
''Cases''
* If $$z=10 \rightarrow tanh(z) \approx 1 \rightarrow g'(z) \approx 0$$
* If $$z=-10 \rightarrow tanh(z) \approx -1 \rightarrow g'(z) \approx 0$$
* If $$z=0 \rightarrow tanh(z) \approx 0 \rightarrow g'(z) \approx 1$$
!! [[ReLU]] and [[Leaky-ReLU]] activation function
<img src='https://miro.medium.com/max/1408/1*A_Bzn0CjUgOXtPCJKnKLqA.jpeg' width=500>
''Relu''
$$g(z) = max(0,z)$$
$$g'(z) = \begin{Bmatrix} 0 & z<0 \\ 1 & z > 0 \\ undef & z =0\end{Bmatrix}$$
''leaky-Relu''
$$g(z) = max(0.01,z)$$
$$g'(z) = \begin{Bmatrix} 0.01 & z<0 \\ 1 & z > 0 \\ undef & z =0\end{Bmatrix}$$
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[14 June 2021]],,
!Softmax Regression
For multiple classes, there is a generalization of [[Logistic Regression]] called [[Softmax Regression]] that lets you make predictions where you are trying to recognize one of multiple classes rather than just two classes.
* $$0, 1, 2, 3 \rightarrow$$ 4 classes
* $$C \rightarrow$$ number of classes
* $$n^{[L]}$$ - output layers has C units
* Shape of $$ \hat{y}\rightarrow (C,1) $$
<img src='https://dummyimage.com/600x400/000/fff' width=250>
The standard model of getting your NN to do this is using the [[Softmax]] layer to generate $$p(Class|x)$$
In the final layer of NN,
$$ z^{[L]} = w^{[L]}a^{[L-1]} + b^{[L]} $$
$$ a^{[L]} = e^{(z^{[L]})}/\sum_{i=1}^4t_i \ ; \ a_i^{[L]} = t_i/\sum_{i=1}^4t_i$$
''Example''
<<<
$$Z^{[L]} = \begin{bmatrix} 5 \\ 2\\ -1\\3 \end{bmatrix} ; t = \begin{bmatrix} e^5 \\ e^2\\ e^{-1}\\e^3 \end{bmatrix} = \begin{bmatrix} 148.4 \\ 7.4 \\ 0.4\\20.1 \end{bmatrix}$$
$$\sum_{i=1}^4t_i = 176.3$$
$$a^{[L]} = t/176.3$$
$$a^{[1]} = e^5/176.3 = 0.842$$
$$a^{[2]} = e^2/176.3 = 0.042$$
$$a^{[3]} = e^{-1}/176.3 = 0.002$$
$$a^{[4]} = e^3/176.3 = 0.114$$
where $$a^{[1]} + a^{[2]}+a^{[3]} + a^{[4]} = 1$$
<<<
Unlike the [[Activation Function]] which uses single real number as input value, [[Softmax]] [[Activation Function]] takes in $$(C,1)$$ shaped vector and outputs $$(C,1)$$ shaped vector. One intuition is that the [[Decision Boundary]] between any two classes will be linear.
<img src='https://dummyimage.com/600x400/000/fff' width=250>
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
! Gradient Descent for Neural Networks
Neural Network with a single hidden layer
''Parameters''
<<<
$$w^{[1]}$$ - Shape $$(n^{[1]},n^{[0]})$$
$$b^{[1]}$$ - Shape $$(n^{[1]},1)$$
$$w^{[2]}$$ - Shape $$(n^{[2]},n^{[1]})$$
$$b^{[2]}$$ - Shape $$(n^{[2]},1)$$
<<<
where
* $$n^{[0]}$$ - number of input features
* $$n^{[1]}$$ - number of hidden units
* $$n^{[2]}$$ - number of output units
''Cost Function''
<<<
$$\mathcal{J}(w^{[1]}, b^{[1]}, w^{[2]}, b^{[2]}) = \frac{1}{m}\sum_{i=1}^m \mathcal{L}(\hat{y},y)$$
<<<
!!Gradient Descent
''Repeat''
<<<
compute predictions $$(\hat{y^{(i)}}; i = 1,...,m)$$
$$dw^{[1]} = \frac{d\mathcal{J}}{dw^{[1]}}$$ ;
$$db^{[1]} = \frac{d\mathcal{J}}{db^{[1]}}$$
$$w^{[1]} := w^{[1]} - \alpha dw^{[1]}$$ ;
$$b^{[1]} := b^{[1]} - \alpha db^{[1]}$$
Similarly for layer 2,
$$dw^{[2]} = ...$$ ;
$$db^{[2]} = ...$$
$$w^{[2]} := ...$$;
$$b^{[2]} := ...$$
<<<
!! Forward Prop Equations
<<<
$$Z^{[1]} = W^{[1]}X + b^{[1]}$$
$$A^{[1]} = g(Z^{[1]})$$
$$Z^{[2]} = W^{[2]}X + b^{[2]}$$
$$A^{[2]} = g(Z^{[2]}) = \sigma(Z^{[2]})$$ for binary classification
<<<
!! [[Backpropagation]] equations
<<<
$$dZ^{[1]} = A^{[2]} - Y$$; where $$Y = [y^{(i)},...,y^{(m)}]$$
$$dW^{[2]} = \frac{1}{m} dZ^{[2]} A^{[1]T}$$
$$db^{[2]} = \frac{1}{m}np.sum(dZ^{[2]}, axis=1, keepdims=True)$$
$$dZ^{[1]} = W^{[2]T}dZ^{[2]}.g^{[1]}(Z^{[1]})$$
$$dW^{[1]} = \frac{1}{m}dZ^{[1]}X^T$$
$$db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis=1, keepdims=True)$$
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[14 June 2021]],,
''Training''
<<<
(100 x 100 x 3) $$ \rightarrow $$ CONVNET $$ \rightarrow $$ 3 x 3 x 16 (Anchors 2 x 8)
<<<
''Predictions''
<<<
(100 x 100 x 3) $$ \rightarrow $$ CONVNET $$ \rightarrow $$ Bounding Box $$ \rightarrow $$ [[Non-max suppression]]
<<<
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[26 July 2021]],,
!! [[Speech Recognition]]
$$\begin{matrix} X \\ Audio \ Clip \end{matrix} \longrightarrow \begin{matrix} Y \\ Text \ Transcript\end{matrix} $$
<img src='https://miro.medium.com/max/1634/1*4lLl50Qd6DsWQh4FOQF0iw.png' width=400>
* Earlier [[Phonemes]] (Hand Engineered features for audio) were used to learn audio to transcript mapping. These are no longer required
* this was made possible by use of larger datasets. Academic datasets were (300 hour - 3000 hour) smaller than commercial counterparts which were to the tune of 10k - 100k hours of audio
!! [[Attention Model]] for Speech Recognition
<img src='https://lh3.googleusercontent.com/proxy/FcTdyRRVrgZNthftJB1uAN2PVdS0uxSWFkY5J1Ae-b-9H4cLlPWcnXagoPM-veOb2togZP6Z2lWAAMrpL2S7kuzh0n93VaUC40KQRQiUa1HxAOoqJXesXA'>
!!! CTC cost for Speech Recognition
* [[CTC Cost]] - Connection Temporal Classification
* Let's say the audio clip was of someone saying //'The quick brown fox'//, using a [[RNN]] structure with equal number of input x and output $$y$$'s. The number of time steps will be very large like 1000 inputs (100 samples /sec for 10 seconds) - but the output might not have 1000 outputs
* The CTC cost function allows NN output like :
:$$ttt \_\_h\_eee\_\_\_\langle space \rangle \_\_\_qqq\_\_
\xrightarrow{collapsed \ using \ CTC \ Cost} the \langle space \rangle q$$
:This allows the RNN to have 1000 outputs by inserting blanks and repeating characters and shrink it to smaller actual output by using CTC Cost Function
!Training a Softmax Classifier
<<<
$$Z^{[L]} = \begin{bmatrix} 5 \\ 2\\ -1\\3 \end{bmatrix} ; t = \begin{bmatrix} e^5 \\ e^2\\ e^{-1}\\e^3 \end{bmatrix}$$
$$a^{[L]} = g^{[L]}(z^{[L]}) = \begin{bmatrix} e^5/(e^5 +e^2 + e^{-1} + e^3) \\ e^2/(e^5 +e^2 + e^{-1} + e^3) \\ e^{-1}/(e^5 +e^2 + e^{-1} + e^3) \\e^3/(e^5 +e^2 + e^{-1} + e^3) \end{bmatrix} = \begin{bmatrix} 0.842 \\ 0.042 \\ 0.002 \\ 0.114 \end{bmatrix}$$
<<<
!! Understanding Softmax
The name of [[Softmax]] comes from contrasting with ''hard-max'', which would have taken the vector $$z = \begin{bmatrix} 5 \\ 2\\ -1\\3 \end{bmatrix}$$ and turned into $$\begin{bmatrix} 1 \\ 0\\ 0\\ 0 \end{bmatrix}$$ where the biggest element gets the output 1 and rest as 0, Whereas [[Softmax]] is more of a gently mapping from $$z^{[L]} \rightarrow a^{[L]}$$ probabilties
[[Softmax Regression]] generalizes [[Logistic Regression]] to $$C$$ classes. If $$C = 2$$, softmax reduces to [[Logistic Regression]]. $$a^{[L]} = \begin{bmatrix} 0.842 \\ 0.158 \end{bmatrix}$$. Because these two numbers have to always sum to 1, this representation is actually redundant. And the way you compute single number reduces to how it is computed in Logistic Regression.
!! Loss Function
''How to train NN with Softmax output layer''
$$y = \begin{bmatrix} 0 \\ 1\\ 0\\ 0 \end{bmatrix} \ ; \ \hat{y} = \begin{bmatrix} 0.3 \\ 0.2 \\ 0.1\\ 0.4 \end{bmatrix}$$
$$\mathcal{L}(\hat{y},y) = - \sum_{j=1}^Cy_j\log\hat{y}_j$$
Loss for current example = $$ -y_2\log\hat{y}_2 = -\log\hat{y}_2$$. So, while training, [[Gradient Descent]] will try to reduce loss and make it small, then $$-\log\hat{y}_2$$ should be small and hence $$\hat{y}_2$$ should be as large as possible, but cannot be more than 1. This turns out to be a form of [[Maximum Likelihood Estimation]]
!! Cost Function
$$\mathcal{J}(w^{[1]},b^{[1]},...) = \frac{1}{m}\sum_{i=1}^m\mathcal{L}(\hat{y}^{(i)},y^{(i)})$$
!! Implementation Detail
$$y = [y^{(1)}, y^{(2)},..., y^{(m)}] $$
$$ = \begin{bmatrix} 0 & 1 & ... & 0 \\ 1 & 0 & ... & 0 \\0 & 0 & ... & 0 \\ 0 & 0 & ... & 1\end{bmatrix} = (4,m) $$ dim matrix = $$\hat{y}$$
!! [[Gradient Descent]] with [[Softmax]]
* Forward Prop
* Backward Prop
<img src='https://dummyimage.com/600x400/000/fff' width=250>
''Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]]''
!Backprop Intuition
For [[Logistic Regression]], given this computation graph the gradients are computed as follows
<img src="https://i.ibb.co/pb8PDhw/Logistic-Regression.png" alt="Logistic-Regression" width="400">
$$
da = \frac{d\mathcal{L}(a,y)}{da} = \frac{d}{da}(-y \log{a} - (1-y)\log{(1-a)}) = \frac{-y}{a} + \frac{1-y}{1-a}
$$
$$
dz = a - y = \frac{d\mathcal{L}}{dz} = \frac{d\mathcal{L}}{da} . \frac{da}{dz} = da.g'(z)
$$
$$
dw = dz.x ; \ db = dz
$$
For [[Neural Network]]s, this computation is done twice
<img src="https://i.ibb.co/Hz2FBGG/NN-gradients.png" alt="NN-gradients" border="0">
<<<
$$da^{[2]} = \frac{d\mathcal{L}(a^{[2]},y)}{da^{[2]}}$$
$$dz^{[2]} = a^{[2]} - y$$
$$dW^{[2]} = dz^{[2]}a^{[1]T} - y$$
$$db^{[2]} = dz^{[2]}$$
$$dz^{[1]} = W^{[2].T}dz^{[2]}\ * \ g^{[1]'}(z^{[1]}) $$
$$dW^{[1]} = dz^{[1]}x^{T}$$
$$db^{[1]} = dz^{[1]}$$
<<<
!! Note on Shapes
* Input Units - $$n_x = n^{[0]}$$
* Hidden units - $$n^{[1]}$$
* Output units - $$n^{[2]} = 1$$
<<<
$$W^{[2]} = (n^{[2]}, n^{[1]})$$
$$z^{[2]}, dz^{[2]}$$ have same shape = $$(n^{[2]},1)$$
$$z^{[1]}, dz^{[1]}$$ have same shape = $$(n^{[1]},1)$$
where in
$$dz^{[1]} = W^{[2].T}dz^{[2]}\ * \ g^{[1]'}(z^{[1]}) = (n^{[1]}, n^{[2]}) (n^{[2]},1) * (n^{[1]},1) = (n^{[1]},1) * (n^{[1]},1)$$
<<<
,,Tags:[[COURSE1: Neural Networks & Deep Learning]] | [[14 June 2021]],,
!Deep Learning Frameworks
* [[Caffe]]
* [[CNTK]]
* [[DL4J]]
* [[Keras]]
* [[Lasagne]]
* [[Mxnet]]
* [[PaddlePaddle]]
* [[TensorFlow]]
* [[Theano]]
* [[Torch]]
Each of these frameworks have dedicated developer community.
!! Choosing a deep learning framework
* Ease of programming (development to deployment)
* Running Speed
* Truly Open ([[Open-Source]] frameworks with good governance)
Good governance means the intent of the company to keep the product open source so as to not benefit from making users liek the product and get used to them when open source and gradually moving to proprietary functionality
Using these frameworks can help speed up the process of developing iterating and deploying easier than writing a custom code.
!! TensorFlow
* [[Deep Learning]] Framework for algorithm developement
* In TensorFlow, you only have to write the forward propagation step and code to compute the [[Cost Function]]. TF on its own figures out the [[Backpropagation]] or Gradient computation
```python
with tf.GradientTape():
cost = cost_function()
grads = tape.gradient(cost, trainable_params)
optimizer.apply_gradients(zip(grads, traininable_params))
```
Analogy to recording a casette tape and rewinding to compute gradients.
''At its heart, TensorFlow creates a computation graph when specifying the cost function and figures out back-propagation on its own''
,,Tags: [[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[18 June 2021]],,
!! Region Proposals
Instead of running [[Sliding Windows]] convolutionally on all unique positions in the image, run the [[Sliding Window Detection Algorithm]] on specific regions determined by segmentation algorithm
The segmentation algorithm identifies interesting regions to selectively run [[ConvNet]] classifier on. The number of positions offered by algo are also quite less compared to all different positionsin the image determined by [[Sliding Windows]]. This algorithm is called [[R-CNN]]
!! RCNN
* Propose regions
* Classify proposed regions at a time - Output Label + [[Bounding Box]]. It doesn't trust the BB it was given, it also outputs a Bounding Box for accurate box
!! Fast RCNN
* Propose Regions
* Convolutional Implementation of [[Sliding Window Detection Algorithm]] to classify proposed regions
!! Faster RCNN
* Use [[CNN]] to propose regions
* Still slower than [[YOLO]]
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[26 July 2021]],,
!! [[Trigger Word Detection]]
<img src='https://tiefenauer.github.io/assets/img/articles/ml/dl_5/trigger-word-detection.png' width=700>
Given an audio clip, with features $$x^{\langle 1 \rangle}, x^{\langle 2 \rangle}, x^{\langle 3 \rangle},...$$ which will be input to [[RNN]], the only thing left is to define labels
* One to do is to identify the trigger word and if said, set all the previous labels to 0 and to 1s post that trigger word.
* This creates a problem of [[Imbalanced Classification]] where there are two many zeros and very less 1s. So as a hack, return y = 1 for fixed time frame once the trigger word is detected, just to increase the number of 1s
,,Tags [[COURSE5: Sequence Models]] | [[21 August 2021]],,
!Random Initialize
!! Zero Initialize
When training a NN, it is important to initialize the weights randomly. For [[Logistic Regression]], it was okay to initialize the weights to 0, but for NN, it is required to initialize with non-zero parameters, otherwise it won't work. Why?
<img src="https://i.ibb.co/ChRNFCW/random-intialization.png" alt="random-intialization" width="400">
If the weights are initialized to zeros, then
$$
W^{[1]} = \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix};
b^{[1]} = \begin{bmatrix} 0 \\ 0 \end{bmatrix}
$$
both the activations in hidden layer 1 i.e. $$a_1^{[1]} = a_2^{[1]}$$. And over the course of training, these two activations are computing the same values because their derivatives are also equal. So it makes no sense to have more than one hidden unit, if all units in the hidden layer are computing the same function and values being ''symmetric''.
!! Random Initialize
```python
W[1] = np.random.randn(2,2) * 0.001
b[1] = np.zeros((2,1))
W[1] = np.random.randn(1,2) * 0.001
b[2] = 0
```
With random initialization, the all units in the same hidden layer will compute some different function, leading to different values and thus derivatives will be different. In turn, the pattern learnt will be more interesting.
''Also, while initializing, the weight matrices are multiplied with a small number $$0.001$$, so as to not land up in the flat parts of [[sigmoid]] or [[tanh]] function where the slope would $$\approx$$ zero, which would slow down learning''
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[14 June 2021]],,
* [[Image Recognition]] - Identify the image (CAT/DOG)
* [[Object Detection]] - Identify where in the image lies the object
* [[Semantic Segmentation]] - Which pixels in the image belongs to which object
<img src='https://miro.medium.com/max/1015/1*RWdq9qdU_ex-u-PNJ9b8LQ.png' width=700>
!! Semantic Segmentation
* Used in [[Self-Driving Car]] to identify exactly which pixels are safe to drive
* Tumor detection in brain [[MRI]] scans, segmenting the region portion of tumor takes [[Radiologists]] lot of time. [[U-Net]] algorithm is typically used to segment these regions and lower the number of images to sift through
:<img src='https://storage.googleapis.com/kaggle-media/competitions/cvpr/image_example.jpg' width=700>
!!! What is the right NN architecture for this setup?
* The [[Fully Connected]] layers are removed
* In the end, the image needs to get bigger and generate out segmented image, as the resulting architecture looks like
,,Tags: [[COURSE4: Convolutional Neural Networks]] \ [[26 July 2021]],,
! [[Ian Goodfellow]]
<img src='https://i1.sndcdn.com/artworks-000226772004-nbpyc4-t500x500.jpg' width=250>
* transitioned from [[Neuroscience]] to [[AI]]
* [[CUDA]] based in spare time
* Invented [[GAN]]
** Implemented [[GAN]] in one evening
** Future of GANs - generating training data, simulating scientific experiments
** More art than science to bring performance
* Co-authored a book with [[Yoshua Benjio]] on [[Deep Learning]]
* ''Advice to new people''
** No PHD
** Write good code and put it on [[Github]]
** Try [[arXiv]] paper writing
** Read book + work on some project
* Beginning of ML Security
** Application level security - fool computers
** Network level security - computer fooled by an attacker on a network
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[14 June 2021]],,
!! [[Transpose Convolution]]s
* Takes a smaller input and generates larger output
''How does it work?''
* Input - 2 x 2
* Convolution - 3 x 3
* Stride = 2
* Padding = 1
Instead of applying [[Stride]] and [[Padding]] on the input, it gets applied to the output. For multiple overlapping cell values, the values get added.
$$
\begin{bmatrix}
2 & 1 \\
3 & 2
\end{bmatrix}^{2 \times 2}
*
\begin{bmatrix}
1 & 2 & 1 \\
2 & 0 & 1 \\
0 & 2& 1
\end{bmatrix}^{3 \times 3}
\rightarrow
\begin{bmatrix}
0 & 0 & 0 & 0 & 0 & 0 \\
0 & 2.0 & 2.1 + 1.2 & 1.0 & 1.1 & 0 \\
0 & 2.2 & 2.1 + 1.0 & 1.2 & 1.1 & 0 \\
0 & x & x & x & x & 0 \\
0 & x & x & x & x & 0 \\
0 & 0 & 0 & 0 & 0 & 0
\end{bmatrix}^{5 \times 5}
\rightarrow
\begin{bmatrix}
0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 4 & 0 & 1 & 0 \\
0 & 10 & 7 & 6 & 3 & 0 \\
0 & 0 & 7 & 0 & 2 & 0 \\
0 & 6 & 3 & 4 & 2 & 0 \\
0 & 0 & 0 & 0 & 0 & 0
\end{bmatrix}^{4 \times 4}
$$
[[Transpose Convolution]] is the key to building [[U-Net]]
! Detection Algorithms
!! Question 1
You are building a 3-class [[Object Classification and Localization Algorithm]]. The classes are: pedestrian (c=1), car (c=2), motorcycle (c=3). What should $$y$$ be for the image below? Remember that “?” means “don’t care”, which means that the neural network loss function won’t care what the neural network gives for that component of the output. Recall $$y = [p_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3]$$
<img src="https://i.ibb.co/7VDmbk1/course4-week3-q1.png" alt="course4-week3-q1" border="0">
* $$y = [?, ?, ?, ?, ?, ?, ?, ?]$$
* $$y = [1, ?, ?, ?, ?, ?, ?, ?]$$
* $$y = [0, ?, ?, ?, ?, ?, ?, ?]$$
* $$y = [0, ?, ?, ?, ?, 0, 0, 0]$$
* $$y = [1, ?, ?, ?, ?, 0, 0, 0]$$
''Answer: 3''
!! Question 2
You are working on a factory automation task. Your system will see a can of soft-drink coming down a conveyor belt, and you want it to take a picture and decide whether (i) there is a soft-drink can in the image, and if so (ii) its bounding box. Since the soft-drink can is round, the bounding box is always square, and the soft drink can always appear as the same size in the image. There is at most one soft drink can in each image. Here’re some typical images in your training set:
<img src="https://i.ibb.co/kK6R2Xz/course4-week3-q2.png" alt="course4-week3-q2" border="0">
What is the most appropriate set of output units for your [[Neural Network]]?
* ''Logistic unit, $$b_x$$ and $$b_y$$''
* Logistic unit, $$b_x, b_y, b_h$$ since $$b_w = b_h$$
* Logistic unit, $$b_x, b_y, b_h, b_w$$
* Logistic unit (for classifying if there is a soft-drink can in the image)
<<<
''Solution'': Since the size is same every time, just need the coordinates of x and y
<<<
!! Question 3
If you build a neural network that inputs a picture of a person’s face and outputs N landmarks on the face (assume the input image always contains exactly one face), how many output units will the network have?
* $$3N$$
* $$N$$
* $$N^2$$
* $$2N$$
<<<
''Solution'' : Since we need to mark both x and y positions for each landmark hence 2N output units
<<<
!! Question 4
When training one of the object detection systems described in lecture, you need a training set that contains many pictures of the object(s) you wish to detect. However, bounding boxes do not need to be provided in the training set, since the algorithm can learn to detect the objects by itself.
* True
* False
!! Question 5
What is the IoU between these two boxes? The upper-left box is 2x2, and the lower-right box is 2x3. The overlapping region is 1x1.
<img src="https://i.ibb.co/6DCYM30/course4-week3-q5.png" alt="course4-week3-q5" border="0">
* None of the above
* 1/10
* 1/6
* ''1/9''
<<<
''Solution'':
* Interesction Area = 1 x 1 = 1
* Union Area = 2x2 + 2x3 -1x1 = 9
* iou = 1/9
<<<
!! Question 6
Suppose you run [[Non-max suppression]] on the predicted boxes above. The parameters you use for non-max suppression are that boxes with $$ probability \leq 0.4$$ are discarded, and the IoU threshold for deciding if two boxes overlap is 0.5. How many boxes will remain after non-max suppression?
<img src="https://i.ibb.co/PMF0C7B/course4-week3-q6.png" alt="course4-week3-q6" border="0">
* 6
* 7
* 3
* 4
* ''5''
<<<
Solution: 1 box of tree is collapsed and 1 box of car is collapsed
<<<
!! Question 7
Suppose you are using [[YOLO]] on a 19x19 grid, on a detection problem with 20 classes, and with 5 anchor boxes. During training, for each image you will need to construct an output volume yy as the target value for the neural network; this corresponds to the last layer of the neural network. (yy may include some “?”, or “don’t cares”). What is the dimension of this output volume?
* ''19x19x(5x25)''
* 19x19x(25x20)
* 19x19x(20x25)
* 19x19x(5x20)
<<<
''Solution'': `[pc, bx by bh, bw, c1, c2, c3, pc, bx by bh, bw, c1, c2, c3]` for 2 anchor boxes
<<<
!! Question 8
What is [[Semantic Segmentation]]?
* Locating objects in an image belonging to different classes by drawing bounding boxes around them.
* Locating an object in an image belonging to a certain class by drawing a bounding box around it.
* ''Locating objects in an image by predicting each pixel as to which class it belongs to.''
!! Question 9
Using the concept of [[Transpose Convolution]], fill in the values of X, Y and Z below.
(padding = 1, stride = 2)
```python
Input: 2x2
1 2
3 4
Filter: 3x3
1 0 -1
1 0 -1
1 0 -1
Result: 6x6
0 1 0 -2
0 X 0 Y
0 1 0 Z
0 1 0 -4
```
* X = 2, Y = -6, Z = 4
* X = -2, Y = -6, Z = -4
* ''X = 2, Y = -6, Z = -4''
* X = 2, Y = 6, Z = 4
<<<
''Solution'':
<img src="https://i.ibb.co/w6Vd1r2/course4-week3-q9.png" alt="course4-week3-q9" border="0">
<<<
!! Question 10
Suppose your input to an [[U-Net]] architecture is $$h$$ x $$w$$ x $$3$$, where 3 denotes your number of channels (RGB). What will be the dimension of your output ?
* D: $$h$$ x $$w$$ x $$n$$, where n = number of of output channels
* ''$$h$$ x $$w$$ x $$n$$, where n = number of output classes''
* $$h$$ x $$w$$ x $$n$$, where n = number of filters used in the algorithm
* $$h$$ x $$w$$ x $$n$$, where n = number of input channels
,,
Tags: [[COURSE4: Convolutional Neural Networks]] | [[05 June 2021]],,
! Natural Language Processing & Word Embeddings
!! Question 1
Suppose you learn a word embedding for a vocabulary of 10000 words. Then the embedding vectors should be 10000 dimensional, so as to capture the full range of variation and meaning in those words.
* ''False''
* True
!! Question 2
What is t-SNE?
* An open-source sequence modeling library
* A supervised learning algorithm for learning word embeddings
* A non-linear dimensionality reduction technique
* ''A linear transformation that allows us to solve analogies on word vectors''
!! Question 3
Suppose you download a pre-trained word embedding which has been trained on a huge corpus of text. You then use this word embedding to train an RNN for a language task of recognizing if someone is happy from a short snippet of text, using a small training set.
```
x (input text) y (happy?)
I'm feeling wonderful today! 1
I'm bummed my cat is ill. 0
Really enjoying this! 1
```
Then even if the word “ecstatic” does not appear in your small training set, your RNN might reasonably be expected to recognize “I’m ecstatic” as deserving a label $$y = 1$$.
* False
* ''True''
!! Question 4
Which of these equations do you think should hold for a good word embedding? (Check all that apply)
# $$e_{boy} - e_{girl} \approx e_{brother} - e_{sister}$$
# $$e_{boy} - e_{girl} \approx e_{sister} - e_{brother}$$
# $$e_{boy} - e_{brother} \approx e_{sister} - e_{girl}$$
# $$ e_{boy} - e_{brother} \approx e_{girl} - e_{sister}$$
Answer: 1,4
!! Question 5
Let $$E$$ be an embedding matrix, and let $$o_{1234}$$ be a one-hot vector corresponding to word 1234. Then to get the embedding of word 1234, why don’t we call $$E * o_{1234}$$ in Python?
* This doesn’t handle unknown words (`<UNK>`)
* The correct formula is $$E^T* o_{1234}$$
* ''It is computationally wasteful.''
* None of the above: calling the [[Python]] snippet as described above is fine.
!! Question 6
When learning [[Word Embeddings]], we create an artificial task of estimating $$P(target \mid context)$$. It is okay if we do poorly on this artificial prediction task; the more important by-product of this task is that we learn a useful set of word embeddings.
* False
* ''True''
!! Question 7
In the [[word2vec]] algorithm, you estimate $$P(t \mid c)$$, where $$t$$ is the target word and $$c$$ is a context word. How are $$t$$ and $$c$$ chosen from the training set? Pick the best answer.
* ''$$c$$ and $$t$$ are chosen to be nearby words.''
* $$c$$ is a sequence of several words immediately before $$t$$.
* $$c$$ is the sequence of all the words in the sentence before $$t$$.
* $$c$$ is the one word that comes immediately before $$t$$.
!! Question 8
Suppose you have a 10000 word vocabulary, and are learning 500-dimensional word embeddings. The word2vec model uses the following [[Softmax]] function:
$$
P(t \mid c) = \frac{e^{\theta_t^T e_c}}{\sum_{t’=1}^{10000} e^{\theta_{t’}^Te_c}}
$$
Which of these statements are correct? Check all that apply.
* $$\theta_t$$ and $$e_c$$ are both 10000 dimensional vectors.
*'' $$\theta_t$$ and $$e_c$$ are both 500 dimensional vectors. ''
* $$\theta_t$$ and $$e_c$$ are both trained with an optimization algorithm such as Adam or gradient descent.
* ''After training, we should expect $$\theta_t$$ to be very close to $$e_c$$ when $$t$$ and $$c$$ are the same word. ''
!! Question 9
Suppose you have a 10000 word vocabulary, and are learning 500-dimensional word embeddings. The [[GloVe model]] minimizes this objective:
$$\min \sum_{i=1}^{10,000} \sum_{j=1}^{10,000} f(X_{ij}) (\theta_i^T e_j + b_i + b_j’ - log X_{ij})^2$$
Which of these statements are correct? Check all that apply.
* ''$$\theta_i$$ and $$e_j$$ should be initialized randomly at the beginning of training. ''
* $$\theta_i$$ and $$e_j$$ should be initialized to 0 at the beginning of training.
* ''$$X_{ij}$$ is the number of times word j appears in the context of word i.
''
* ''The weighting function $$f(.)$$ must satisfy $$f(0) = 0$$''
!! Question 10
You have trained word embeddings using a text dataset of $$m_1$$ words. You are considering using these word embeddings for a language task, for which you have a separate labeled dataset of $$m_2$$ words. Keeping in mind that using word embeddings is a form of transfer learning, under which of these circumstances would you expect the word embeddings to be helpful?
* $$m_1 >> m_2$$ - ''Answer''
* $$m_1 << m_2$$
,,Tags: [[COURSE5: Sequence Models]] | [[03 June 2021]],,
! Sequence Models & Attention Mechanism
!! Question 1
Consider using this encoder-decoder model for machine translation.
<img src="https://i.ibb.co/rwt0dgn/course5-week3-q1.png" alt="course5-week3-q1" width="500">
This model is a “conditional language model” in the sense that the encoder portion (shown in green) is modeling the probability of the input sentence $$x$$.
* True
* ''False''
<<<
''Solution'': Because modelling the probability of output y conditioned on input x
<<<
!! Question 2
In [[Beam Search]], if you increase the beam width $$B$$, which of the following would you expect to be true? Check all that apply.
* ''Beam search will generally find better solutions (i.e. do a better job maximizing $$P(y \mid x)$$''
* Beam search will converge after fewer steps.
* ''Beam search will run more slowly.''
* ''Beam search will use up more memory.''
!! Question 3
In [[Machine Translation]], if we carry out beam search without using sentence normalization, the algorithm will tend to output overly short translations.
* ''True''
* False
<<<
''Solution'': The output is product of probabilities. Longer sentences will have higher words and thus probabilities will get multiplied, which will lower the probability for longer sentences
<<<
!! Question 4
Suppose you are building a speech recognition system, which uses an RNN model to map from audio clip $$x$$ to a text transcript $$y$$. Your algorithm uses beam search to try to find the value of $$y$$ that maximizes $$P(y \mid x)$$.
On a dev set example, given an input audio clip, your algorithm outputs the transcript $$\hat{y}$$ = “I’m building an A Eye system in Silly con Valley.”, whereas a human gives a much superior transcript $$y^*$$ = “I’m building an AI system in Silicon Valley.”
According to your model,
* $$P(\hat{y} \mid x) = 1.09*10^-7$$
* $$P(y^* \mid x) = 7.21*10^-8$$
Would you expect increasing the beam width B to help correct this example?
* No, because $$P(y^* \mid x) \leq P(\hat{y} \mid x)$$ indicates the error should be attributed to the search algorithm rather than to the RNN.
* Yes, because $$P(y^* \mid x) \leq P(\hat{y} \mid x)$$ indicates the error should be attributed to the RNN rather than to the search algorithm.
* ''No, because $$P(y^* \mid x) \leq P(\hat{y} \mid x)$$ indicates the error should be attributed to the RNN rather than to the search algorithm.''
* Yes, because $$P(y^* \mid x) \leq P(\hat{y} \mid x)$$ indicates the error should be attributed to the search algorithm rather than to the RNN.
<<<
''Solution'': The model gave lower probability to human translated sentence, making it clear that [[RNN]] is at fault
<<<
!! Question 5
Continuing the example from Q4, suppose you work on your algorithm for a few more weeks, and now find that for the vast majority of examples on which your algorithm makes a mistake, $$P(y^* \mid x) > P(\hat{y} \mid x)$$. This suggests you should focus your attention on improving the search algorithm.
* ''True''.
* False.
<<<
''Solution'': RNN now giving a higher probability to superior translation
<<<
!! Question 6
Consider the attention model for machine translation.
<img src="https://i.ibb.co/yphCDPy/course5-week3-q6a.png" alt="course5-week3-q6a" border="0">
Further, here is the formula for $$\alpha^{<t,t’>}$$
<img src="https://i.ibb.co/s2TgRzW/course5-week3-q6b.png" alt="course5-week3-q6b" border="0">
Which of the following statements about $$\alpha^{<t,t’>}$$ are true? Check all that apply.
* $$ \sum_{t} \alpha^{<t,t’>} = 1$$ (Note the summation is over $$t$$.)
* ''$$\sum_{t’} \alpha^{<t,t’>} = 1$$ (Note the summation is over $$t’$$.)''
* We expect $$\alpha^{<t,t’>}$$ to be generally larger for values of $$a^{<t’>}$$ that are highly relevant to the value the network should output for $$y^{<t>}$$. (Note the indices in the superscripts.)
* ''We expect $$\alpha^{<t,t’>}$$ to be generally larger for values of $$a^{<t>}$$ that are highly relevant to the value the network should output for $$y^{<t’>}$$. (Note the indices in the superscripts.) ''
!! Question 7
The network learns where to “pay attention” by learning the values $$e^{<t,t’>}$$, which are computed using a small neural network:
We can't replace $$s^{<t-1>}$$ with $$s^{<t>}$$ as an input to this neural network. This is because $$s^{<t>}$$ depends on $$\alpha^{<t,t’>}$$ which in turn depends on $$e^{<t,t’>}$$; so at the time we need to evaluate this network, we haven’t computed $$s^{<t>}$$ yet.
* False
* ''True''
!! Question 8
Compared to the encoder-decoder model shown in Question 1 of this quiz (which does not use an attention mechanism), we expect the attention model to have the greatest advantage when:
* The input sequence length $$T_x$$ is small.
* ''The input sequence length $$T_x$$ is large. ''
<<<
''Solution'': For larger sentences, attention model has advantages because it does not need to memorize large sentences as a whole and can use only part of sentence for context to make a prediction
<<<
!! Question 9
Under the CTC model, identical repeated characters not separated by the “blank” character (_) are collapsed. Under the CTC model, what does the following string collapse to?
`__c_oo_o_kk___b_ooooo__oo__kkk`
* ''cookbook''
* cokbok
* coookkboooooookkk
* cook book
<<<
''Solution'': The `oo` will be collapsed to `o` to form the work `cook`
<<<
!! Question 10
In trigger word detection, $$x^{<t>}$$ is:
* The $$t$$-th input word, represented as either a one-hot vector or a [[Word Embeddings]]
* Whether someone has just finished saying the trigger word at time $$t$$.
* ''Features of the audio (such as spectrogram features) at time $$t$$.
''
* Whether the trigger word is being said at time $$t$$.
,,Tags: [[COURSE5: Sequence Models]] | [[03 June 2021]],,
!! Question 1
If searching among a large number of [[Hyperparameter]], you should try values in a grid rather than random values, so that you can carry out the search more systematically and not rely on chance. True or False?
* ''False''
* True
''Solution''
<<<
Grid search should be done only when number of hyperparameters to tune are small. For NN, the hyperparameters must be random searched so that you try out more number of points for the same number of combinations as grid search
<<<
!! Question 2
Every hyperparameter, if set poorly, can have a huge negative impact on training, and so all hyperparameters are about equally important to tune well. True or False?
* True
* ''False''
''Solution''
<<<
[[Learning Rate]] is the most important parameter to tune, followed by, number of hidden units, minibatch size followed by learning rate decay and [[Adam]] algorithm parameters
<<<
!! Question 3
During hyperparameter search, whether you try to babysit one model (“''Panda” strategy'') or train a lot of models in parallel (“''Caviar''”) is largely determined by:
* The number of hyperparameters you have to tune
* Whether you use batch or mini-batch optimization
* ''The amount of computational power you can access''
* The presence of local minima (and saddle points) in your neural network
!! Question 4
If you think β (hyperparameter for momentum) is between 0.9 and 0.99, which of the following is the recommended way to sample a value for beta?
# ''r = np.random.rand() beta = 1-10**(- r - 1) ''
# r = np.random.rand() beta = r*0.9 + 0.09
# r = np.random.rand() beta = r*0.09 + 0.9
# r = np.random.rand() beta = 1-10**(- r + 1)
''Answer: 1''- Because 2 and 3 would linearly sample and 4 can end up generating negative values
!! Question 5
Finding good [[Hyperparameter]] values is very time-consuming. So typically you should do it once at the start of the project, and try to find very good hyperparameters so that you don’t ever have to revisit tuning them again. True or False?
* False
* True
!! Question 6
In [[Batch Normalization]] as presented in the videos, if you apply it on the $$l$$th layer of your neural network, what are you normalizing?
# $$b^{[l]}$$
# $$z^{[l]}$$
# $$a^{[l]}$$
# $$W^{[l]}$$
''Answer: 2'' - because batch norm gets applied between $$z$$ and activation $$a$$
!! Question 7
In the normalization formula $$z_{norm}^{(i)} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \varepsilon}}$$, why do we use epsilon?
* ''To avoid division by zero''
* To have a more accurate normalization
* To speed up convergence
* In case μ is too small
!! Question 8
Which of the following statements about \gammaγ and \betaβ in Batch Norm are true?
* There is one global value of $$\gamma \in \Re$$ and one global value of $$\beta \in \Re$$ for each layer, and applies to all the hidden units in that layer.
* ''They can be learned using [[Adam]], [[Gradient Descent with Momentum]], or [[RMSProp]], not just with [[Gradient Descent]].
* The optimal values are $$\gamma = \sqrt{\sigma^2 + \varepsilon}$$ and $$\beta = \mu$$.''
* ''They set the mean and variance of the linear variable $$z^[l]$$ of a given layer''
* β and γ are hyperparameters of the algorithm, which we tune via random sampling.
!! Question 9
After training a [[Neural Network]] with [[Batch Normalization]], at test time, to evaluate the neural network on a new example you should:
* Use the most recent [[Mini-batch]]’s value of $$\mu$$ and $$\sigma^2$$ to perform the needed normalizations.
* Skip the step where you normalize using $$\mu$$ and $$\sigma^2$$ since a single test example cannot be normalized.
* If you implemented Batch Norm on mini-batches of (say) 256 examples, then to evaluate on one test example, duplicate that example 256 times so that you’re working with a mini-batch the same size as during training.
* ''Perform the needed normalizations, use $$\mu$$ and $$\sigma^2$$
estimated using an exponentially weighted average across mini-batches seen during training. ''
!! Question 10
Which of these statements about deep learning programming frameworks are true? (Check all that apply)
* ''Even if a project is currently open source, good governance of the project helps ensure that the it remains open even in the long term, rather than become closed or modified to benefit only one company. ''
* ''A programming framework allows you to code up deep learning algorithms with typically fewer lines of code than a lower-level language such as Python.
''
* Deep learning programming frameworks require cloud-based machines to run.
,,Tags:[[COURSE2: Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization]] | [[08 May 2021]],,
! Shallow Neural Networks
!! Question 1
Which of the following are true? (Check all that apply.)
* ''$$X$$ is a matrix in which each column is one training example''.
* ''$$a^{[2](12)}$$ denotes the activation vector of the $$2^{nd}$$ layer for the $$12^{th}$$ training example.''
* $$X$$ is a matrix in which each row is one training example.
* $$a^{[2]}_4$$ is the activation output of the $$2^{nd}$$ layer for the $$4^{th}$$ training example
* ''$$ a^{[2]}$$ denotes the activation vector of the $$2^{nd}$$layer.''
* $$a^{[2](12)}$$ denotes activation vector of the $$12^{th}$$ layer on the $$2^{nd} $$training example.
* ''$$a^{[2]}_4$$ is the activation output by the $$4^{th}$$ neuron of the $$2^{nd}$$ layer''
!! Question 2
The $$tanh$$ activation usually works better than sigmoid activation function for hidden units because the mean of its output is closer to zero, and so it centers the data better for the next layer. True/False?
* ''True''
* False
''Question changed''
The tanh activation is not always better than sigmoid activation function for hidden units because the mean of its output is closer to zero, and so it centers the data, making learning complex for the next layer. True/False?
* True
* ''False''
<<<
''Solution'': Yes. As seen in lecture the output of the tanh is between -1 and 1, it thus centers the data which makes the learning simpler for the next layer.
<<<
!! Question 3
Which of these is a correct vectorized implementation of forward propagation for layer $$l$$, where $$1 \leq l \leq L$$ ?
# $$Z^{[l]} = W^{[l-1]} A^{[l]}+ b^{[l-1]}$$ ; $$A^{[l]} = g^{[l]}(Z^{[l]})$$
# $$Z^{[l]} = W^{[l]} A^{[l]}+ b^{[l]}$$ ; $$A^{[l+1]} = g^{[l+1]}(Z^{[l]})$$
# $$Z^{[l]} = W^{[l]} A^{[l]}+ b^{[l]}$$ ; $$A^{[l+1]} = g^{[l]}(Z^{[l]})$$
# $$Z^{[l]} = W^{[l]} A^{[l-1]}+ b^{[l]}$$ ; $$A^{[l]} = g^{[l]}(Z^{[l]})$$
''Answer : 4''
!! Question 4
You are building a binary classifier for recognizing cucumbers (y=1) vs. watermelons (y=0). Which one of these activation functions would you recommend using for the output layer?
* ReLU
* Leaky ReLU
* ''Sigmoid''
* tanh
!! Question 5
Consider the following code:
```python
A = np.random.randn(4,3)
B = np.sum(A, axis = 1, keepdims = True)
```
What will be `B.shape` ? (If you’re not sure, feel free to run this in python to find out).
* (, 3)
* (1, 3)
* ''(4, 1)''
* (4, )
!! Question 6
Suppose you have built a neural network. You decide to initialize the weights and biases to be zero. Which of the following statements is true?
* ''Each neuron in the first hidden layer will perform the same computation. So even after multiple iterations of gradient descent each neuron in the layer will be computing the same thing as other neurons.''
* Each neuron in the first hidden layer will perform the same computation in the first iteration. But after one iteration of gradient descent they will learn to compute different things because we have “broken symmetry”.
* Each neuron in the first hidden layer will compute the same thing, but neurons in different layers will compute different things, thus we have accomplished “symmetry breaking” as described in lecture.
* The first hidden layer’s neurons will perform different computations from each other even in the first iteration; their parameters will thus keep evolving in their own way.
!! Question 7
Logistic regression’s weights `w` should be initialized randomly rather than to all zeros, because if you initialize to all zeros, then logistic regression will fail to learn a useful decision boundary because it will fail to “break symmetry”, True/False?
* True
* ''False''
!! Question 8
You have built a network using the `tanh` activation for all the hidden units. You initialize the weights to relative large values, using np.random.randn(..,..)*1000. What will happen?
* ''This will cause the inputs of the tanh to also be very large, thus causing gradients to be close to zero. The optimization algorithm will thus become slow''.
* It doesn’t matter. So long as you initialize the weights randomly gradient descent is not affected by whether the weights are large or small.
* This will cause the inputs of the tanh to also be very large, causing the units to be “highly activated” and thus speed up learning compared to if the weights had to start from small values.
* This will cause the inputs of the tanh to also be very large, thus causing gradients to also become large. You therefore have to set \alphaα to be very small to prevent divergence; this will slow down learning.
!! Question 9
Consider the following 1 hidden layer neural network:
<img src="https://i.ibb.co/x83ZQDG/course1-week3-q9.png" alt="course1-week3-q9" border="0">
Which of the following statements are True? (Check all that apply).
* $$ W^{[1]}$$ will have shape (2, 4)
* ''$$ b^{[1]}$$ will have shape (4, 1) ''
* ''$$ W^{[1]}$$ will have shape (4, 2)''
* $$ b^{[1]}$$ will have shape (2, 1)
* ''$$ W^{[2]}$$ will have shape (1, 4)''
* $$ b^{[2]}$$ will have shape (4, 1)
* $$ W^{[2]}$$ will have shape (4, 1)
* ''$$ b^{[2]}$$ will have shape (1, 1)''
!! Question 10
In the same network as the previous question, what are the dimensions of $$Z^{[1]}$$ and $$A^{[1]}$$ ?
* ''$$Z^{[1]}$$ and $$A^{[1]}$$ are (4,2) ''
* $$Z^{[1]}$$ and $$A^{[1]}$$ are (1,4)
* $$Z^{[1]}$$ and $$A^{[1]}$$ are (4,1)
* $$Z^{[1]}$$ and $$A^{[1]}$$ are (4,m)
,,Tags: [[COURSE1: Neural Networks & Deep Learning]],,
!! From the notebook:
* Wasserstein GAN (Arjovsky, Chintala, and Bottou, 2017): https://arxiv.org/abs/1701.07875
* Improved Training of Wasserstein GANs (Gulrajani et al., 2017): https://arxiv.org/abs/1704.00028
* MNIST Database: http://yann.lecun.com/exdb/mnist/
!! Optional
* ProteinGAN - The goal of this notebook is to demonstrate that core GAN ideas can be applied outside of the image domain. In this notebook, you will be able to play around with a pre-trained ProteinGAN model to see how it can be used in bioinformatics to generate functional molecules.
** Notebook link: https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/ProteinGAN.ipynb
** ProteinGAN was developed by Biomatters Designs and Zelezniak lab at Chalmers University of Technology.
* WGAN Walkthrough - Want another explanation of WGAN? This article provides a great walkthrough of how WGAN addresses the difficulties of training a traditional GAN with a focus on the loss functions.
**From GAN to WGAN (Weng, 2017): https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html
[[Course 1: Build Basic GANs]]
!! From the videos:
* Generative Adversarial Networks (Goodfellow et al., 2014): https://arxiv.org/abs/1406.2661
* Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (Radford, Metz, and Chintala, 2016): https://arxiv.org/abs/1511.06434
* Coupled Generative Adversarial Networks (Liu and Tuzel, 2016): https://arxiv.org/abs/1606.07536
* Progressive Growing of GANs for Improved Quality, Stability, and Variation (Karras, Aila, Laine, and Lehtinen, 2018): https://arxiv.org/abs/1710.10196
* A Style-Based Generator Architecture for Generative Adversarial Networks (Karras, Laine, and Aila, 2019): https://arxiv.org/abs/1812.04948
* The Unusual Effectiveness of Averaging in GAN Training (Yazici et al., 2019): https://arxiv.org/abs/1806.04498v2
*Progressive Growing of GANs for Improved Quality, Stability, and Variation (Karras, Aila, Laine, and Lehtinen, 2018): https://arxiv.org/abs/1710.10196
* StyleGAN - Official TensorFlow Implementation (Karras et al., 2019): https://github.com/NVlabs/stylegan
* StyleGAN Faces Training (Branwen, 2019): https://www.gwern.net/images/gan/2019-03-16-stylegan-facestraining.mp4
* Facebook AI Proposes Group Normalization Alternative to Batch Normalization (Peng, 2018): https://medium.com/syncedreview/facebook-ai-proposes-group-normalization-alternative-to-batch-normalization-fb0699bffae7
!! Optional
* Finetuning Notebook: FreezeD - Notebook: https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C2W3_FreezeD_(Optional).ipynb
**Please note that this is an optional notebook meant to introduce more advanced concepts. If you’re up for a challenge, take a look and don’t worry if you can’t follow everything. There is no code to implement—only some cool code for you to learn and run!
**In this notebook, you'll learn about and implement the fine-tuning approach proposed in Freeze the Discriminator: a Simple Baseline for Fine-Tuning GANs (Mo et al. 2020), which introduces the concept of freezing the upper layers of the discriminator in fine-tuning. Specifically, you'll fine-tune a pretrained StyleGAN to generate anime faces from human faces.
**Due to the size and dependence on recent PyTorch features (e.g. Automatic Mixed Precision (AMP)), this is provided as a Colab notebook.
* The StyleGAN Paper - Amazed by StyleGAN's capabilities? Take a look at the original paper! Note that it may take a few extra moments to load because of the high-resolution images.
** A Style-Based Generator Architecture for Generative Adversarial Networks (Karras, Laine, and Aila, 2019): https://arxiv.org/abs/1812.04948
* StyleGAN Walkthrough and Beyond - Want another explanation of StyleGAN? This article provides a great walkthrough of StyleGAN and even discusses StyleGAN's successor: StyleGAN2!
**GAN — StyleGAN & StyleGAN2 (Hui, 2020): https://medium.com/@jonathan_hui/gan-stylegan-stylegan2-479bdf256299
* Components of BigGAN
** In this notebook, you'll learn about and implement the components of BigGAN, the first large-scale GAN architecture proposed in Large Scale GAN Training for High Fidelity Natural Image Synthesis (Brock et al. 2019). BigGAN performs a conditional generation task, so unlike StyleGAN, it conditions on a certain class to generate results. BigGAN is based mainly on empirical results and shows extremely good results when trained on ImageNet and its 1000 classes.
[[Course 2: Build Better GANs]]
!! From the videos:
* Image-to-Image Translation with Conditional Adversarial Networks (Isola, Zhu, Zhou, and Efros, 2018): https://arxiv.org/abs/1611.07004
* Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (Zhu, Park, Isola, and Efros, 2020): https://arxiv.org/abs/1703.10593
* PyTorch implementation of CycleGAN (2017): https://github.com/togheppi/CycleGAN
* Distribution Matching Losses Can Hallucinate Features in Medical Image Translation (Cohen, Luck, and Honari, 2018): https://arxiv.org/abs/1805.08841
* Data augmentation using generative adversarial networks (CycleGAN) to improve generalizability in CT segmentation tasks (Sandfort, Yan, Pickhardt, and Summers, 2019): https://www.nature.com/articles/s41598-019-52737-x.pdf
* Unsupervised Image-to-Image Translation (NVIDIA, 2018): https://github.com/mingyuliutw/UNIT
* Multimodal Unsupervised Image-to-Image Translation (Huang et al., 2018): https://github.com/NVlabs/MUNIT
!! From the notebooks:
* PyTorch-CycleGAN (2017): https://github.com/aitorzip/PyTorch-CycleGAN/blob/master/datasets.py
* Horse and Zebra Images Dataset: https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/horse2zebra.zip
!! OPtional
* MUNIT -
** https://colab.research.google.com/github/https-deeplearning-ai/GANs-Public/blob/master/C3W3_MUNIT_(Optional).ipynb
** In this notebook, you will learn about and implement MUNIT, a method for unsupervised image-to-image translation, as proposed in Multimodal Unsupervised Image-to-Image Translation (Huang et al. 2018).
* CycleGAN for Medical Imaging
** Intrigued by the application of CycleGANs in the medical field? See how they can be used to help augment data for medical imaging!
**Data augmentation using generative adversarial networks (CycleGAN) to improve generalizability in CT segmentation tasks (Sandfort, Yan, Pickhardt, and Summers, 2019): https://www.nature.com/articles/s41598-019-52737-x.pdf
[[Course 3: Apply GANs]]
! Deep L-layer Neural Network
<img src="https://i.ibb.co/5rFmQmK/Neural-Networks.png" alt="Neural-Networks" border="0">
!! Notation
<img src="https://lh3.googleusercontent.com/4KST97VRcPfEyrpT7HBpgfUgmlSkMu2kX_PwMHwo1eRg9y0FCMpDicRzmNSdgwICC2RiXYVsKYQ3A4Kmai7tJVolK0MM9Z7kfgrEScB6ZQECUCOTPo6Gvlzaf57tN_b82xuxhBOOmqklztXRU0ALkLOmMAQnzrYG5zlBYSlM--5S_Iwy74gwFdvnTkjCokvxjScYOF20d4JFZBEScjoT_V_BcYYUHlk4eScncm2LQw5MixaQghwc6ovRc7Z5PZrI-5i2C4rhSkPmn_w6IMAEKpEulM6J7tahji0IzKIcIgA-hj5RQAQQ30vF1RXTjbL9aE5-vdB9AJiCLDk5oOW6H7a6qbfxtSRqX1nLVT9NVMmSMXsVDiD7eESlI4dONgI0iuh2CTlP_eq0kEG9Fd8LooHQ7egbHFPT8MwKP0l1nHpKXqKqyH2zdXC9MwxPcZMbdH4WdmWNVmcuKgzGsHu-SxMIGtNwWSNV51r8cbvOQF6ZUmSd0BU6T6HrC6yT6eqHgtbkP_vvQlqY48UYxEuw-TA9sR4UowI15S5t5Wc_BXBQ58YvHwUuWwmQRIz0_bmZjgotsl8k348F2aFWA7CYEz69o1_bd-GYaEI_m6vR5UqAOl7xfPHN0avox88amYoRRzNxIRTkEXOX43IbhdQuE-0ZnLcdVgHCAioqJyjM0d1e8g21v7psyHl1A1nqrZLRS9lh5kyl_FgNF6dL-j-M4sto-Q=w1666-h937-no?authuser=0" width="700">
* $$L$$ = number of layers in the network
* $$n^{[l]}$$ - number of units in the layer $$l$$
* $$a^{[l]}$$ - activation in the layer $$l$$
* $$w^{[l]}$$ - weights in the layer $$l$$ for $$z^{[l]}$$
<<<
$$L = 4$$ - Four layers in the network
$$x = a^{[0]}$$
$$\hat{y} = a^{[L]} = a^{[4]}$$
$$n^{[1]} = 5, n^{[2]} = 5, n^{[3]} = 3, n^{[4]} = 1$$
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[14 June 2021]],,
!! Intuition
* Many effective architectures of today are because of [[Transformer Network]]s
* Complex architecture
* Model Complexity ($$\uparrow$$): RNN $$\rightarrow$$ GRU $$\rightarrow$$ LSTM
* RNNs, GRU, LSTMs use one word or token at a time, so that each unit became a bottleneck to compute the next unit. ''Transformers allow computation of all units in parallel''. Can ingest the entire sentence in one shot instead of processing it one word at a time
* The major innovation for the transformer network is combining the use of [[Attention Model]] based representations and a [[CNN]] style of processing.
:''TRANSFORMERS = ATTENTION + CNN''
* [[Self-Attention]] - 5 words - 5 representations computed
* [[Multi-Head Attention]] - For loop over [[Self-Attention]] process so you don't end up with multiple version of these representations generated in parallel
,,Tags: [[COURSE5: Sequence Models]] | [[21 August 2021]],,
!! Face Verification vs Face Recognition
* [[Face Verification]] - Verify that the input image is of the claimed person. ''1:1 Problem''
* [[Face Recognition]] - Much harder problem. For a database of k persons, output ID of the person else output not-recognized. ''1:K problem''
Verification system with 99% accuracy is a very good system. But for recognition problem, if k =100, the chance of making a mistake increases by 100x. The system has to be 99.9% or higher in accuracy for it to be implemented for a database of 100 people.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[17 August 2021]]
,,
!Forward Propagation in Deep Network
<img src="https://lh3.googleusercontent.com/4KST97VRcPfEyrpT7HBpgfUgmlSkMu2kX_PwMHwo1eRg9y0FCMpDicRzmNSdgwICC2RiXYVsKYQ3A4Kmai7tJVolK0MM9Z7kfgrEScB6ZQECUCOTPo6Gvlzaf57tN_b82xuxhBOOmqklztXRU0ALkLOmMAQnzrYG5zlBYSlM--5S_Iwy74gwFdvnTkjCokvxjScYOF20d4JFZBEScjoT_V_BcYYUHlk4eScncm2LQw5MixaQghwc6ovRc7Z5PZrI-5i2C4rhSkPmn_w6IMAEKpEulM6J7tahji0IzKIcIgA-hj5RQAQQ30vF1RXTjbL9aE5-vdB9AJiCLDk5oOW6H7a6qbfxtSRqX1nLVT9NVMmSMXsVDiD7eESlI4dONgI0iuh2CTlP_eq0kEG9Fd8LooHQ7egbHFPT8MwKP0l1nHpKXqKqyH2zdXC9MwxPcZMbdH4WdmWNVmcuKgzGsHu-SxMIGtNwWSNV51r8cbvOQF6ZUmSd0BU6T6HrC6yT6eqHgtbkP_vvQlqY48UYxEuw-TA9sR4UowI15S5t5Wc_BXBQ58YvHwUuWwmQRIz0_bmZjgotsl8k348F2aFWA7CYEz69o1_bd-GYaEI_m6vR5UqAOl7xfPHN0avox88amYoRRzNxIRTkEXOX43IbhdQuE-0ZnLcdVgHCAioqJyjM0d1e8g21v7psyHl1A1nqrZLRS9lh5kyl_FgNF6dL-j-M4sto-Q=w1666-h937-no?authuser=0" width="700">
!! Equations
''Layer 1''
<<<
$$z^{[1]} = w^{[1]}a^{[0]} + b^{[1]}$$
$$a^{[1]} = g^{[1]}(z^{[1]})$$
<<<
''Layer 2''
<<<
$$z^{[2]} = w^{[2]}a^{[1]} + b^{[2]}$$
$$a^{[2]} = g^{[2]}(z^{[2]})$$
<<<
:''...''
''Layer 4''
<<<
$$z^{[4]} = w^{[4]}a^{[3]} + b^{[4]}$$
$$a^{[4]} = g^{[4]}(z^{[4]})$$
<<<
!! Vectorized and More General Equations
<<<
$$Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]}$$
$$A^{[l]} = g^{[l]}(Z^{[l]})$$
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]],,
For building [[Face Recognition]], the challenges need to be solved in [[One-Shot Learning]] problem. For most face-recognition applications you need to be able to recognize a person with just one single image/example of person's face again and again
!! What if new person joins the team. Do we Retrain?
To make this work, learn a [[Similarity Function]]
$$d(img1, img2)$$ = degree of difference between two persons
* if $$d(img1, img2) \leq \tau \rightarrow $$ same person
* if $$d(img1, img2) > \tau \rightarrow $$ diff persons
If there are 4 people in the database and the value of $$d > \tau$$ for all 4 persons, then output NOTA. This works fine even if persons are added to the database
,,Tags : [[COURSE4: Convolutional Neural Networks]] | [[17 August 2021]],,
* Core idea of a [[Transformer Network]]
* use like [[CNN]]s
* For every word - generate attention based representation
** $$A(q,K,V)$$ = attention based representation for each word
** q = query
** k = key
** V = value
*$$A^{\langle 1 \rangle}, ..., A^{\langle 5 \rangle}$$ for inputs $$x^{\langle 1 \rangle}, ..., x^{\langle 5 \rangle}$$
$$
\begin{matrix}
RNN \ Attention & Transformers \ Attention \\
-------------- & --------------\\
\alpha^{\langle t, t' \rangle} = \frac{\exp (e^{\langle t, t' \rangle})}{\sum_{t'=1}^{T_x} \exp (e^{\langle t, t' \rangle})} &
A(q,K,V) = \sum_i\frac{\exp (q.k^{\langle i \rangle})}{\sum_j \exp (q.k^{\langle j \rangle})}v^{\langle i \rangle} \\
-------------- & --------------\\
\end{matrix}
$$
Given an input sentence
$$
\begin{matrix}
Jan & visite & l'Afrique & en & Septembre \\
x^{\langle 1 \rangle} & x^{\langle 2 \rangle} & x^{\langle 3 \rangle} & x^{\langle 4 \rangle} & x^{\langle 5 \rangle}
\end{matrix}
$$
Computing the attention value for $$x^{\langle 3 \rangle} \leftarrow $$ word embedding for input 3 (//l'Afrique//), we can compute
* $$q^{\langle 3 \rangle} = W^q x^{\langle 3 \rangle}$$
* $$k^{\langle 3 \rangle} = W^K x^{\langle 3 \rangle}$$
* $$v^{\langle 3 \rangle} = W^V x^{\langle 3 \rangle}$$
where $$W^q, W^K, W^V$$ are the parameters for learning algorithm
!!! Intuition
$$q^{\langle 3 \rangle}$$ - It is a question that you get to ask about //l'Afrique// like, //What's happening there?//
* Compute inner product $$q^{\langle 3 \rangle} . k^{\langle 1 \rangle}$$ as an answer to this question. Evaluates how good //Jane// is an answer to the questions of //What's happening there?//
* Similarly, $$q^{\langle 3 \rangle} . k^{\langle 2 \rangle}$$, evaluates how good //visite// is an answer to the question //What's happening there?//
* ... an so on for the rest of the words
The goal of this operation is to pull up the most information needed to compute the most useful representation for $$A^{\langle 3 \rangle}$$
If $$k^{\langle 1 \rangle}$$ is a person and $$k^{\langle 2 \rangle}$$ is an action, then $$q^{\langle 3 \rangle}.k^{\langle 2 \rangle}$$ gives the best answer to //What's happening in Africa?// - Tells the model it refers to definition of visit.
$$Softmax(q^{\langle 3 \rangle}.k^{\langle 1 \rangle}, ..., q^{\langle 3 \rangle}.k^{\langle 5 \rangle})$$
<img src='https://lh3.googleusercontent.com/3YQq6Zsgjf606-xQRHFTWPIixET7Wu0Q_74Qnx2wKsSFXH6JdfTtme6WyhnMreSrCnXEBOcrgK7gnraOL5Z3EHW9JUKAYrecsH-W7ZCpWfwAXKYeYezYZiY98h0zZIlH6mbWZ0AbOA2saBb7N7uyYuJXkKZY9WeSIyP6gGSre4XtFS8qXwkJfEenLxF9TuB47OAbDT6C0EQO6OtesL5xH1Rfuu87P5fpl8lgRXJ76m99FzFIzdg-k8zGPfeUFyfdYDOI3EN3IhjRWxSdDae4C6cQusQf_bHfX08knsggSmK6CMY-6LUYWZpBxCcQP8CywXrJqMw4UiL4nk-tjd6pCx3QE1udNOBax6qm-trWgfZDyfBKBWh1TdsgkhgqDraB98mkVsEsGowLy5X07xr9iHnan5bbg636J1QjNBAQhQPZcYDS2fjKT64NADYjCRnH4ushtVPdLUKidZpGb1xcz9wPBxt60gdjZ0M64Vl8DmI972_mq91_RYQTXixNh_6bxOFJtFVMCEGYEZltTwkylTSL2alMRNr-LA2l6lJriSEFOevC0Ta1Qnnmv35wecNjoAPb8dYzwpaElaA1J0tqqQofaBOY4tUsiXJ5KVRAV4kfx_jSSiNgp2Qt4pzDa2PyRWizxZmWs6esHmNRHtBKxfyB_h9WyvVWlB29HjFo8g00nCrOJAd8jP_eRfCptxTGIvJMWjcu4el9Ke_Q7GrcVSvhjQ=w1350-h969-no?authuser=0' width=500>
The advantage of using this representation is that the word //l'Afrique//
,,Tags: [[COURSE5: Sequence Models]] | [[21 August 2021]],, is not just some fixed embedding but instead, it lets the self-attention mechanism realize the l'Afrique is the destination of a visite, and thus compute richer and more useful representation for this word.
Similarly equally richer representations can be earned for $$x^{\langle 1 \rangle}, x^{\langle 2 \rangle}, x^{\langle 4 \rangle}$$ and $$x^{\langle 5 \rangle}$$
$$
ATTENTION(Q,K,V) = softmax \bigg( \frac{QK^{\mathsf{T}}}{\sqrt{d_k}} \bigg) V
$$
where
* $$\sqrt{d_k}$$ - scaled dot product so that it does not explode. Another name for this type of attention is [[Scaled Dot Product Attention]] and this is the version in original Transformer architecture paper - //[[Attention is all you need|https://arxiv.org/abs/1706.03762]]//
To summarize, associated with each of the words you end up with a query, key and value
* query - let's you ask questions about the word
* key - looks at all other words and by the similarity to the query, helps you figure out which word gives the most relevant answer to the question
* Value - allows the representation to plug in how //visite// should be represented in $$A^{\langle 3 \rangle}$$
!Getting matrix dimensions right
<img src="https://lh3.googleusercontent.com/4KST97VRcPfEyrpT7HBpgfUgmlSkMu2kX_PwMHwo1eRg9y0FCMpDicRzmNSdgwICC2RiXYVsKYQ3A4Kmai7tJVolK0MM9Z7kfgrEScB6ZQECUCOTPo6Gvlzaf57tN_b82xuxhBOOmqklztXRU0ALkLOmMAQnzrYG5zlBYSlM--5S_Iwy74gwFdvnTkjCokvxjScYOF20d4JFZBEScjoT_V_BcYYUHlk4eScncm2LQw5MixaQghwc6ovRc7Z5PZrI-5i2C4rhSkPmn_w6IMAEKpEulM6J7tahji0IzKIcIgA-hj5RQAQQ30vF1RXTjbL9aE5-vdB9AJiCLDk5oOW6H7a6qbfxtSRqX1nLVT9NVMmSMXsVDiD7eESlI4dONgI0iuh2CTlP_eq0kEG9Fd8LooHQ7egbHFPT8MwKP0l1nHpKXqKqyH2zdXC9MwxPcZMbdH4WdmWNVmcuKgzGsHu-SxMIGtNwWSNV51r8cbvOQF6ZUmSd0BU6T6HrC6yT6eqHgtbkP_vvQlqY48UYxEuw-TA9sR4UowI15S5t5Wc_BXBQ58YvHwUuWwmQRIz0_bmZjgotsl8k348F2aFWA7CYEz69o1_bd-GYaEI_m6vR5UqAOl7xfPHN0avox88amYoRRzNxIRTkEXOX43IbhdQuE-0ZnLcdVgHCAioqJyjM0d1e8g21v7psyHl1A1nqrZLRS9lh5kyl_FgNF6dL-j-M4sto-Q=w1666-h937-no?authuser=0" width="700">
''Units in each Layer''
* $$n^{[0]} = n_x = 3$$
* $$n^{[1]} = n^{[2]} = 5; n^{[3]} = 3, n^{[4]} = 1$$
''Shapes''
<<<
$$Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]} \\ = (5,3) . (3,1) + (5,1) \\ = (5,1) + (5,1) \\ = (5,1)$$
$$A^{[1]} = g^{[1]}(Z^{[1]}) \\ = g(5,1) \\= (5,1)$$
<<<
!! General form of shapes with m training examples
<<<
$$W^{[l]} \rightarrow (n^{[l]}, n^{[l-1]})$$
$$b^{[l]} \rightarrow (n^{[l]}, 1)$$
$$Z^{[l]} = A^{[l]} = dZ^{[l]} = dA^{[l]} \rightarrow (n^{[l]}, m)$$
<<<
,,Tags:[[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]],,
!! [[Multi-Head Attention]] Mechanism
Big `for` loop over [[Self-Attention]] mechanism
<img src='https://lh3.googleusercontent.com/3YQq6Zsgjf606-xQRHFTWPIixET7Wu0Q_74Qnx2wKsSFXH6JdfTtme6WyhnMreSrCnXEBOcrgK7gnraOL5Z3EHW9JUKAYrecsH-W7ZCpWfwAXKYeYezYZiY98h0zZIlH6mbWZ0AbOA2saBb7N7uyYuJXkKZY9WeSIyP6gGSre4XtFS8qXwkJfEenLxF9TuB47OAbDT6C0EQO6OtesL5xH1Rfuu87P5fpl8lgRXJ76m99FzFIzdg-k8zGPfeUFyfdYDOI3EN3IhjRWxSdDae4C6cQusQf_bHfX08knsggSmK6CMY-6LUYWZpBxCcQP8CywXrJqMw4UiL4nk-tjd6pCx3QE1udNOBax6qm-trWgfZDyfBKBWh1TdsgkhgqDraB98mkVsEsGowLy5X07xr9iHnan5bbg636J1QjNBAQhQPZcYDS2fjKT64NADYjCRnH4ushtVPdLUKidZpGb1xcz9wPBxt60gdjZ0M64Vl8DmI972_mq91_RYQTXixNh_6bxOFJtFVMCEGYEZltTwkylTSL2alMRNr-LA2l6lJriSEFOevC0Ta1Qnnmv35wecNjoAPb8dYzwpaElaA1J0tqqQofaBOY4tUsiXJ5KVRAV4kfx_jSSiNgp2Qt4pzDa2PyRWizxZmWs6esHmNRHtBKxfyB_h9WyvVWlB29HjFo8g00nCrOJAd8jP_eRfCptxTGIvJMWjcu4el9Ke_Q7GrcVSvhjQ=w1350-h969-no?authuser=0' width=500>
Each block computes $$W_i^Qq^{\langle j \rangle}, W_i^Kk^{\langle j \rangle}, W_i^Vv^{\langle j \rangle}$$
* A new set of quantities (query, key and value) vectors for the words
* $$i$$ - refers to head number in multi-head attention
* $$j$$ - input unit number
* $$W_i^Q, W_i^K, W_i^V$$ - can be thought of as being learned to help ask and answer the questions like, //What's happening?//, //to Whom?// and //Why//. intuitively speaking
In multi-head attention, usually 8 heads are used to compute multi-headed attention. Concatenation of these 8 values is used to compute multi-headed attention
$$
Multihead (Q,K,V) = concat(head_1, head_2,..., head_8) W_o \\ \ \\
head_i = Attention (W_i^Qq, W_i^Kk, W_i^Vv)
$$
,,Tags: [[COURSE5: Sequence Models]] | [[21 August 2021]],,
The end output layer of [[Convolutional Neural Network]], instead of predicting with softmax generates an encoding for the example person $$x^{(1)}$$ called $$f(x^{(1)})$$. Similarly, for image $$x^{(2)}$$, passed through the same network learns the encoding $$f(x^{(2)})$$ and so on for all persons in the database.
The [[Similarity Function]] between persons $$x^{(1)}$$ and $$x^{(1)}$$ can be computed as the norm of the difference between the encodings of two images.
$$
d(x^{(1)}, x^{(2)}) = ||f(x^{(1)}) - f(x^{(2)})||^2_2
$$
Idea of running the two identical [[CNN]] on two different inputs and then comparing them is sometimes called the [[Siamese Network]] Architecture - from the developers of the system called [[DeepFace]]
!! How do you train a siamese network?
Parameters of [[Neural Network]] define an encoding $$f(x^{(1)})$$. Given any input image x^{(i)}, the NN outputs 128 dimensional encoding.
Learn then parameters such that,
<<<
IF $$x^{(i)}, x^{(j)}$$ are the same person then
:$$||f(x^{(i)}) - f(x^{(j)})||^2_2$$ should be small
ELSE IF the images are of different persons then
:$$||f(x^{(i)}) - f(x^{(j)})||^2_2$$ difference should be large
<<<
So as you vary the parameters in all of those layers in NN, you end up different encodings, so using [[Backpropagation]] that varies the parameters in such a way that these conditions above are satisfied
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[17 August 2021]],,
!! [[Controllable Generation]]
* To control the outputs generated by [[GAN]]s after training
* Specify features from the example generations post training
Controlling the features post training can be achieved by changing the [[Noise Vector]] $$Z$$ that is fed to generator.
Difference between [[Conditional Generation]] and [[Controllable Generation]]
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>Controllable</th><th>Conditional</th></tr></thead><tbody>
<tr><td>Examples with features you want</td><td>Examples from the classes you want</td></tr>
<tr><td>Training dataset does not need to be labelled</td><td>Requires labelled training data</td></tr>
<tr><td>generates example by manipulating the Z input vector</td><td>generates example by appending class vector to the input</td></tr>
</tbody></table>
!! [[Transformer Network]]
<img src='https://lilianweng.github.io/lil-log/assets/images/transformer.png' width=800>
* ''Step 1:'' Generate the [[Word Embeddings]] for the input sentence for each word
* ''Step 2:'' Feed the embeddings into an encoder block into [[Multi-Head Attention]] block. The values $$Q,K,V$$ are fed which are computed from the embeddings and weight matrices $$W$$
* ''Step 3:'' Output of step 2 passed to feed forward NN - which helps identifying interesting features in the sentence
* ''Step 4:'' The encoder block is repeated $$N$$ times (typically 6). The output of the encoder after repeating N times is fed to the decoder block. The decoder block's job is to output the English translation. At every step of the decoder block, already generated words are input to the translation. At the start we only know that the sentence will start at `<SOS>` token
* ''Step 5:'' The output of the first [[Multi-Head Attention]] block in the decoder feeds into another multi-head attention block which inputs $$Q$$ matrix, while $$K $$and $$V$$ are supplied from the output of encoder block. This can be thought of as MHAB asking a question to `<SOS>` - What? and the answers are given by the encoder block using $$K$$ and $$V$$.
* ''Step 6:'' The output of 2nd MHAB is to feed forward NN. The decoder block is also repeated N times (N=6) and feedforward NN predicts the next word in the sentence. If the next word is //Jane//, This is aslo fed to the input of decoder block to ask - //What of the word Jane?//
The encoder and decoder block and how they combine is the main idea behind [[Transformer Network]]s
!! Details
* [[Positional Encoding]] of the input
:* The self-attention equations does not encode the position of the words. The following equations are used to encode the position
$$
PE_{pos, 2i} = sin(\frac{pos}{10000^{2i/d}}) \\ \ \\
PE_{pos, 2i+1} = cos(\frac{pos}{10000^{2i/d}})
$$
:* $$pos$$ - numerical position of the word //Jane//, $$pos = 1$$
:* $$i$$ - refers to different dimensions of the encoding
:* $$d$$ - dimension of the vector
:: <img src='https://lh3.googleusercontent.com/_bQeUf0DZwh8AO_lnwlRK3fJc2DoX_UiX7MxKs_SLsl-wNg9HCOQch-nteedrCERDxrHxEGYyEdWkp5v2YT_cn3a7Inr04rSUlmblSb56EvwHTEvJlEQl8GFAJB7UqlBVIkBVHSwoCURa6MGSXPXFYw_sSOmjM49lyZC3avI9PCneywku3auKqJuwJMZMbbldwkFOdMrs9juwi_KBD14F11B90gQm2f0yOAUIrZA9D9eihRxo8Cyv98-r4tV4o7DXkOSeLC2kTehivnlAfdeeuMEYnyd4zqc741y6f3ZzLoGBeDVHfC9nPpeHkldflRwe5V6sX933ogt_V-kHS6d1QtZk2QpDQ9uUI7UDNGGBDgQ_NMhNxKUdnwudBRZsbgpf0PYiEZ_ZPdGbCGDmqy3HU0FgqAbFPkQomZ_O-ewNbJkh5DfR85epl8R9pB9wYKFgSF0UoDc0jUrgDY8AZ4rBe2jVAuvHEv7fjC3lesbPOPqfDEkqU7ipIv7rAH64KqtpE-ctloMuqaMdC9-re9EOZmyMkVFWWUiMxaams_4mkQ7WwPyCgjfeKAriDKSfAvBCTygOB6GtMF5q6-QTVb6RgSuj8hTQlp_jSkPLRKimCCvDuPiis1peEHoibdetp50P1Ga8hpeRJjohlFUZzhPZbODPok8Rg_rqZIbCWQnOX2pe2dAE8spBglwNQkC7tKnymrebG5_aXNgjpZ1jI5e0ZToNA=w1920-h500-no?authuser=0' width=600>
:* For example, if the [[Word Embeddings]] are of 4 values. The word embedding dim = 4. Also create a vector of dim 4, called ''Positional Embedding'' vector. i.e. $$P^{\langle 1 \rangle}$$ for the first word $$x^{\langle 1 \rangle}$$
:* The positional encoding $$P^{\langle 1 \rangle}$$ is directly added to $$x^{\langle 1 \rangle}$$, so that each embedding is colored with its own position
* ''Residual Connections'' - similar to the ones used in [[ResNet]]. The purpose is to pass along positional information through the network architecture
* ''Add & Normalize'' - used layer similar to [[Batch Normalization]] which helps speed up learing
* ''Linear & Softmax Layer'' - the output of the decoder block has these two layers to predict one word at a time.
* ''Masked Multi-head attention'' - Only important during the training process. For a training example, the entire correct English translation is available. You don't have to generate words one at a time. Masking blocks out the last part of the sentence to mimic what will it do at test time. it repeatedly pretends that the network had perfectly translated the first few words and hide the remaining words to see if a given a perfect first part of the translation, where NN can predict the next word in sequence accurately.
,,Tags: [[COURSE5: Sequence Models]] | [[21 August 2021]],,
Learn parameters that give good encoding for images is to define and apply [[Gradient Descent]] on the [[Triplet Loss]] function
[[Triplet Loss]] is defined on triplet of images. Given 3 images, $$A, P,$$ & $$N$$, where $$A, p$$ are the same person and $$A, N$$ are different, the loss is defined as follows
$$
\mathscr{L}(A,P,N) = Max\bigg( ||f(A) - f(P)||^2 - ||f(A) - f(N)||^2 + \alpha, 0 \bigg)
$$
and the overall [[Cost Function]] can be
$$
\mathcal{J} = \sum_{i=1}^m \mathscr{L}(A^{(i)},P^{(i)},N^{(i)})
$$
If the training set of 10k pictures of 1k persons, take 10k pictures and generate triplets and train using [[Gradient Descent]]. So you train datasets must have multiple images of the same person.
!! Choosing the triples $$A,P$$ & $$N$$
During training, if $$A,P$$ & $$N$$ are chosen randomly, then $$d(A,P) + \alpha \leq d(A,N)$$ is easily satisfied, and hence training would be easy. Instead choose the triplets that are hard to train on i.e. $$ d(A,P) \sim d(A,N) $$, which increases the computational efficiency of the algorithm. i.e [[Gradient Descent]] has to try hard to push $$d(A,P) $$ down or $$d(A,N)$$ up. The details are in [[FaceNet]] research paper
!! Fun Fact: Algorithm Naming
The [[Deep Learning]] Algorithm are usually named as
* $$ <____>$$NET, or
* DEEP$$ <____>$$
Some companies release the model weights and code. So instead of trying to build from scratch, it is useful to download the pretrained model.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[17 August 2021]],,
!Why Deep Representations?
* Lower level/initial layers of the neural network learn representation of lower level simple features.
* deeper level/later layers put together simple layers to detect more complex things e.g. words, phrases and sentences
Audio $$\rightarrow$$ Low level Audio $$\rightarrow$$ Phenomes 'C'=ka, 'A'=a, 'T'=ta $$\rightarrow$$ Words $$\rightarrow$$ Phrases/sentences
!! Circuit Theory and [[Deep Learning]]
There are functions that you can compute with small L-layer [[Neural Network]] that shallow networks require exponentially more hidden units to compute. For example, if you were to compute XOR for all features $$(x_1, x_2, ... x_n)$$
<img src='https://lh3.googleusercontent.com/hhcXbZ5SpY8L-TPLHKjpEcioepBV_HVPYlpagAIQjRTozDJ7wJz_n3ShHl5v6Vo9rB4GCTjR07_ULBI_J9syBf80NPZYWou_KlKePHp7pJWCiQUq3RqqTGlN0QisvDhEo9DZQ4aBch2AcH7VDyBFZ2NLgyDbt7b0c-aEDTQN_FZ0BlFhAq7CQyPttmODz-S2wpo_4Xe0ZEjpgSkneBGyb6ZEADeBxxIZvqas-0nfl5PxfEfJNZvK3XTc5Iyp-mSmuIWIUio7Z7k1VhijBbwQdL1Cn_16axo0ltYZ8KDs_kIxX7fq6u7eJ5J_jSKCJzdptGk81VQLKTZToSroF_iLOLwH-vGHUFckTICnrguQr9u_FhJ-Xh38sp8q3P6d77pvJ8j40uU7u6H2LwcfvmyL1L0AOcDjbFRh-uttt3fsSWo4mBY5f1wH5XPBap3tK1LOy_rFMExh39XLtCawrsfUTsyLeGuad3j_RmVOn9Ha2_8PfHNcgWYmBNK7C9v4zwAg8-K66Eu4ujqe3AefCf9BaBZvM7f3k4CyVp_FDGaYxadygDdPhwOCOS4TKFCgw9-9fNE3kscoFxi7gOPF0YcQnBcrpiiXZ5IU7U7NXvzmUfnT5EuEOKjdWxsBEW_Ru4xQhkjQhU3Dyk4fj6ShhVXW9LQa0T3o-bLZb9fMYSM6I3NQUbwYY31sMQnrgA8NkEZX11mk9AQla74EnDhrxtSw7NG_pg=w1666-h937-no?authuser=0' width=700>
There are mathematical functions that are much easier to compute with multiple hidden layers than shallow neural network.
''Deep Learning'' rebranded [[Neural Network]]s with many hidden layers
,,Tags:[[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]],,
!Building Blocks of Deep Neural Networks
<img src='https://lh3.googleusercontent.com/DCoBUMXtoe3XDmNGq16uCzsR-UnLvtlQkYcr4ygYUY35aysQMA3JilPzHatqbaWkGo5mGWlYbPk_JnksjuqNh46tzhojF7XJaclSTy-oz_366UTTkVpAysSJ-eo6vF2ZD01gFbZdq2zpX1o4yUoS8ev0grHtYX1HNaE7ALyQDm9Po9laVcG6E4OcEqmJOXeTSAsqAJSEHqpEjyWLfQFTUtciOS4jop9qlNvCvwyv-X-5t92GnCVPKVcyC8pN5gm-N2adBjpav3p4SoCafn5kLFKg7epS8S-7hf9S82Fmo3DefAxLiSXOJG_fswd4a28--dlxfHk5skNSRX0DT43FonJQs7BaMfH46tVnrAq683nwuI-ATl_PvzcNygB_HrYpwyAYkCMk_kbUQUtGywXGQ3zLyQELZhgL1PavykSvtfk-eJybyUElgRbmg6SbKYxRV9P0zOSf9lvT8arsdZQbuDwIIMLH78XXv-6W21eW_cX5YXCBFayq9LTQ3RHBG8wrWmnq_woxzHNil_K1bLB24isD_SOrtbZN4FclBJ5bxoBwtlWiM9vf79Db5Fi4_qQeNeMSzWYMaU3QGQwpaleTcEX8JHiYw4mgBboqiuY5WL8Q7FBOeJAVCwD8y2rO9naltL3DJ99iIJPzbR96TGQphFJF45Idt112n0uphTXwLlEAkSuRKYln4WyjV7N6LSelrcj_mLWTvvyY_cnoLuk-wGNA6A=w692-h676-no?authuser=0' width = 300>
,,Tags:[[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]],,
* [[Face Recognition]] using [[Triplet Loss]]
* Posing [[Face Recognition]] problem as a straight [[Binary Classification]] problem
<img src=''>
* $$\hat{y} = 1$$ (same person)
* $$\hat{y} = 0$$ (Different persons)
the predictions are based on the absolute difference between the element wise values of two encodings $$f(x^{(i)})$$ & $$f(x^{(j)})$$
$$
\hat{y} = \sigma \bigg( \sum_{k=1}^{128} W_k| f(x^{(i)})_k - f(x^{(j)})_k | + b \bigg)
$$
$$f(x^{(i)})$$ & $$f(x^{(j)})$$ can be considered as features fed to the [[Logistic Regression]] $$\sigma (WX + b)$$, where $$X$$ is the element wise absolute difference between the encodings, which predict whether the image belongs to the same person or not.
Another formula for X could be $$\chi^2$$ [[Chi-Squared Similarity]] explored in [[DeepFace]] paper
$$
X = \frac{(f(x^{(i)})_k - f(x^{(j)})_k)^2}{f(x^{(i)})_k + f(x^{(j)})_k}
$$
!! Deployment note
if the image belongs to existing employee (in the database) then the embedding can be precomputed, so it only computes the encoding for the new faces which can significantly reduce the time to execute comparison in production.
!! [[Face Verification]] as [[Supervised Learning]]
Create a training set of pairs of images where the target label = 1 when same person image else 0
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[17 August 2021]],,
!Forward and Backward Propagation
<img src='https://lh3.googleusercontent.com/U0QisASEoQw2dUIjTZBJofNUpZDQPQNa4rIoxru7DpA1tUYxFuunp1WRoynmYuOgBvHz8lLZ0ZciHs7SyhYN7ln1rMDje5eGU0xRSSWeRT_c4kPO2-67C0OmxGdmbWC1PbX0aw3exv_ZGJm5J8IItHzW3J0BT9ZDb1xP5UjZ1bKYE5xhmOogN2893K0xmU1jd5DdmSKAQm9641rI2xourNe_WoUusnMO0fYPupmd8TykMgI7QTRwrSJOUwBlxuanLNaK4_9FDSNLNQkjJrVSv6U31I62g5crgpDyrhps-pEa6EoaDZ9JRl-67VlgymC9CNnIN4LHOSfhiT_qkewTYZqV-OXKzLg31mderHCDb11OuHnZ7T-ZpxYQQqplBr7Xb2L7sinyZbpT4bMVoN7RrXOFT59ZXCHg9N7v7cUZ5usKoS1D4nIdAEorFfRAJuen-gtMA_5v7RgHNfL-PdTEJPhG6eO3Gpg5qDybeX21rqUHLXXOiE6KlL8dcDQ6cjAH25IYilm7TJ0V3g_0uwzSLyBI2Vu27kOX3M13e6kFSNirLHdElH2wHrb9Vi6FaVgluOZiMCQ2jgthxwen-4Vj4Mm6x3RPVlnvHBbumQma_YY4U9LQVFg7hOCmAY8qjG7Ey4Nx350Rcerm7bAv44J8t0lhPB5GbL0TLGIQQ-xCvGTTd3TTJ948IadzFh4zP31ddDFTsY_qoxkyiFxbodkpJesHpg=w1666-h937-no?authuser=0' width=800>
* Inputs $$a^{[l-1]}$$
* Output $$a^{[l]}$$, cache $$z^{[l]}, w^{[l]}, dz^{[l]}$$
!! Forward Prop
<<<
$$Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]}$$
$$A^{[l]} = g^{[l]}(Z^{[l]})$$
<<<
!! [[Backpropagation]]
* Inputs $$da^{[l]}$$
* Output $$a^{[l-1]}, dw^{[l]}, db^{[l]}$$
<<<
$$dz^{[l]} = da^{[l]} * g^{[l]'}(z^{[l]})$$
$$dw^{[l]} = \frac{1}{m} dz^{[l]} a^{[l-1]T}$$
$$db^{[l]} = \frac{1}{m} np.sum(dz^{[l]},axis=1,keepdims=True)$$
$$da^{[l-1]} = w^{[l]T} dz^{[l]}$$
<<<
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]],,
! What is Neural Style Transfer?
[[Neural Style Transfer]] allows you to transfer the style from the style image to the content image retaining the content of the original image.
''CONTENT IMAGE (C) + STYLE IMAGE (S) $$\rightarrow$$ GENERATED IMAGE (G)''
<img src='https://cdn.hackernoon.com/hn-images/1*k5Q_NYr1niC-qjWMr-lUCg.png' width=700>
To understand and implement [[Neural Style Transfer]] requires you to understand what intermediate layers of [[Convolutional Neural Network]] are computing
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[03 June 2021]],,
!Parameters vs Hyperparameters
* $$W, b$$ - parameters of the model
* ''Hyperparameters''
** $$\alpha$$ - learning rate
** # of iterations of gradient descent
** # of hidden layers $$L$$
** number of hidden units $$n^{[1]}, n^{[2]},...$$
** choice of [[Activation]] function
These hyperparameters control how lower level parameters $$W, b$$ evolve over iterations of [[Gradient Descent]]
''If you are starting on a new problem, try out a range of values for hyperparameters''
,,Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]],,
! What are deep Convnets Learning?
To understand what deep [[ConvNet]]s are learning, pick a layer and 1 hidden unit in that layer an plot the image patches ''that maximize the unit's activation''
The result is that shallow layers detect basic shapes, when as we go deeper detect more complex shapes to entire objects
<img src='https://3.bp.blogspot.com/-H2TTi9QTprM/Wp7YRKxFeKI/AAAAAAAACbs/w9kffufxDlsTxQnT994tmV6sbTVoeB0XACLcBGAs/s1600/image2.png' width=1000>
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[03 June 2021]],,
To build a [[Neural Style Transfer]], we first define the [[Cost Function]] for generated image which will be minimized using [[Gradient Descent]]
$$J(G) = \alpha J_{content}(C,G) + \beta J_{style} (S,G)$$
where $$J_{content}(C,G)$$ measures how similar the content image is to the generated image, while, $$J_{style} (S,G)$$ measures how similar is the style of the style image to the style of the generated image
[[Neural Style Transfer]] authors used tow [[Hyperparameter]]s to optimize but it seems redundant. But, still going to use $$\alpha$$ and $$\beta$$ for convention. Much more details are available in the not to hard to read paper - https://arxiv.org/pdf/1508.06576.pdf
!! Find the generated image G
# Initialize G randomly
#: $$G = 100 \times 100 \times 3$$
# Use [[Gradient Descent]] to minimize $$J(G)$$ and update pixel values
#: $$ G:= G - \frac{\partial}{\partial G} J(G)$$
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[18 August 2021]],,
!What does this have to do with human brain?
''Not a whole lot. Why?''
The neuron for [[Logistic Regression]] unit looks similar to ta [[Neuron]] in the [[Brain]], but even [[Neuroscientist]]s are eluded by the neuron and what it does. Earlier this was being used as an analogy to explain how [[Neural Network]]s work, but with advancements in [[Deep Learning]] the analogy is breaking down.
<img src='https://miro.medium.com/max/2608/1*Guw3Xjy9X1frUoQAex2J7w.jpeg'>
Tags: [[COURSE1: Neural Networks & Deep Learning]] | [[15 June 2021]]
$$J(G) = \alpha J_{content}(C,G) + \beta J_{style} (S,G)$$
* You use a hidden layer $$l$$ (neither to shallow nor to deep) to compute the content cost in a pretrained [[Convolutional Neural Network]] (e.g. [[VGG16]] network)
* Let $$a^{[l](C)} \& \ a^{[l](C)}$$ be the [[Activation]] of layer $$l$$ on the images. If these two activations are similar, then both images have the similar content.
$$J_{content}(C,G) = \frac{1}{2} ||a^{[l](C)} - \ a^{[l](C)}||^2$$
While minimizing the cost function $$J_{content}(C,G)$$, it will incentivize the algorithm to minimize and find an image that is similar to content image C
[[COURSE4: Convolutional Neural Networks]]
!! What does style of an image mean?
<img src='https://dummyimage.com/600x400/000/fff' width=250>
Suppose layer $$l$$ is being used to measure style. The ''style is defined as the [[Correlation]] between [[Activation]]s across different channels in the layer $$l$$''
<img src='https://gblobscdn.gitbook.com/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0cUOoS6tLVjGbkYWq%2F113.bmp?alt=media' width=400>
!! Why does the correlation capture style?
Let's say in the [[Convolution]]al layer $$l$$, with 5 channels as above
* Red channel computes textures between vertical lines
* Yellow channel computes regions with orange tint
Computing the correlation between the pairs of numbers in the two channels mean show often does vertical lines appear with orange tint.
* If the style is correlated that means they appear together
* If uncorrelated, the vertical line texture won't have orange tint
And so, if we use degree of correlation between channels as a measure of style, then you can measure the degree to which in your generated image, the red channel is correlated or un-correlated with the yellow channel and tell whether the vertical line texture appears together with orange tint. This measures how similar is the style of generated image to the style of input style image.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[18 August 2021]],,
!! Style Matrix
Given an image, compute a style matrix, which will measure all correlations between pairs across channels
Let $$a^{[l]}_{i,j,k}$$ be the [[Activation]] $$a$$ for position $$i$$ (H), $$j$$ (W), $$k$$ (C) in hidden layer $$l$$
:Compute a matrix $$G^{[l]} \rightarrow n_c^{[l]} \times n_c^{[l]}$$ dimensional matrix
:The dimensions are such so as to compare the each channel with each other channel in the layer $$l$$
$$G_{k,k'}^{[l]}$$ - measures the correlation between channel k and k' where $$k \in {1, 2, ..., n_c^{[l]}}$$
For Computing correlation between the style of generated image with the style of input style image
$$
G_{k,k'}^{[l](S)} = \sum_{i=1}^{n_H^{[l]}} \sum_{j=1}^{n_W^{[l]}} a_{ijk}^{[l](S)} a_{ijk'}^{[l](S)}
$$
Technically, the computed quantity $$G_{k,k'}$$ is un-normalized cross [[Covariance]] because we are not subtracting mean and just multiplying the elements directly.
$$
G_{k,k'}^{[l](G)} = \sum_{i=1}^{n_H^{[l]}} \sum_{j=1}^{n_W^{[l]}} a_{ijk}^{[l](G)} a_{ijk'}^{[l](G)}
$$
$$G_{k,k'}$$ is called [[Gram Matrix]] in algebra
$$
J_{style}^{[l]}(S,G) = ||G^{[l](S)} - G^{[l](G)}||^2 = \frac{1}{2 n_H^{[l]} n_W^{[l]} n_C^{[l]}} \sum_k \sum_{k'} \bigg(G_{k,k'}^{[l](S)} - G_{k,k'}^{[l](G)}\bigg)^2
$$
where $$\frac{1}{2 n_H^{[l]} n_W^{[l]} n_C^{[l]}}$$ is a normalization constant used by the authors. However, this does not matter much because the cost is multiplied by the hyperparameter $$\beta$$ anyways
!! Style Cost Function
Basically [[Frobenius Norm]] between two style matrices $$S$$ & $$G$$ multiplied with normalization constant.
Finally,'' to get more visually pleasing results, you can use style cost function from multiple different layers''. So the overall style [[Cost Function]] stands
$$ J_{style}(S,G) = \sum_l \lambda^{[l]} J_{style}^{[l]} (S,G)$$
$$\lambda$$ allows the usage of multiple layers to take both high and low level [[Correlation]]s into account when computing style.
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[18 August 2021]],,
!! 2-Dim
$$\begin{bmatrix} 14 \times 14 \end{bmatrix} * \begin{bmatrix} 5 \times 5 \\ 16 \ Filters \end{bmatrix} \rightarrow \begin{bmatrix} 10 \times 10 \times 16 \end{bmatrix}$$
!! 1-Dim
$$\begin{bmatrix} 14 \times 1 \end{bmatrix} * \begin{bmatrix} 5 \times 1 \\ 16 \ Filters \end{bmatrix} \rightarrow \begin{bmatrix} 10 \times 16 \end{bmatrix}$$
!! 3-Dim
$$\begin{bmatrix} 14 \times 14 \times 14 \end{bmatrix} * \begin{bmatrix} 5 \times 5 \times 5 \\ 16 \ Filters \end{bmatrix} \rightarrow \begin{bmatrix} 10 \times 10 \times 10 \times 16 \end{bmatrix}$$
,,Tags: [[COURSE4: Convolutional Neural Networks]] | [[18 August 2021]],,
! Special Applications: Face Recognition & Neural Style Transfer
!! Question 1
[[Face verification]] requires comparing a new picture against one person’s face, whereas [[Face Recognition]] requires comparing a new picture against K person’s faces.
* False
* ''True''
!! Question 2
Why do we learn a function $$d(img1, img2)$$ for face verification? (Select all that apply.)
* ''This allows us to learn to recognize a new person given just a single image of that person''.
* ''This allows us to learn to predict a person’s identity using a [[Softmax]] output unit, where the number of classes equals the number of persons in the database plus 1 (for the final “not in database” class). ''
* Given how few images we have per person, we need to apply [[Transfer Learning]].
*'' We need to solve a [[One-Shot Learning]] problem.''
!! Question 3
In order to train the parameters of a face recognition system, it would be reasonable to use a training set comprising 100,000 pictures of 100,000 different persons.
* ''False''
* True
!! Question 4
Which of the following is a correct definition of the [[Triplet Loss]]? Consider that $$\alpha > 0$$. (We encourage you to figure out the answer from first principles, rather than just refer to the lecture.)
* $$max(||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 + \alpha, 0)$$
* $$max(||f(A)-f(N)||^2 - ||f(A)-f(P)||^2 - \alpha, 0)$$
* $$max(||f(A)-f(N)||^2 - ||f(A)-f(P)||^2 + \alpha, 0)$$
* $$max(||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 - \alpha, 0)$$
''Answer: 4''
!! Question 5
Consider the following [[Siamese Network]] architecture:
<img src="https://i.ibb.co/qrTGyXc/course4-week4-q5.png" alt="course4-week4-q5" border="0">
The upper and lower neural networks have different input images, but have exactly the same parameters.
* False
* ''True''
!! Question 6
You train a ConvNet on a dataset with 100 different classes. You wonder if you can find a hidden unit which responds strongly to pictures of cats. (I.e., a neuron so that, of all the input/training images that strongly activate that neuron, the majority are cat pictures.) You are more likely to find this unit in layer 4 of the network than in layer 1.
* ''True''
* False
!! Question 7
[[Neural Style Transfer]] is trained as a supervised learning task in which the goal is to input two images ($$x$$), and train a network to output a new, synthesized image ($$y$$).
* True
* ''False''
!! Question 8
In the deeper layers of a ConvNet, each channel corresponds to a different feature detector. The style matrix $$G^{[l]}$$ measures the degree to which the activations of different feature detectors in layer $$l$$ vary (or correlate) together with each other.
* ''True''
* False
!! Question 9
In [[Neural Style Transfer]], what is updated in each iteration of the optimization algorithm?
* ''The pixel values of the generated image $$G$$''
* The [[Neural Network]] parameters
* The pixel values of the content image $$C$$
* The regularization parameters
!! Question 10
You are working with 3D data. You are building a network layer whose input volume has size 32x32x32x16 (this volume has 16 channels), and applies convolutions with 32 filters of dimension 3x3x3 (no padding, stride 1). What is the resulting output volume?
* ''30x30x30x32''
* 30x30x30x16
* Undefined: This convolution step is impossible and cannot be performed because the dimensions specified don’t match up.
tags: [[COURSE4: Convolutional Neural Networks]] | [[05 June 2021]]
! Transformers
!! Question 1
A [[Transformer Network]], like its predecessors [[RNN]]s, [[GRU]]s and [[LSTM]]s, can process information one word at a time. (Sequential architecture).
* True
* ''False''
!! Question 2
Transformer Network methodology is taken from: (Check all that apply)
* Convolutional Neural Network style of architecture.
* [[Attention mechanism]].
* None of these.
* [[Convolutional Neural Network]] style of processing.
!! Question 3
The concept of [[Self-Attention]] is that:
<img src="https://i.ibb.co/sKJb1Bb/course5-week4-q3.png" alt="course5-week4-q3" width="700">
* Given a word, its neighbouring words are used to compute its context by selecting the highest of those word values to map the Attention related to that given word.
* Given a word, its neighbouring words are used to compute its context by taking the average of those word values to map the Attention related to that given word.
* ''Given a word, its neighbouring words are used to compute its context by summing up the word values to map the Attention related to that given word.''
* Given a word, its neighbouring words are used to compute its context by selecting the lowest of those word values to map the Attention related to that given word.
!! Question 4
Which of the following correctly represents Attention ?
# $$Attention(Q, K, V) = min(\frac{QV^T}{\sqrt{d_k}})K$$
# $$Attention(Q, K, V) = softmax(\frac{QV^T}{\sqrt{d_k}})$$
# $$Attention(Q, K, V) = min(\frac{QK^T}{\sqrt{d_k}})$$
# $$Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})$$
!! Question 5
Are the following statements true regarding Query (Q), Key (K) and Value (V) ?
Q = interesting questions about the words in a sentence
K = specific representations of words given a Q
V = qualities of words given a Q
* ''False''
* True
!! Question 6
$$
Attention(W_i^Q Q, W_i^K K, W_i^V V)
$$
$$i$$ here represents the computed attention weight matrix associated with the $$i^{th}$$ “word” in a sentence.
* ''False''
* True
!! Question 7
Following is the architecture within a Transformer Network. (without displaying positional encoding and output layers(s))
<img src="https://i.ibb.co/6NmnVc4/course5-week4-q7.png" alt="course5-week4-q7" width="700">
What information does the Decoder take from the Encoder for its second block of [[Multi-Head Attention]] ? (Marked $$X$$, pointed by the independent arrow)
(Check all that apply)
* Q
* ''K''
* ''V''
!! Question 8
Following is the architecture within a Transformer Network. (without displaying positional encoding and output layers(s))
<img src="https://i.ibb.co/rpdSmLm/course5-week4-q8.png" alt="course5-week4-q8" width="700">
What is the output layer(s) of the Decoder ? (Marked $$Y$$, pointed by the independent arrow)
* Softmax layer followed by a linear layer.
* Softmax layer
* Linear layer
* ''Linear layer followed by a softmax layer''.
!! Question 9
Why is positional encoding important in the translation process? (Check all that apply)
* ''Position and word order are essential in sentence construction of any language.
''
* ''It helps to locate every word within a sentence.''
* It is used in CNN and works well there.
* ''Providing extra information to our model.''
!! Question 10
Which of these is a good criteria for a good positionial encoding algorithm?
* ''It should output a unique encoding for each time-step (word’s position in a sentence).''
* Distance between any two time-steps should be consistent for all sentence lengths.
* ''The algorithm should be able to generalize to longer sentences.''
* None of the these.
Tags: [[COURSE5: Sequence Models]] | [[03 June 2021]]
! Key concepts on Deep Neural Networks
!! Question 1
What is the "cache" used for in our implementation of forward propagation and backward propagation?
* It is used to keep track of the hyperparameters that we are searching over, to speed up computation.
* It is used to cache the intermediate values of the cost function during training.
* ''We use it to pass variables computed during forward propagation to the corresponding backward propagation step. It contains useful values for backward propagation to compute derivatives''.
* We use it to pass variables computed during backward propagation to the corresponding forward propagation step. It contains useful values for forward propagation to compute activations.
!! Question 2
Among the following, which ones are "hyperparameters"? (Check all that apply.)
* activation values $$a^{[l]}$$
* ''number of layers $$L$$ in the neural network''
* bias vectors $$ b^{[l]}$$
* ''size of the hidden layers $$n^{[l]}$$''
* weight matrices $$W^{[l]}$$
* ''number of iterations''
* ''learning rate $$\alpha$$''
!! Question 3
Which of the following statements is true?
* ''The deeper layers of a neural network are typically computing more complex features of the input than the earlier layers''.
* The earlier layers of a neural network are typically computing more complex features of the input than the deeper layers.
!! Question 4
Vectorization allows you to compute forward propagation in an LL-layer neural network without an explicit for-loop (or any other explicit iterative loop) over the layers l=1, 2, …,L. True/False?
* True
* ''False''
<<<
Solution: Forward propagation propagates the input through the layers, although for shallow networks we may just write all the lines $$(a^{[2]} = g^{[2]}(z^{[2]})$$,
$$z^{[2]}= W^{[2]}a^{[1]}+b^{[2]}$$ , ...) in a deeper network, we cannot avoid a for loop iterating over the layers: $$(a^{[l]} = g^{[l]}(z^{[l]}), z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}, ...$$).
<<<
!! Question 5
Assume we store the values for $$n^{[l]}$$ in an array called layers, as follows: layer_dims = [$$n_x$$, 4, 3, 2, 1]. So layer 1 has four hidden units, layer 2 has 3 hidden units and so on. Which of the following for-loops will allow you to initialize the parameters for the model?
```python
for (i in range(1, len(layer_dims)/2)):
parameter['W' + str(i)] = np.random.randn(layers[i], layers[i-1])) * 0.01
parameter['b' + str(i)] = np.random.randn(layers[i], 1) * 0.01
```
```python
for(i in range(1, len(layer_dims)/2)):
parameter['W' + str(i)] = np.random.randn(layers[i], layers[i-1])) * 0.01
parameter['b' + str(i)] = np.random.randn(layers[i-1], 1) * 0.01
```
```python
for(i in range(1, len(layer_dims))):
parameter['W' + str(i)] = np.random.randn(layers[i-1], layers[i])) * 0.01
parameter['b' + str(i)] = np.random.randn(layers[i], 1) * 0.01
```
<<<
```python
for(i in range(1, len(layer_dims))):
parameter['W' + str(i)] = np.random.randn(layers[i], layers[i-1])) * 0.01
parameter['b' + str(i)] = np.random.randn(layers[i], 1) * 0.01
```
<<<
!! Question 6
Consider the following neural network.
<img src='https://lh3.googleusercontent.com/K8EIl4JIJO1_-AGpWKqWyPNt0COEylFa1sCMHadWoWlw-XNGlaVM85nA_QpH3c2U5cv0r4UemU-MznNx3_AkfBJNs5NzUJP-tDSbm4ixxjdcukwIGVmBwISgBKzqPwN0b-um59Eoaz1grB-cfC2B5BcgD9WOo_XKesejmMKO5WVzOHi_mqliSvdtYJs3wVVQttSIUUik-6-FK4UHHaDcYIsZGr8gvJcbL4DRvxoOssRkS95vXDl6BvmDZorCcxOL0ErvLhRmhHOYBas0uNfFmOi6SyPRI82YUT79UbLRM6sW46sk9pUHG6O4AFKXlfdBCLnNFLmlzWS0zj3nUb9Cg_yoxEiACHuZl0qUbBgOtIWXnebq1JUdUluwU1WTGLqz1nuhU3UfAQPQf7GvpOO35q6eGaBuygzzDGUmzUe_7j-fke7w1-9luO59jPwZe5YqXcFLcYm6xSCly8nSLO8Db9E2CoeU7WPtfGAKIhODi48Ae2v_1StMlkCdBEpZVUFDVS1iAdNg_5ROxlZcFvCgwjK8wwnRq39zwZnTVrCL6S9kJ1EgfvAEHraVZ14uYA449lyf3se0U_xq9GQ5aWe1T9tzwumLjbIuMbBRvWkI30GdVArX3ixKesmW_AZH14Z_IkjVnpfaVq4lyXI8AoUxmRft3HUOKOrr5JXF6rVUD-FTUbOYSkBN4kdtc8HQKXetiIx6mz5njbLCOmw_dDJRW92JDg=w708-h258-no?authuser=0'>
How many layers does this network have?
* ''The number of layers $$L$$ is 4. The number of hidden layers is 3''.
* The number of layers $$L$$ is 3. The number of hidden layers is 3.
* The number of layers $$L$$ is 4. The number of hidden layers is 4.
* The number of layers $$L$$ is 5. The number of hidden layers is 4.
!! Question 7
During forward propagation, in the forward function for a layer ll you need to know what is the activation function in a layer ([[Sigmoid]], [[tanh]], [[ReLU]], etc.). During [[Backpropagation]], the corresponding backward function also needs to know what is the activation function for layer $$l$$, since the gradient depends on it. True/False?
* ''True''
* False
!! Question 8
There are certain functions with the following properties:
(i) To compute the function using a shallow network circuit, you will need a large network (where we measure size by the number of logic gates in the network), but (ii) To compute it using a deep network circuit, you need only an exponentially smaller network. True/False?
* ''True''
* False
!! Question 9
Consider the following 2 hidden layer [[Neural Network]]:
<img src='https://lh3.googleusercontent.com/OcUv0QBzp3Tj5AtO7rWY_sVufZDwNCy6JDBMjhtwfQY4qh-kWpZMv0oVxb_ZoXLbmvHXqi7CJXlKENv8fy9ggtM6y4OHRgf3w5gXgcLgxc2tYsthXp4W2KBhFssP7a13Xj5EJ6_uOAcZEwTdqHKa8o45K_BbBOFALXmxcu8cbC57CIlueYAa2aioPhQBFGLaa8PqFnb47PG9CxrU1ZZD5YXDEdbEk0fsaMlJ-4Bk1TRu5bAS-Ngx_mazZjBkC1lEk0011vDhKMp_FpDDZTn4S1P6FGbLLDzp7GJyx1iv5-Bp6WwT11N2Hk6_g4Fc8Lvp8EsM-Y4ZPWjpN3iXw8zKjwR4NPznWl7jagA0Ydd5nQL1eJ11O0RJAmOYS32whXmvz6zdov9Y6TB5JnzaoY7HVy_CBqmoL0heimbUzl-Yzf9KpwobA0YJlT2NLp1dyPzSmaaV-MIhyt4yMDz7ILSMOWYj8ns9l6QqM-7EQrxrFFVzE0odOevvsCR5FPXmsku4lJSNmh_TzRJh1X7HaJh4bEVIE0TvRNwpQra3TyEiAOYyjFnweVB1ZG9azXlKbShnbIbPFMRYatOXnCXLdckfXkn0o1-0fah-t6qN-0L8fY8YlnwnddKvBUKYIFWqvuINqGucVHgPIY88L2B9UkO-dEVqRFGpa82yMRbxJNByeAps-Y-Xmlac_VID8OEDJ8dg8fz8VeVo3VUbDW40TJiezJU8TA=w576-h338-no?authuser=0'>
Which of the following statements are True? (Check all that apply).
* ''$$W^{[1]}$$ will have shape (4, 4)''
* ''$$b^{[1]}$$ will have shape (4, 1) ''
* $$W^{[1]}$$ will have shape (3, 4)
* $$b^{[1]}$$ will have shape (3, 1)
* ''$$W^{[2]}$$ will have shape (3, 4)''
* $$b^{[2]}$$ will have shape (1, 1)
* $$W^{[2]}$$ will have shape (3, 1)
* ''$$b^{[2]}$$ will have shape (3, 1)''
* $$W^{[3]}$$ will have shape (3, 1)
* ''$$b^{[3]}$$ will have shape (1, 1)''
* ''$$W^{[3]}$$ will have shape (1, 3)''
* $$b^{[3]}$$ will have shape (3, 1)
!! Question 10
Whereas the previous question used a specific network, in the general case what is the dimension of $$W^{[l]}$$, the weight matrix associated with layer $$l$$?
* $$W^{[l]}$$ has shape $$(n^{[l]}, n^{[l+1]})$$
* $$W^{[l]}$$ has shape $$(n^{[l-1]}, n^{[l]})$$
* $$W^{[l]}$$ has shape $$(n^{[l+1]}, n^{[l]})$$
* ''$$W^{[l]}$$ has shape $$(n^{[l]}, n^{[l-1]})$$''
,,Tags: [[COURSE1: Neural Networks & Deep Learning]],,
!! From the videos:
* Controllable GAN - Interpreting the Latent Space of GANs for Semantic Face Editing (Shen, Gu, Tang, and Zhou, 2020): https://arxiv.org/abs/1907.10786
!! From the notebooks:
* MNIST Database: http://yann.lecun.com/exdb/mnist/
* CelebFaces Attributes Dataset (CelebA): http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
!! Optional
* The Conditional GAN Paper - Conditional Generative Adversarial Nets (Mirza and Osindero, 2014): https://arxiv.org/abs/1411.1784
[[Course 1: Build Basic GANs]]
* How you react post rejection is the key
*# You can either run
*# You can ask why? and clear their doubts - If you do this you gain their trust. just by asking, you can do anything
* The fear of rejection includes things that are sometimes completely unrelated to us - you can only get to know this if you try and ask
* Speaker found out Canadian Entrepreneur [[rejectiontherapy.com|https://www.rejectiontherapy.com/]] where you ''deliberately get rejected for 30 days and by the end you de-sensitize yourself from the pain''
The speaker wanted to always teach. He just knocked on the door of the professor of University of Austin Texas, he was rejected twice but the third time, professor included in his curriculum - he didn't even have PhD to teach. He maintains a blog of 100 day rejections - https://www.rejectiontherapy.com/100-days-of-rejection-therapy
<iframe width="560" height="315" src="https://www.youtube.com/embed/-vZXgApsPCQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[12 January 2022]] | [[Ted Talk]]
I have mentored 3 interns across first 2 years of my tenure and onboarded new colleagues. I have found it challenging at first, but rewarding at the end. The biggest things that you learn are
* Learn to manage own priorities while also helping interns achieve their objectives
* It is additionally the feeling when people you have mentored get recognized that the effort of helping them bears fruit
[[Preparing for the next role]]
!! Answer
I would think of it as a 3 part problem
First off, I will be transitioning my old responsibilities and taking up transition of projects that I will be managing. The goal here would be to understand the projects in depth and get hold of terminologies
Secondly, I would learn how things function within the team, the expectations that my leader and skip leaders has from me in the my role. I would also try to learn about the team and their strengths and gather feedback from the previous manager, if I inherit a team. I would set up 1x1 discussions at first to learn about the motivations and the things that they like doing
Thirdly, I would try and get a small win
First 15 days
* ''Transition and delegate old responsibilities''
* ''Learn about the projects in the new team''
Next 1 month
* ''Getting to know B40'' and expectations
* ''Get to know the team''
** Setting individual connects with team members and learn about their motivations and their strengths (who is good at what? - some maybe good in tech - python sql, some good with conceptualizing, some good with proposing solutions, some with most experience within the team),
!!! References
* https://blog.penelopetrunk.com/2005/06/03/4-worst-mistakes-of-a-first-time-manager/
* https://www.themuse.com/advice/youre-the-bossnow-what-7-todos-as-a-firsttime-manager
[[Preparing for the next role]]
* Old Project - Tenured B30
* Old Project - New B30
* New Project - Tenured B30
* New Project - New B30
[[Preparing for the next role]]
If additional hands available:
* identify the steps that can be parallelized - seek help from other B30s
If additional hands not available
* Identify the steps that have most learning opportunities (like final analysis of the outcome) - objective increase the learning payoff for both B30 and mine - help complete the non-learning objectives, parallelize steps
!!! Framework
* Time Sensitive
* Relaxed
[[Preparing for the next role]]
!! Guidelines
* Break your answer down to 2-3 year chunks - helps interviewer visualize and describe what your plan is
* Focus on high level intentions - the value that you plan to deliver within those chunks
* Stay away from specific job titles that you want to get in the next 2-3 years. That can come off as overly presumptuous
!! What are they looking for?
* What you plan to give to the employers rather than what you can get out of the role
!! Pointers
* So far I have worked on suite of projects that has led
** SME Footprint & FRP - that required high agility that required communicating with partners,
** BAU projects like refreshing MYCA models -
** OCC exam - curating the document for regulators
** Automation - Auto-retrain projects
** Maintenance - tracking, CDIT, EI implementation
** Internal resources - Data Models, Feature Selection Pipeline, Case Review pipeline
* Not focused much on deep learning - explore possible use cases - certifications
In the first two to three years
* I plan to implement the learning that have gained from this entire suite of products
* Build skillsets within the team and at the same time develop some internal tools that help improve the efficiency
* Can leverage my existing resources to help ramp up the team
In next few years
* use that experience to develop similar skillsets at an enterprise level
[[08 July 2021]] | [[Preparing for the next role]]
3 criterions to decide
* Intent and agility to learn quickly
** Can identify the problem being solved and also think of use case that would benefit from that external perspective
* Interested in data science
** Learning about new topics in data science
* High Performing
** Individuals think of it as a reward for their high performance, and also gives them visibility when they share their experiences in front of the team. This should motivate the peers to also strive for high performance and get rewarded
[[Preparing for the next role]]
Speech to Text translation and transcription from any language to any language in 3 lines of [[Python]] code
!! References
* [[https://openai.com/blog/whisper/]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/_xVTgdpokH4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
,,[[OPEN AI]] | [[06 November 2022]],,
!!! Four Reasons
* Has always been a dream company to work for.
* I was always fascinated with the way Google has merged machine learning/NLP applications in search, in Gmail. Wanted to explore, how machine learning happens in google
* Not to mention the great talent that I will be able to work with
* And infrastructure that Google has developed, will be able to conduct analysis at scale
!!! Closing
* I expect that I will be able to learn about different algorithms google has developed and value/growth it creates using different products and improvements
* With product analyst, will be able to learn across the product journeys. I want to complete a major learning cycle
!! Mission
Organize the worlds information and make it universally accessible and useful
!! References
* [ext[Generating WordClouds in Python|https://www.datacamp.com/community/tutorials/wordcloud-python]]
* [[30 April 2021]] - [[Word Cloud]] in [[Python]].
* Uses [[Word Cloud Package|https://amueller.github.io/word_cloud/auto_examples/masked.html#sphx-glr-auto-examples-masked-py]]
* Can also create a masked wordcloud
* Creating a [[Wordcloud with Image Coloring]]
!! Masked Word Cloud
```python
from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# Load a sihlouette of object - png format
egg_mask = np.array(Image.open('../input/externalnfl/egg.png'))
# join all text in a single variable
with open('../input/externalnfl/rules_nlp.txt', 'r') as txt:
rules = ' '.join([line for line in txt]).title()
# generate wordcloud
wc = WordCloud(background_color='white', max_words=2000, mask=egg_mask)
wc.generate(rules)
wc.to_file('ball_rule_word_cloud.png')
wc.to_image()
```
!! Output
<img src='https://www.kaggleusercontent.com/kf/8591586/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..kmVZwFpZFoOENekuFdKexg.TI_IS8uiaSAYnCSfzpHn8XA-V01Dt6BgigBydhb5W6WDQh75RhXrNwJrObyU2A74NITjuUYvsQoEL9KIuOSXZrtzDM3CicWBmP6cvaWTwc3iub7W4o9ubgzr8grP5h9BTu6y7CwfBgwvztp9yMSDNDmdFIGpIL9_JIBGDm0OMgf6aqwk_CxHbModyk1-PbBVLau901skjF-P-OZULtQkgnP9hC5aydTLXM9PcV-OkKsX0Yo-eNCTRYRyTkaVB5-1t_NuZ7mTHrMprbl3RKLj5COmU4EOYJG3RH4jYKcXRMrcW1XJdg1h8vznAXAnfM9j0zNNNUGFXW5q_GfN6X2yio_R6g_uFDHRf1cqWqJ0Sf2LARAJCspI_5fBBc6xOSUUifTZ0Jg1wYMsJML1p-UiuesVzozG0QOFYdbqg2uw_8Uy4uKdGs5EcjjUpqZ38CYlHGLhuBTrfYBztrOxsuED8AeRkFvfk4lbC4VxukKvO47SO2m3BMWTi4nF9bSR3e7t11XZ0EYNzgaStRpWWePeHLO2PEGTibaWLIOiWR_gZeWbENn83aEs7htQlK3uXi5q8psuFfkyzVvBSigJwyuN6XALpq4w8sMP_9g8Q--srCeQxNi4luJqUmZFqlmNfPcIDFFR04gAZxi50Ygu2UuDyvx199qhViCMCJrbjG-ewUI.h6Vd1xxzZUoL0NbjvuXtfA/__results___files/__results___3_0.png' width=500>
!! References
* [ext[
NFL Rules Wordcloud|https://www.kaggle.com/gaborfodor/nfl-rules-wordcloud/comments]] from [[Kaggle]]
* * [ext[Generating WordClouds in Python|https://www.datacamp.com/community/tutorials/wordcloud-python]]
* `collocations = True` - would read common phrases and plot them on the masked image. To plot only individual words set it to `False`
!! Code
```python
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Read text
opp = pd.read_csv('pandasseries.csv')
text = ' '.join([' '.join([y.strip().upper() for y in x]) for x in phonetxt.opp_nm.str.split('-').values])
# Read image with Mask
custommask = np.array(Image.open('fieldblue.PNG'))
# image coloring
imgcolor = ImageColorGenerator(custommask)
# removing stop words
stopwords = set(STOPWORDS)
wc = WordCloud(background_color='white', max_words=2000, mask=custommask, stopwords=stopwords, collocations=True)
wc.generate(text)
wc.recolor(color_func=imgcolor)
wc.to_file('wordcloud_to_save.png')
wc.to_image()
```
[[Word Cloud in Python]]
<style type="text/css">
td{text-align: center;}
table.tableizer-table {
border: 1px solid #CCC;
}
.tableizer-table td {
padding: 4px;
margin: 3px;
border: 1px solid #CCC;
}
.tableizer-table th {
background-color: #104E8B;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead>
<tr class="tableizer-firstrow">
<th>Start Time </th>
<th>End Time</th>
<th>Tasks</th>
</tr>
</thead>
<tbody>
<tr>
<td>11:00 AM</td>
<td>11:30 AM</td>
<td rowspan=4>Main Difficult Task</td>
</tr>
<tr><td>11:30 AM</td><td>12:00 PM</td></tr>
<tr><td>12:00 PM</td><td>12:30 PM</td></tr>
<tr><td>12:30 PM</td><td>1:00 PM</td></tr>
<tr><td>1:00 PM</td><td>1:30 PM</td>
<td>Check Emails, Answer slacks</td></tr>
<tr><td>1:30 PM</td><td>2:00 PM</td><td rowspan=2>Food</td></tr>
<tr><td>2:00 PM</td><td>2:30 PM</td></tr>
<tr><td>2:30 PM</td><td>3:00 PM</td><td rowspan=2>Main Task 2</td></tr>
<tr><td>3:00 PM</td><td>3:30 PM</td></tr>
<tr><td>3:30 PM</td><td>4:00 PM</td><td rowspan=2>Meetings/Slacks</td></tr>
<tr><td>4:00 PM</td><td>4:30 PM</td></tr>
<tr><td>4:30 PM</td><td>5:00 PM</td><td rowspan=2>Chai Break</td></tr>
<tr><td>5:00 PM</td><td>5:30 PM</td></tr>
<tr><td>5:30 PM</td><td>6:00 PM</td><td rowspan=4>Main Task 2 contd</td></tr>
<tr><td>6:00 PM</td><td>6:30 PM</td></tr>
<tr><td>6:30 PM</td><td>7:00 PM</td></tr>
<tr><td>7:00 PM</td><td>7:30 PM</td></tr>
</tbody></table>
!! Small Business Index
Made from publicly available data using four metrics - details in PDF
<embed src='https://drive.google.com/viewerng/viewer?embedded=true&url=https://www.xero.com/content/dam/xero/pdfs/xsbi/xsbi-methodology-doc.pdf' width="100%" height="200">
XGBoost is an open-source software library which provides a gradient boosting framework for C++, Java, [[Python]], R, Julia, Perl, and Scala.
!! Training & Scoring Code
```python
import xgboost as xgb
params = {
'eta' : 0.03,
'max_depth' : 3,
'min_child_weight' : 50,
'objective' : 'binary:logistic',
'num_boost_round' : 200
}
train_dm = xgb.DMatrix(X_train, labels = y_train)
test_dm = xgb.DMatrix(X_test, labels = y_test)
model = xgb.train(params, train_dm, num_boost_round = params['num_boost_round'], early_stopping_rounds=None)
predictions = model.predict(test_dm)
```
!! Go-To Articles
* XGBoost documentation for XGBoost Parameters - https://xgboost.readthedocs.io/en/latest/parameter.html
* [[XGBoost: A Scalable Tree Boosting System|https://arxiv.org/pdf/1603.02754.pdf]] by [[Tianqi Chen]] from [[University of Washington]]
Get variable importance for [[XGBoost]]
```python
def variable_importance(model):
fi = pd.DataFrame(model.get_score(importance_type='total_gain'), index = range(1)).T.reset_index()
fi.columns = ['variable','total_gain']
fi['total_gain'] = np.sqrt(fi.total_gain)
fi['importance'] = fi['total_gain']*100 / fi.total_gain.max()
return fi[['variable','importance']].sort_values('importance', ascending=False)
```
!! Installation
```python
!pip install -q yfinance
```
!! Usage
```python
import yfinance as yf
data = yf.download("SPY AAPL", start="2017-01-01", end="2017-04-30")
```
!! References
* [ext[https://pypi.org/project/yfinance/]]
The goal oriented mindset can create a yo-yo effect. Once the goal is not there, many people revert to their old habits
[[Atomic Habits]] | [[05 April 2022]]
<iframe width="560" height="315" src="https://www.youtube.com/embed/t9c7aheZxls" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[05 December 2021]]
The Yugoslav Wars were a series of separate but related ethnic conflicts, wars of independence, and insurgencies fought in the former Yugoslavia from 1991 to 2001, which led to the breakup of the Yugoslav federation in 1992. The regime systematically murdered approximately 200,000 to 500,000 Serbs
!! [[Lesson 4 : Spark by Udacity]]
While the use of [[Jupyter Notebook]] is common across the industry, you can explore using Zeppelin notebooks. Zeppelin notebooks have been available since EMR 5.x versions, and they have direct access to Spark Context, such as a local spark-shell. For example, if you type `sc`, you’ll be able to get Spark Context within Zeppelin notebooks.
Zeppelin is very similar to Jupyter Notebook, but if you want to use other languages like Scala or SQL, on top of using Python, you can use Zeppelin instead.
using zero as a baseline to allocate budget
[[07 April 2021]]